Код:
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TArrayValues = array of Double;
TSingleArray = array of Single;
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormatWAVE();
procedure FFT(var a : TSingleArray; nn : Integer; InverseFFT : Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
const
n = 4096;
var
Form1: TForm1;
Memo1 : TMemo;
OpenDialog : TOpenDialog;
_PathFile : string;
data : TSingleArray;
FTvl : TArrayValues;
data2 : TSingleArray;
Nvl, Nft : integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog := TOpenDialog.Create(self);
OpenDialog.Filter := 'WAV | *.wav';
if OpenDialog.Execute then
else Exit;
_PathFile := OpenDialog.FileName;
OpenDialog.Free;
end;
procedure TForm1.FormatWAVE();
var
FileWAVE : file;
FileDATA : file;
FileTXT : textfile;
_FileWAVE : TFileStream;
_NC: integer;
i: Integer;
_AllStructurWAVE : array [0..43] of byte;
RIFF : array [0..3] of ansichar;
chunkSize : cardinal;
WAVE : array [0..3] of ansichar;
FMT : array [0..3] of ansichar;
subchunk1Size : integer;
audioFormat : smallint;
numChannels : smallint;
sampleRate : cardinal;
byteRate : cardinal;
blockAlign : smallint;
bitsPerSample : smallint;
subChunk2ld : array [0..3] of ansichar;
subChunk2Size : cardinal;
begin
_FileWAVE := TFileStream.Create(_PathFile, fmOpenRead);
Memo1.Lines.Add('Заголовок WAVE файла');
_FileWAVE.Read(RIFF, length(RIFF));
Memo1.Lines.Add('0-3 байт ' + RIFF);
_FileWAVE.Read(chunkSize, SizeOf(chunkSize));
Memo1.Lines.Add('4-7 байт ' + IntToStr(chunkSize));
_FileWAVE.Read(WAVE, length(WAVE));
Memo1.Lines.Add('8-11 байт ' + WAVE);
_FileWAVE.Read(FMT, length(FMT));
Memo1.Lines.Add('12-15 байт ' + FMT);
_FileWAVE.Read(subchunk1Size, SizeOf(subchunk1Size));
Memo1.Lines.Add('16-19 байт ' + IntToStr(subchunk1Size) + ' - [1 для PCM]');
_FileWAVE.Read(audioFormat, SizeOf(audioFormat));
Memo1.Lines.Add('20-21 байт ' + IntToStr(audioFormat) + ' - [1 для PCM]');
_FileWAVE.Read(numChannels, SizeOf(numChannels));
Memo1.Lines.Add('22-23 байт ' + IntToStr(numChannels) + ' - [Моно = 1, Стерео = 2]');
_FileWAVE.Read(sampleRate, SizeOf(sampleRate));
Memo1.Lines.Add('24-27 байт ' + IntToStr(sampleRate) + ' - [Частота дискретизации]');
_FileWAVE.Read(byteRate, SizeOf(byteRate));
Memo1.Lines.Add('28-31 байт ' + IntToStr(byteRate) + ' - [Количество байт, переданных за секунду воспроизведения.]');
_FileWAVE.Read(blockAlign, SizeOf(blockAlign));
Memo1.Lines.Add('32-33 байт ' + IntToStr(blockAlign) + ' - [Количество байт для одного сэмпла, включая все каналы.]');
_FileWAVE.Read(bitsPerSample, SizeOf(bitsPerSample));
Memo1.Lines.Add('34-35 байт ' + IntToStr(bitsPerSample) + ' - [Количество бит в сэмпле. Так называемая "глубина" или точность звучания.]');
_FileWAVE.Read(subChunk2ld, length(subChunk2ld));
Memo1.Lines.Add('36-39 байт ' + subChunk2ld);
_FileWAVE.Read(subChunk2Size, SizeOf(subChunk2Size));
Memo1.Lines.Add('40-43 байт ' + IntToStr(subChunk2Size) + ' - [Количество байт в области данных.]');
_FileWAVE.Free;
SetLength(data,subChunk2Size);
AssignFile(FileDATA, _PathFile);
Reset(FileDATA,1);
seek(FileDATA,44);
BlockRead(FileDATA,data[0],subChunk2Size,_NC);
CloseFile(FileDATA);
SetLength(data2,n*2);
for i := 0 to n*2-1 do
begin
data2[i]:= data[i];
end;
FFT(data2,n,false);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i : integer;
begin
FormatWAVE();
end;