采样率和可变长度输入样本如何与固定大小的FFT输入相关?

时间:2014-05-12 11:25:31

标签: c signal-processing fft fftw dft

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

据我了解,"计划"对于该过程,选择N个样本,其对应于T秒的时间段。 input[x]的值是时间x*N/T处波的幅度,output[x]的复振幅与频率有某种关系。

我知道我需要应用窗口功能,但我不知道如何操作。输入缓冲区是Ni个样本的数组,通常为Ni!=N,并且以F Hz的速率,这对应于Ti=Ni/F秒的时间,Ti!=T一般

那么如何将N输入填充到给定Ni样本的FFT,并且给定NF,{{1}对应的频率是多少? }}?

1 个答案:

答案 0 :(得分:1)

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

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

另见: