3

Ooura の FFT を使用してホワイト ノイズを分析しています (ノイズの 44100 サンプルで持続時間 75368 smp)。私が持っている結果は非常に奇妙です: サンプル数で割っても、1.0 未満です。

私はRDFTと逆RDFTを使用しています

実際には、次のようなマグニチュードの結果があります。

m1 3.47157
m1 8.50726
m1 29.0233
m1 9.64618
m1 43.2969
m1 60.7396
m1 48.3495
m1 35.8336
m1 32.7611
m1 24.1925
m1 26.8244
m1 17.9448
m1 29.7936
m1 23.1585
m1 15.1243
m1 8.89132
m1 14.6676
m1 18.1515
m1 27.5357
m1 5.6661
m1 19.0589

FFT サイズは 4096 で、ピークは 79.119 です。

私は結果が1つの数値に近いことを望んでいました(1.0など)

そして、単純な乗算(ボリュームなど)をマグニチュードに適用すると、サウンドは奇妙なフィルターのように変更されます...

re/im から大きさ/位相に変換するために使用する関数は次のとおりです。

double SuperFFT::_GetPhase(double real, double imaginary)
 {
      return atan2(imaginary, real);
 }

 double SuperFFT::_GetMagnitude(double real, double imaginary)
 {
    return sqrt((real * real) + (imaginary * imaginary));
 } 

フェーズは良さそうです (-PI と PI の間に留まります)

240hz (期間 75368 サンプル) で単純な正弦波を渡すと、これらの大きさになります。

m1 0.262643
m1 0.369384
m1 0.543982
m1 0.851133
m1 1.44518
m1 2.76168
m1 6.37861
m1 21.2081
m1 239.998
m1 775.211
m1 585.819
m1 63.0807
m1 12.06
m1 4.37815
m1 2.07803
m1 1.14897
m1 0.701917
m1 0.460003
m1 0.317885
m1 0.228747

これは持続時間で割り、100 を掛けると 1 に近くなります。これは正常ですか?

マグニチュードを乗算すると音が途切れるのはなぜですか? FFT が壊れているか、何か不足していますか?

助けてくれてありがとう

編集:もちろんOLAを使用します

ジェフ

4

1 に答える 1

2

通常、FFT の実装ではスケーリングが無視され、FFT 中に値の「自然な」乗算が発生することがあります。これは、スケーリングが重要ではないことが多いため (たとえば、計算した位相はスケーリングによって変化せず、信号の特定の側面間の関係はスケーリングに依存しない)、スケーリングをすべて一度に調整する方が効率的である可能性があるためです。個々の FFT、逆 FFT、およびその他の操作ではなく、操作の 1 つのポイント。

入力配列を最初の要素で 1 に設定し、他のすべての要素で 0 に設定し、FFT を実行して結果を調べることにより、使用している FFT によって引き起こされるスケーリングを見つけることができます。ほとんどの場合、各出力要素の実部には 1 が含まれます。この場合、入力の総「エネルギー」に N を掛けます。ここで、N は入力要素の数です。

(実数から複素数への変換を行っているように見えるので、ここには微妙な点があります。N 実数入力は N 複素数出力を生成します。ただし、それらは対称です。そのうちの 2 つについて、要素はそれ自体の複素共役です。残りの N-2 については, それらの半分は残りの半分の共役です. このため, ほとんどの FFT 実装は 2 つの実数要素と N/2-1 複素数要素のみを返します. 残りの結果は暗示されます:欠落している 2 つの虚数成分はゼロであり、欠落している N/2-1 複素要素は、返された要素の共役です. 信号の総エネルギーを計算するとき、明示的なものだけでなく、N 個の結果すべてから計算されたエネルギーを意味します.戻ってきた。)

1 つの出力要素が持つことができる最大の大きさは、すべての入力の合計エネルギーです。これは、入力が完全な正弦波 (任意の位相) である場合に発生します。そのエネルギーはすべて 1 つの周波数にあり、他の周波数にはありません。

したがって、出力要素の最大値を計算するには、入力の最大エネルギーに FFT のスケーリングを掛けます。次に、出力の大きさが 1 を超えないように出力を正規化するには、その積の逆数を掛けます。

于 2013-08-09T18:55:31.633 に答える