波形文件:44100 Hz,16位,双通道。
我使用FFT来计算输出的每个频率区间的幅度。但我不知道将其缩放为绘制(实时)频谱。
任何人都可以帮助我?
答案 0 :(得分:4)
井;有很多方法可以做到这一点......
例如:如果你想要一个dB刻度,对于每个虚数样本,计算
ymag =(x.real ^ 2 + x.imag ^ 2)
你只想要通过一半数组,因为你想要正频率;下半部分只是重复第一部分,实际数据输入FFT。
在结果值中搜索最小值和最大值并存储它们。如果您的最小值为零,请选择一些非常小的值作为最小值。 (0.000001或其他)。然后,将最小dB值设置为mindB = 10 * log10(最小值)。
现在,返回的第一个值(sample [0])将是您的DC偏移,您可能希望将其设置为零。
然后,对于每个样本,计算:ydB = 10 * log10(ymag / maximum)。
这应该为您提供一个数组,表示从每个样本箱的最大值开始的dB。你可以把它扩展到你需要的任何东西;如果你的情节区域从y = 5到y = 200,你可以使用类似的东西:
yscaled =((ydB / -mindB)*(200 - 5)+ 200)
我还会确保在存在FP舍入错误的情况下,缩放值适合边界。
yscaled = min(max(yscaled,5),200)
自从我这样做已经有一段时间了,所以如果有任何数学错误我会道歉。 :)答案 1 :(得分:1)
不同的FFT实现具有不同的比例因子,可能相差N,1 / N或1 / sqrt(N),其中N是FFT的长度。对于至少一种有符号整数输入FFT,最大比例大约为sqrt(2)* N * 2 ^(b-1),其中b是小数点左边的位数(在你的情况下是16,如果在FFT之前将通道加总为更大的数据类型,则可能为17。