我正在看FFTW以获取音频数据样本的频谱。

据我了解,该过程的“计划”选择了N个样本,对应于T秒的时间段。 input[x]的值是波在时间x*N/T处的振幅,而output[x]的复振幅以某种方式与频率相关。

我知道我需要应用窗口函数,但我不知道如何。输入缓冲区是通常由Ni组成的Ni!=N个样本的数组,频率为F Hz,这通常与Ti=Ni/F对应的时间为Ti!=T秒。

那么,如何在给定N采样的情况下,将Ni输入填充到FFT中,并给定NF,对应于output[x]的频率是多少?

最佳答案

关于这个问题,已经有很多很好的问题和答案,但是有一些一般性的提示:


您样品的光谱通常会随时间变化
您通常选择一个窗口大小(== FFT大小),频谱中的短期变化很小,例如10毫秒(频率分辨率要求可能会影响此选择),因此如果您的采样率为44.1 kHz,那么您可以选择FFT大小为4096。
通常使用连续的窗口来处理总样本(即样本块-这些样本通常重叠,例如重叠50%),因此实际上您会得到一系列随时间变化的光谱
从频谱获取频率信息由this excellent SO answer覆盖
您需要在计算FFT之前对每个连续的采样块应用window function
FFT的输入将是实值(来自您的样本块)-如果您使用常规的复数到复数FFT,则将输入的虚部设置为0
FFT的输出将是包含幅度和相位信息的复数值-对于实际输入,输出是(共轭)对称的,因此实际上只有前N / 2个输出仓有用
要从输出仓获得dB幅度值,请使用mag_dB = 10 * log10(re*re + im*im)
您可以将输出频谱的序列绘制为spectrogram,使用颜色表示dB幅度,并使用频率和样本块索引(==时间)作为两个轴


也可以看看:


How to generate the audio spectrum using fft in C++?
How to extract semi-precise frequencies from a WAV file using Fourier Transforms
How to get frequency from fft result?
How to extract frequency information from samples from PortAudio using FFTW in C

关于c - 采样率和可变长度输入采样与固定大小的FFT输入有何关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23607710/

10-13 08:48