【问题标题】:How to extract frequency information from samples from PortAudio using FFTW in C如何在 C 中使用 FFTW 从 PortAudio 的样本中提取频率信息
【发布时间】:2011-03-04 17:56:51
【问题描述】:

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

根据我所做的一些研究,我知道我需要进行 FFT。因此,我在 C 中搜索了一个库来执行此操作,并找到了 FFTW。

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

一旦我进行 FFT,我如何从它提供给我的数据中获取频率信息?

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

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

【问题讨论】:

    标签: c audio fft fftw portaudio


    【解决方案1】:

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

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

    【讨论】:

    • portaudio 允许以浮点格式(32 位浮点)记录数据。所以我鼓励使用这个建议。
    • @Iulian:是的,这可能是明智的做法,假设您在生成功率谱之前没有想要在整数域中进行的其他预处理。
    • 谢谢,再问一个可能很愚蠢的问题。我已经计算了所有内容,但现在假设我想检查信号中是否存在 440Hz(中间 A)频率。我该怎么做?
    • 如果采样率 Fs = 44.1 kHz,FFT 大小 N = 1024,那么您的频谱分辨率将为 Fs / N = 44100 / 1024 = 43.1 Hz。换句话说,你的功率谱的每个“bin”大约是 43 Hz 宽。因此,440 Hz 分量将主要出现在 bin 10 中。如果您需要更高的分辨率,则必须增加 N。
    猜你喜欢
    • 2010-09-20
    • 2011-12-30
    • 1970-01-01
    • 2017-06-04
    • 2020-12-19
    • 2013-04-01
    • 2011-06-05
    • 1970-01-01
    相关资源
    最近更新 更多