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

如何在C语言中使用FFTW从PortAudio样本中提取频率信息,c,audio,fft,fftw,portaudio,C,Audio,Fft,Fftw,Portaudio,我想制作一个程序,使用PortAudio记录音频数据(我已经完成了这一部分),然后显示所记录音频的频率信息(现在,我想显示每组样本的平均频率) 根据我做的一些研究,我知道我需要做一个FFT。所以我在谷歌上搜索了一个用C语言编写的库,找到了FFTW 然而,现在我有点迷路了。我到底应该如何处理我记录的样本,从中提取一些频率信息?我应该使用哪种FFT(我想我需要一个真正的数据1D?) 一旦我做了FFT,我如何从它给我的数据中得到频率信息 编辑:我现在还找到了自相关算法。更好吗?更简单 事先非常感谢,很

我想制作一个程序,使用PortAudio记录音频数据(我已经完成了这一部分),然后显示所记录音频的频率信息(现在,我想显示每组样本的平均频率)

根据我做的一些研究,我知道我需要做一个FFT。所以我在谷歌上搜索了一个用C语言编写的库,找到了FFTW

然而,现在我有点迷路了。我到底应该如何处理我记录的样本,从中提取一些频率信息?我应该使用哪种FFT(我想我需要一个真正的数据1D?)

一旦我做了FFT,我如何从它给我的数据中得到频率信息

编辑:我现在还找到了自相关算法。更好吗?更简单


事先非常感谢,很抱歉,我完全没有这方面的经验。我希望它至少有一点意义。

要将音频样本转换为功率谱:

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

portaudio允许以浮点格式(32位浮点)记录数据。所以我鼓励你使用这个建议。@Iulian:是的,如果你在生成功率谱之前不想在整数域中进行其他预处理,那么这可能是明智的做法。谢谢,再问一个可能很愚蠢的问题。我已经计算了所有内容,但现在让我们假设我想检查信号中是否存在440Hz(中间a)频率。我该怎么做呢?如果采样率Fs=44.1 kHz,FFT大小N=1024,那么频谱的分辨率将是Fs/N=44100/1024=43.1 Hz。换句话说,你的功率谱中的每个“箱子”大约43赫兹宽。因此,440 Hz的分量将主要出现在箱子10中。如果你需要更高的分辨率,那么你必须增加N。