0

C++でフーリエ変換を計算するためにfftw3libを使用しています。毎回異なる入力配列で繰り返し呼び出す必要があります。配列(コードでは「input」と呼ばれます)をサイズMAX_ELEMSで1回だけ初期化し、それを呼び出しごとにfftw_plan関数への入力(内容とサイズの変更)として使用しています。ただし、配列の実際のサイズ(配列内の有効なデータサンプルの数)に応じて、毎回n_samplesを変更しています。これが私の実装に問題を引き起こすかどうかを知りたかった-実行/精度の面で。

fftw_plan fftw_plan_dft_r2c_1d(int n_samples,
                                double *in, fftw_complex *out,
4

1 に答える 1

2

理想的には、次の2つの理由から、特定のサイズのFFTを選択してそれを維持する必要があります。

  • プランの作成/破棄はFFT自体に比べて時間がかかるため、実行するevert FFTのプランを作成/破棄すると、FFTWを使用することによる速度の利点が失われます。
  • 周波数分解能はFFTのサイズごとに異なり、連続する出力データの解釈が面倒になる可能性があります。

理想的には、固定FFTサイズを使用して、プランを1回だけ作成/破棄する必要があります。

データストリームが連続している場合は、適切なFFTサイズNを選択し、処理するサンプルがN個になるまでサンプルをバッファーに蓄積し、残りのサンプルを再びN個になるまで保存します。

データが連続していない場合は、適切なサイズのFFT、Nを選択し、N未満のサンプルを取得したら、入力にゼロを埋め込むことができます。> N個のサンプルを取得すると、余分なサンプルを破棄できます。

もちろん、すべての場合において、FFTの前に適切なウィンドウ関数を適用する必要があります。

于 2012-10-15T14:06:41.987 に答える