Audio 如何缩放波形文件的FFT输出?

Audio 如何缩放波形文件的FFT输出?,audio,signal-processing,wav,fft,spectrum,Audio,Signal Processing,Wav,Fft,Spectrum,波形文件:44100Hz,16位,双通道 我使用FFT计算输出的每个频率单元的幅度。但我不知道如何缩放它来绘制(实时)光谱 有人能帮我吗?好吧;有很多方法可以做到这一点 例如:如果您想要一个dB刻度,对于每个假想样本,计算 ymag=(x.real^2+x.imag^2) 你只需要穿过一半的阵列,因为你想要的是正频率;第二部分将只是第一部分的重复,将实际数据输入FFT 在结果值中搜索最小值和最大值并存储它们。如果最小值为零,请选择一些非常小的值作为最小值。(0.000001或其他)。然后,将最小

波形文件:44100Hz,16位,双通道

我使用FFT计算输出的每个频率单元的幅度。但我不知道如何缩放它来绘制(实时)光谱


有人能帮我吗?

好吧;有很多方法可以做到这一点

例如:如果您想要一个dB刻度,对于每个假想样本,计算

ymag=(x.real^2+x.imag^2)

你只需要穿过一半的阵列,因为你想要的是正频率;第二部分将只是第一部分的重复,将实际数据输入FFT

在结果值中搜索最小值和最大值并存储它们。如果最小值为零,请选择一些非常小的值作为最小值。(0.000001或其他)。然后,将最小分贝值设置为mindB=10*log10(最小值)

现在,返回的第一个值(示例[0])将是您的DC偏移量,您可能希望将其设置为零

然后,对于每个样本,计算:ydB=10*log10(ymag/最大值)

这将为您提供一个数组,该数组表示每个样本箱的最大dB。你可以根据你的需要来扩展它;如果绘图区域从y=5变为y=200,则可以使用以下内容:

yscaled=((ydB/-mindB)*(200-5)+200)

我还将确保缩放值符合边界,以防出现FP舍入错误

yscaled=最小值(最大值(yscaled,5),200)


我已经有一段时间没有这样做了,所以如果有任何数学错误,我向您道歉。:)

不同的FFT实现具有不同的比例因子,可能不同于N、1/N或1/sqrt(N),其中N是FFT的长度。对于至少一种有符号整数输入FFT,最大刻度大约为sqrt(2)*N*2^(b-1),其中b是小数点左侧的位数(在您的情况下为16位,如果在FFT之前将通道相加为更大的数据类型,则可能为17位)。

许多重复项-例如,上述链接上的刻度法仅转换为db。因为我不知道使用FFT算法后复输出的最大值。我只知道一个实例输出的最大值,但每N毫秒,我就有另一个输出。请帮帮我!我不能计算所有的输出并找到它们的最大值,这太难了。@cobazet我看到了你上面的评论;我想这是你想要的。正如我所记得的,它近似于从-inf dB到0 dB的范围。。。如果这对你不起作用,让我知道,我会进一步研究。在这种情况下,你只需要找到你刚得到的最小值和最大值,而不是整个数据集。(换句话说:如果你使用32768点FFT,你只能找到你正在使用的16384点中的最大值…)虽然,是的,如果有必要有一个0 dB的参考,表示整个数据块的所有实时FFT绝对最大值的0 dB,那么你必须提前知道该点。如果需要,您唯一的选择是提前选择一个值作为最大值,可能是通过试验和找到合适的值。您也可以选择与输入数据最大可能值相关的实际最大可能值,但这可能会在顶部留下大量额外的空间…不;结果应<0;它从最高功率箱计算dB,因此所有值都小于或等于零;这就是为什么缩放使用“-mindB”。。。此外,我还发现了一些关于我过去使用的注释,我们显然使用了0.000000001。因此,在我给出的示例中,您的绘图区域的y=5到y=200,在我们尝试的负无穷dB近似值下,您应该得到5,对于表示0 dB的缩放值,您应该得到200。(我本可以在某个地方不恰当地缩放某些对象,但这就是我的想法。)