我正在看FFTW以获取音频数据样本的频谱。
据我了解,该过程的“计划”选择了N个样本,对应于T秒的时间段。 input[x]
的值是波在时间x*N/T
处的振幅,而output[x]
的复振幅以某种方式与频率相关。
我知道我需要应用窗口函数,但我不知道如何。输入缓冲区是通常由Ni
组成的Ni!=N
个样本的数组,频率为F Hz,这通常与Ti=Ni/F
对应的时间为Ti!=T
秒。
那么,如何在给定N
采样的情况下,将Ni
输入填充到FFT中,并给定N
和F
,对应于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/