我一直在 iphone 上进行简单的频率检测设置。在存在谐波的情况下,使用 FFT 结果在频域中进行分析有些不可靠。我希望使用倒谱结果来帮助确定正在播放的基频。
我正在使用 AudioToolbox 框架中的 AudioQueues,并使用 Accelerate 框架进行傅里叶变换。
我的过程正是 Wikipedia 的倒谱文章中列出的 Real Power Cepstrum 的内容,具体来说:signal → FT → abs() → square → log → FT → abs() → square → power cepstrum。
我遇到的问题是倒谱结果非常嘈杂。我必须删除第一个和最后 20 个值,因为它们与其他值相比是天文数字。即使在“清理”数据之后,仍然存在大量变化 - 远远超出我对第一张图表的预期。有关频域和频域的可视化,请参见下面的图片。 FFT 倒谱
当我在该图上看到频域中如此明显的赢家时,我希望在频域中看到同样清晰的结果。我玩过 A440,预计 bin 82 左右的震级最高。图表上的第三个峰值代表 bin 79,它足够接近。正如我所说,前 20 个左右的 bin 的数量级如此之大,以至于无法使用,我不得不从数据集中删除它们才能看到任何东西。倒谱数据的另一个奇怪质量是偶数仓似乎比奇数仓高得多。以下是 77-86 的频率区间:
77: 151150.0313
78: 22385.92773
79: 298753.1875
80: 56532.72656
81: 114177.4766
82: 31222.88281
83: 4620.785156
84: 13382.5332
85: 83.668259
86: 1205.023193
我的问题是如何清理频域,以使我的倒谱域结果不那么狂野。或者,帮助我更好地理解如何解释这些结果,如果它们符合倒谱分析中的预期。我可以发布我正在使用的代码示例,但它主要使用 vDSP 调用,我不知道这会有多大帮助。