iphone - 确定 iPhone 上特定频率的大小

标签 iphone audio fft

我想知道确定声音中给定频率的幅度的最简单/最好的方法是什么。

据我了解,FFT 函数将返回信号中所有频率的幅度。我想知道如果我只关心特定频率,是否可以使用任何快捷方式。

我将使用 iPhone 麦克风来录制音频。我的猜测是,我将使用音频队列服务进行录制,因为我不需要将音频录制到文件中。我使用的是 SDK 4.0,因此如果需要,我可以使用 Accelerate 框架中定义的任何函数(例如 FFT 函数)。

更新: 我根据康拉德的建议更新了问题,使其更加清晰。

最佳答案

如果只需要测试一个频率,则只需计算 DFT 对应的点即可。 DFT 算法为 O(N^2),但 FFT 算法重用中间结果以实现 O(NlogN) 来进行 DFT 计算。但是,如果您只需要一个频率样本,则只需计算 DFT 的一个输出样本即可实现 O(N) 性能。

这可以通过查看 wikipedia page 上的 DFT 方程(我什至不打算尝试在此处键入它)并仅计算与感兴趣的频率相对应的单个 k 的 Xk 来完成。 k 只是 DFT 输出的索引。

将 k(DFT 输出的索引)映射到实际频率 (Hz) 取决于两件事:

  • 采样频率(例如,CD 音频为 44100 Hz)
  • FFT 大小

真实频率映射到 k 如下:

F = k*Fs/N  for k = 0 ... N/2-1 ((N-1)/2 for odd N)

k = F*N/Fs  for F = 0Hz ... Fs/2-Fs/N

其中,F 是以 Hz 为单位的频率,N 是 FFT 大小,Fs 是采样频率 (Hz)。需要注意的一些事项:

    k 是一个整数,因此并非所有频率都会映射到整数 k。找到最接近的 k
  • 如果您需要更高的频率分辨率,请增加 N。
  • 以 Fs 采样的信号只能准确表示高达 Fs/2 ( Nyquist rate ) 的频率,但不包括 Fs/2 ( ojit_a )。这就是为什么我表明从 k 到 Hz 的映射仅适用于一半的输出样本。我不会讨论后半部分代表什么(它实际上是真实输入信号的前半部分的镜像)
  • DFT/FFT 的输出很复杂。您很可能想要了解其严重程度。
  • 如果您需要计算甚至几个 DFT 输出,最好仅使用可用的 FFT 函数并获取所有输出样本,而不是使用 DFT 只计算所需的输出样本。原因是大多数 FFT 算法都经过了大量优化,因此即使理论上您可能做的工作较少,但它可能比 FFT 花费更长的时间。您可能只需要对此进行基准测试,看看哪种方法更好。

为了简单起见,我省略了很多其他细节,这些细节对您的应用程序来说并不重要

关于iphone - 确定 iPhone 上特定频率的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2921674/

相关文章:

android - 如何使用谷歌眼镜录制音频?

extract - 如何从倒谱中提取基频?

ios - 如何使用 Alamofire Swift 4 以 JSON 编码传递数据

iphone - 获取强烈捕获对象的 ARC 警告

iphone - 如何使用UIWebView发送邮件?

c++ FFT节拍检测库?

linux - aplay/alsaplayer - 声音不适用于普通用户

iPhone 模拟器 vs iPhone OS 测试 : file is not of required architecture

python - 什么是 numpy.fft.rfft 和 numpy.fft.irfft 及其在 MATLAB 中的等效代码

python - Butter Filter 和 FFT 得出的结果不会随时间变化