1

我的应用程序对原始音频信号执行 FFT(所有麦克风读数都是 16 位整数值values,即 1024 个单元格)。它首先根据 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 信号来查看 的值时magnitude,当没有 400Hz 信号时它在 0 左右,当有时上升到 30 或 40。

字段的单位或含义是magnitude什么?令我惊讶的是它大于 1,即使我将原始信号标准化为介于 -1..+1 之间。

4

1 回答 1

3

这取决于您使用的是哪种 FFT,因为缩放有不同的约定。最常见的约定是输出值按 N 缩放,其中 N 是 FFT 的大小。因此,1024 点 FFT 的输出值将是相应输入值的 1024 倍。更复杂的情况是,对于实数到复数的 FFT,人们通常会忽略 FFT 的对称上半部分,这很好(因为它是共轭对称的),但如果这样做,则需要考虑 2 倍。

FFT 缩放的其他常见约定是 (a) 无缩放(即 N 的因子已被删除)和 (b) sqrt(N),有时用于 FFT 与 IFFT 的对称缩放行为(每个中的 sqrt(N)方向)。

由于 sqrt(1024) == 32 您可能正在使用具有 sqrt(N) 缩放的 FFT 例程,因为对于单位幅度正弦波输入,您似乎看到了大约 30 的值。

于 2013-07-26T13:30:11.340 回答