2011-11-03 54 views
0

我正在开发针对iPhone的程序。比较不相同的声音文件

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

我有几个问题,但请帮我这些问题。

回答

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,000Hz,并且您正在计算1024个采样长度的信号块。然后,OouraFFT.spectrumData有1024/2 = 512个频率,均匀分布在0到48,000/2 = 24,000之间。

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

BTW,我不知道这一点的实现,但I read here that you have to throw out the lowest frequency bucket when using FFT。本文有类似的通知,说the lowest bucket has only half the width

如果你真的想从这个项目中获得准确的结果,我建议你用这些特定的频率和窗口周期生成测试数据,这样你就可以验证你的数组数据是否正确填充,不小心发生倾斜(逐个错误,窗口和过滤器计算不正确等)。否则,你的成功将是纯粹的运气和摆弄,因为你将无法诊断代码中的任何问题所在。