1

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;
4

3 に答える 3

6

のためにi:=0...

(wavedata[0].Data[(i*2)-1]

あなたは本当に配列要素を持っていますData[-1]か?

PS デバッグ中に範囲チェック コンパイラ オプションを設定します。

編集:新しいコードがいくつかあるので、ステップ2に進みましょう:

SetLength(wavedata[0].Data, **numsamples**);

for i:=1 to **numsamples**-1

wavedata[0].Data[(**i*2)**]

コードのすべての行を徹底的にチェックする必要がありますか?

于 2013-04-24T09:45:13.333 に答える
4

オーバーフローは、式が評価されるデータ型の範囲に収まらない値が式から得られる場合に発生します。オーバーフローは、正の数と負の数で発生する可能性があります。

入力値がすでに浮動小数点値のオーバーフローに近づいている場合にのみ、特定の式でオーバーフローが発生します。したがって、たとえば倍精度値を使用している場合、入力データの大きさが約 1e308 の場合にのみ、コードがオーバーフローする可能性があります。

入力データが実際にその形式である可能性は低いようです。したがって、問題は入力データの読み取り方法に関連していると思います。あなたはそれを間違って読んでいるので、無意味な値に対して算術演算を実行してしまうのではないかと思います。

于 2013-04-24T06:34:20.397 に答える