1

values私のアプリケーションは、生のオーディオ信号に対して FFT を実行します (すべてのマイクの読み取り値は、1024 セルの16 ビット整数値です)。最初に、16 ビットに従って読み取り値を正規化します。次に、周波数 400Hz の大きさを抽出します。

int sample_rate = 22050;
int values[1024];
// omitted: code to read 16bit audio samples into values array

double doublevalues[1024];
for (int i = 0; i < 1024; i++) {
    doublevalues[i] = (double)values[i] / 32768.0; // 16bit
}

fft(doublevalues); // inplace FFT, returns only real coefficients

double magnitude = 400.0 / sample_rate * 2048;
printf("magnitude of 400Hz: %f", magnitude);

これを試して 400Hz 信号を生成して の値を確認すると、magnitude400Hz 信号がない場合は 0 付近で、ある場合は 30 または 40 になります。

magnitudeフィールドの単位または意味は何ですか? 生の信号を -1..+1 の間に正規化したにもかかわらず、1 より大きいことに驚きました。

4

1 に答える 1

3

スケーリングにはさまざまな規則があるため、使用している FFT によって異なります。最も一般的な規則は、出力値が N でスケーリングされることです。ここで、N は FFT のサイズです。したがって、1024 ポイントの FFT の出力値は、対応する入力値の 1024 倍になります。さらに複雑なのは、実数から複素数への FFT では、通常、FFT の対称的な上半分を無視することです (共役対称であるため)。

FFT スケーリングのその他の一般的な規則は、(a) スケーリングなし (つまり、N の係数が削除されている)、および (b) FFT 対 IFFT の対称スケーリング動作に使用されることがある sqrt(N) (それぞれの sqrt(N)方向)。

sqrt(1024) == 32 であるため、sqrt(N) スケーリングで FFT ルーチンを使用している可能性があります。これは、単位振幅の正弦波入力に対して約 30 の値が表示されているように見えるためです。

于 2013-07-26T13:30:11.340 に答える