-1

wav ファイルとその値を読み取ることができます。ピークとピットの位置とその値を見つける必要があります。初めて、(i-1 + i + i +1) / 3数式で平滑化してから配列をarray[i-1] > array[i] & direction == 'up' --> pitsスタイル ソリューションとして検索しようとしましたが、ノイズやプロジェクトの将来の計算のその他の理由により、より良い作業領域を見つけようとしています。数日以来、私はFFTを研究しています。私の理解では、fft はオーディオ ファイルを一連のサインとコサインに変換します。fft 操作の後、指定された値は、この図のようにa0とです。a1a0 + ak * cos(k*x) + bk * sin(k*x) which k++ and x++

http://zone.ni.com/images/reference/en-XX/help/371361E-01/loc_eps_sigadd3freqcomp.gif

私の質問は、fft はオーディオのピークとピットを見つけるのに役立ちますか? この種の問題の経験がある人はいますか?

4

3 に答える 3

0

あなたがする必要があるのは dy/dx を取得することです。これは、波をスキャンし、現在の値から前の値を差し引いて、ゼロになる場所または正から負に変化する場所を調べるだけで、おおよその値を得ることができます。

このコードでは、簡潔にするために非常に簡潔で知的なものではありません。もちろん、dy が 0 の場合をより適切に処理したり、平らなピークの長いセクションの「中心」を見つけたりすることもできます。しかし、基本的な山と谷だけが必要な場合は、これで見つけることができます。

lastY=0;

bool goingup=true;

for( i=0; i < wave.length; i++ ) {
    y = wave[i];
    dy = y - lastY;

    bool stillgoingup = (dy>0);

    if( goingup != direction ) {
       // changed direction - note value of i(place) and 'y'(height)
       stillgoingup = goingup;
    }
 }
于 2012-12-01T21:03:05.433 に答える
0

それは、あなたが何をしようとしているのかによって異なりますが、実際には明確にしていません。「山と谷を見つける」ことは一つのことですが、これを行うにはさまざまな理由があるため、さまざまな方法が考えられます。極大値と極小値を実際に探す簡単なことはすでに試したようですね。いくつかのヒントを次に示します。

  1. FFT は必要ありません。
  2. オーディオ データは通常、0 の上下にスイングします (符号なしの 8 ビット wav などの例外がありますが、これらは例外です)。そのため、正と負の値に注意する必要があります。ただし、通常、大きな正の値と大きな負の値は大量のエネルギーを運ぶため、それらを同じものとしてカウントする必要があります。
  3. #2により、平均したい場合は、絶対値の平均、またはより一般的には2乗の平均を取得することをお勧めします. 二乗の平均を見つけたら、その値の平方根をとります。これにより、信号のパワーに関連するRMSが得られます。したがって、信号のラウドネス、強度、またはアナログメーターに近い。絶対値の平均は、極端な値に対してより堅牢である可能性がありますが、あまり一般的ではありません。
  4. 別のアプローチは、いくつかのサンプルで絶対値のピークを単純に探すことです。これは、波形を描画するとき、およびデジタル「ピーク」メーターで一般的に行われます。最小絶対値を見るのはあまり意味がありません。
  5. 上記のようなことをしたら、信号をdBで表示するために見つけた値の対数を計算したいかもしれませんが、正しい式を使用していることを確認してください. 10 * log_10(振幅)じゃないです。経験則: 通常、振幅からログを計算する場合、10 ではなく 20 が表示されます。dBFS (クリッピング前の「ヘッドルーム」の量。デジタル メーターの標準測定値) を計算する場合、式は次のとおりです。 20 * log_10( |amplitude| )、ここで振幅は +/- 1 に正規化されます。dB で無限のヘッドルームを与える振幅 = 0 に注意してください。
于 2012-07-03T16:35:58.997 に答える
0

私があなたを正しく理解していれば、特定の時点でのオーディオ デジタル サンプルの相対的なラウドネス/クワイエットネスを推定したいだけです。

この推定では、FFT を使用する必要はありません。ただし、信号を平均化する方法では、適切な画像も生成されません。

デジタル信号は、特定の瞬間におけるオーディオ波の値です。その時点での信号の全体的な振幅を見つける必要があります。計算したい瞬間の前後の特定の間隔の局所最大値として見ることができます。信号の移動最大値があり、振幅推定値が得られる場合があります。

16 ビットのサウンド サンプルでは、​​サウンド信号値は 0 から 32767 までの範囲になります。44.1 kHz のサンプル レートでは、特定の t モーメントの周囲で 441 サンプルの最大値を見つけることにより、約 0.01 秒のピークとピットを見つけることができます。

max=1;
for (i=0; i<441; i++) if (array[t*44100+i]>max) max=array[t*44100+i];

次に、それを 0 から 1 のスケールで表すために (最小値の 1 を使用したため、実際には 0 ではありません)

amplitude = max / 32767;

または、相対的な dB 対数スケールで表すこともできます (ここで、最小値に 1 を使用した理由がわかります)

dB = 20 * log10(amplitude);
于 2012-07-03T15:45:47.523 に答える