采样率和可变长度输入样本与固定大小的 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 中,并且在给定NF 的情况下,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 输入有何关系?的主要内容,如果未能解决你的问题,请参考以下文章

Java频率分析性能

FFT 的窗口大小与数据长度

采样间隔和采样点大小的关系

信号频率、采样频率、采样点数

相同比特率和相同长度的 MP3 文件大小不同

更改块大小会导致 FFT 分析失败