5

フーリエ変換についての私の限られた理解は、元のデータを変更せずに時間領域と周波数領域を切り替えることができるはずだということです。だから、これが私(私が思う)がしていることの要約です:

  1. kiss_fft_next_fast_size(994)1000を使用する必要があることを決定するために使用します。

  2. を使用してkiss_fft_cfgkiss_fft_alloc(...)作成します。nfft = 1000

  3. 余分なポイントをゼロとしてパディングすることにより、入力データをサイズ994から1000に拡張します。

  4. 入力配列と出力配列とともに kiss_fft_cfgをに渡します。kiss_fft(...)

  5. を使用して逆kiss_fft_cfgkiss_fft_alloc(...)作成します。nfft = 1000

  6. 逆のkiss_fft_cfgを渡してkiss_fft(...)、前の出力配列を入力します。

  7. 元のデータが戻ってくることを期待していますが、各データを正確に1000倍大きくしています!

ここに完全な例を示しました。50行のコードが最後にあります。OPTIMAL_SIZE各結果を(つまり1000)の値で割ることでこれを回避できますが、その修正により、理由がわからずに非常に不安になります。

私が間違っている単純な愚かなことを教えてください。

4

1 に答える 1

14

これは予想されることです。逆離散フーリエ変換(高速フーリエ変換を使用して実装できます)には、1/Nによる除算が必要です。

DFTとIDFT(ここでは1と1 / N)を乗算する正規化係数と指数の符号は単なる慣例であり、一部の処理では異なります。これらの規則の唯一の要件は、DFTとIDFTが反対符号の指数を持ち、それらの正規化係数の積が1/Nであることです。DFTとIDFTの両方の\sqrt{1 / N}を正規化すると、変換がユニタリになります。これには、いくつかの理論上の利点があります。ただし、数値計算では、上記のように一度にスケーリングを実行する方が実用的であることがよくあります(単位スケーリングは他の方法でも便利です)。

http://en.wikipedia.org/wiki/Dft

于 2012-08-20T11:48:28.557 に答える