我的应用程序对原始音频信号执行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。
答案 0 :(得分: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。