HAAR 式を使用して .wav サンプル データ値をフィルタリングしようとしていますが、「浮動小数点オーバーフロー」というエラーが発生しました。
編集済み:コードを追加
numsamples := round(wavehdr.SampleRate);
SetLength(wavedata[0].Data, numsamples);
Stream.Read(wavedata[0].Data[0], numsamples);
SetLength(cA1, numsamples);
SetLength(cD1, numsamples);
for i:=1 to numsamples-1 do begin
cA1[i]:=(wavedata[0].Data[(i*2)-1]*0.7071) + (wavedata[0].Data[(i*2)]*0.7071);
cD1[i]:=(wavedata[0].Data[(i*2)-1]*0.7071) + (wavedata[0].Data[(i*2)]*-0.7071);
end;
ここで、wavedata[0].Data[i]、関数 Stream.Read から取得して、.wav ファイルのサンプル データ値を読み込みます。エラーが発生した理由やエラーの意味がわかりません。主にゼロ除算が原因のエラーを検索していますが、コードにゼロ除算はありません。だから多分私はここで私のコードでエラーが何を意味するのを助けることができますか?
EDIT 1:(私は本当にデルファイに慣れていません。このコードは私のものではありません。インターネットで見つけました。私の理解では、次のコードは.wavファイルのサンプルデータ値を読み取るためのものです)
type
TWaveHeader = packed record
Marker_RIFF: array [0..3] of char;
ChunkSize: cardinal;
Marker_WAVE: array [0..3] of char;
Marker_fmt: array [0..3] of char;
SubChunkSize: cardinal;
FormatTag: word;
{ nChannels : 1 mono, 2 stereo }
NumChannels: word;
SampleRate: longint;
BytesPerSecond: longint;
BytesPerSample: word;
BitsPerSample: word;
Marker_data: array [0..3] of char;
DataBytes: longint;
end;
TChannel = record
Data : array of double;
end;
そして私的な宣言:
private
wavehdr:TWaveHeader;
関数 :
FillChar(wavehdr, sizeof(wavehdr),0);
Stream.Read(wavehdr,sizeof(wavehdr));
サンプル データの読み取り中に null 値を処理するようにコードを少し変更しました。
if(IsNan(wavedata[0].Data[(i*2)-1])) then begin
wavedata[0].Data[(i*2)-1]:=0;
end
else if(IsNan(wavedata[0].Data[(i*2)])) then begin
wavedata[0].Data[(i*2)]:=0;
end;