如何在C语言中使用FFTW从PortAudio的样本中提取频率信息

18

我想制作一个程序,使用PortAudio记录音频数据(我已完成此部分),然后显示该记录音频的频率信息(目前,我想显示每个样本组的平均频率)。

通过一些研究,我知道我需要进行FFT。所以我在C中搜索了一个库来进行FFTW。

但是,现在我有点迷茫。我应该如何处理记录的样本以从中提取一些频率信息?我应该使用什么样的FFT(我假设我需要一个实数数据1D?)

一旦我做了FFT,我该如何从给出的数据中获取频率信息?

编辑:我现在也发现了自相关算法。它更好吗?更简单吗?

非常感谢您的帮助,对不起,我完全没有经验。我希望它至少有点意义。

1个回答

20

将你的音频样本转换成功率谱:

  • 如果你的音频数据是整数数据,则将其转换为浮点数
  • 选择一个FFT大小(例如N=1024)
  • 对你的数据的N个样本应用窗口函数(例如汉宁窗
  • 使用大小为N的实际到复杂的FFT生成频域数据
  • 计算你的复杂频域数据的幅度值(magnitude = sqrt(re^2 + im^2)
  • 可选择将幅度值转换为对数刻度(dB)(magnitude_dB = 20*log10(magnitude)

1
portaudio允许以浮点格式(32位浮点数)记录数据。因此,我鼓励使用这个建议。 - INS
@Iulian:是的,假设您在生成功率谱之前没有其他整数域中要进行的预处理,那么这可能是明智的选择。 - Paul R
1
谢谢,只有一个问题,可能很愚蠢。我已经计算了一切,但现在假设我想检查信号中是否存在440Hz(中音A)频率。我该怎么做? - houbysoft
5
如果采样率为44.1 kHz,FFT尺寸为1024,则您的频谱分辨率将为Fs / N = 44100/1024 = 43.1 Hz。换句话说,您功率谱中的每个“bin”约为43 Hz宽。因此,440 Hz分量大部分会显示在第10个bin中。如果您需要更高的分辨率,则必须增加N。 - Paul R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接