比较不完整的声音文件

时间:2011-11-03 16:35:15

标签: iphone objective-c compare fft

我正在为iPhone开发一个程序。

我已阅读此article,我有一些问题。在获得声音文件的幅度后,我需要将哪个频谱范围转换为FFT(快速傅立叶变换)?在文章中,男人说“40-80,80-120,120-180,180-300”,他怎么知道哪个范围?在我得到FFT(使用OouraFFT)后,我有频谱,那么据我所知,必须采取控制点,那么如何采用它们?

我还有一些问题,但请帮助我解决这些问题。

1 个答案:

答案 0 :(得分:1)

  

在文章中男人说“40-80,80-120,120-180,180-300”,他怎么知道哪个范围?

他不认识他们 - 他做了他们。

这些范围的频率非常低。低频声音往往具有最长的延音/衰减,因此通过使用较低的频率,您不太可能出现时间混叠问题。这对于您要实施的应用程序非常重要。声音随时间变化,输入样本可以在歌曲/声音的任何给定偏移处,并且很可能不会与您的窗口偏移完全匹配。声音的低频部分仍然容易受此影响,但远低于高频部分。

  

在我获得FFT(使用OouraFFT)后,我有频谱,然后据我所知必须采取控制点,那么如何采用它们?

OouraFFT是用C语言编写的,而不是Objective-C。你能链接到你正在使用的包装器吗?

如果您正在使用this wrapper,那么我认为您需要事先对数据进行低通过滤,并且可能修改/另外处理库的结果以完全按照您的要求进行操作'试图完成。或者找到一个不同的iPhone FFT库,在FFT之上包含更多高级概念。

该库调用OouraFFT rdst,并且这样做是为了使所有桶均匀分布(几乎只是原始FFT数据,没有更高级别的概念用螺栓固定)。除非你使用较小的存储桶并将它们聚合在一起,否则你不会得到你所阅读文章中描述的那些特定存储桶。

您可以尝试简单地使用不同的均匀间隔的铲斗选择,最后使用40-80, 80-120, 120-160, 160-200, 200-240, 240-280, 280-320之类的东西。或者您可以使用40-60, 60-80等,并在完成后合并/平均存储桶。

要获得所需的铲斗尺寸,您需要做一些数学运算。从该图书馆的自述文件中可以看出:

  

假设您的信号的采样率为48,000 Hz,并且您正在计算信号块的FFT长度为1024个样本。然后,OouraFFT.spectrumData中有1024/2 = 512个频率,均匀间隔0到48,000 / 2 = 24,000。

窗口越长,存储桶数量越多,但您出现临时问题的可能性就越大。因此,选择您的窗口大小,然后对输入数据进行低通滤波并降低采样率,以便获得适合您需要的存储桶大小(频率范围),并运行过滤后的数据。

顺便说一下,我不确定这个实现,但是I read here that you have to throw out the lowest frequency bucket when using FFT。本文有类似的通知,说the lowest bucket has only half the width

如果您真的希望从此项目中获得准确的结果,我建议您生成具有这些特定频率和窗口期的测试数据,以便您可以验证阵列数据是否正确填充,并且您的数据不是意外地变得倾斜(逐个错误,窗口和过滤器计算不正确等)。否则你的成功将是纯粹的运气和摆弄,因为你将无法诊断代码中的任何问题所在。