【问题标题】:How do sample rate and variable-length input samples relate to fixed-size FFT inputs?采样率和可变长度输入样本与固定大小的 FFT 输入有何关系?
【发布时间】: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] 对应的频率是多少?

【问题讨论】:

  • 已经有很多关于这个主题的好问题和答案了。
  • 信不信由你,我已经看过了。我没有找到关于样本长度如何与计划大小相关的解释。
  • 好的 - 将一些要点放在下面的答案中......

标签: c signal-processing fft fftw dft


【解决方案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 幅度,以频率和样本块索引(== 时间)作为两个轴

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 2019-05-31
    • 1970-01-01
    • 2016-01-15
    • 2021-07-31
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    相关资源
    最近更新 更多