采样率和可变长度输入样本与固定大小的 FFT 输入有何关系?
Posted
技术标签:
【中文标题】采样率和可变长度输入样本与固定大小的 FFT 输入有何关系?【英文标题】:How do sample rate and variable-length input samples relate to fixed-size FFT inputs? 【发布时间】:2014-05-12 11:25:30 【问题描述】:我正在查看 FFTW 以获得音频数据样本的频谱。
据我了解,该过程的“计划”选择了 N 个样本,这些样本对应于 T 秒的时间段。 input[x]
的值是在时间x*N/T
的波的幅度,output[x]
的复幅度与频率有某种关系。
我知道我需要应用一个窗口函数,但我不知道如何。输入缓冲区是一个Ni
样本数组,一般为Ni!=N
,频率为F Hz,这对应于Ti=Ni/F
秒的时间,一般为Ti!=T
。
那么,在给定Ni
样本的情况下,我如何将N
输入填充到FFT 中,并且在给定N
和F
的情况下,output[x]
对应的频率是多少?
【问题讨论】:
已经有很多关于这个主题的好问题和答案了。 信不信由你,我已经看过了。我没有找到关于样本长度如何与计划大小相关的解释。 好的 - 将一些要点放在下面的答案中...... 【参考方案1】:在 SO 上已经有很多关于这个主题的好问题和答案,但有一些一般性的提示:
您的样品光谱通常会随时间变化 您通常会选择一个窗口大小(== FFT 大小),其中频谱的短期变化很小,例如10 ms(频率分辨率要求可能会影响此选择),因此如果您的采样率是例如44.1 kHz,那么您可以选择 4096 的 FFT 大小。 通常使用连续窗口处理总样本(即样本块 - 这些通常重叠,例如 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【讨论】:
以上是关于采样率和可变长度输入样本与固定大小的 FFT 输入有何关系?的主要内容,如果未能解决你的问题,请参考以下文章