FFT的返回值(系数)的单位是多少



我的应用程序对原始音频信号执行FFT(所有麦克风读数都是values中的16位整数值,即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,这让我感到惊讶。

这取决于您使用的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。

最新更新