我一直在iphone上进行简单的频率检测设置。在存在谐波的情况下,使用FFT结果在频域中进行分析有些不可靠。我希望使用倒谱结果来帮助确定正在播放的基本频率。
我正在使用AudioToolbox框架中的AudioQueues,并使用Accelerate框架进行傅里叶变换。
我的过程正是维基百科的Cepstrum文章中列出的Real Power Cepstrum,特别是:信号→FT→abs()→square→log→FT→abs()→square→power cepstrum。
我遇到的问题是倒谱结果非常嘈杂。我必须删除第一个和最后20个值,因为它们与其他值相比是天文数字。即使在“清理”数据之后,仍然存在大量的变化 - 远远超过我对第一张图的预期。有关频域和quefrency域的可视化,请参见下面的图片。 FFT Cepstrum
当我在频域中看到如此明显的赢家时,我希望在quefrency域中看到类似的清晰结果。我玩了A440,并希望bin 82左右的音量最高。图表上的第三个峰值代表bin 79,它足够接近。正如我所说,前20个左右的箱子在数量上是如此天文数字以至于不可用,我不得不从数据集中删除它们以便看到任何东西。倒谱数据的另一个奇怪的质量是偶数箱似乎远远高于奇数箱。以下是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
我的问题是如何清理频域,以便我的Cepstrum域结果不那么疯狂。或者,帮助我更好地理解如何解释这些结果,如果它们正如人们在倒谱分析中所期望的那样。我可以发布我正在使用的代码的示例,但它主要使用vDSP调用,我不知道它会有多大帮助。
答案 0 :(得分:3)
由于倒谱通常在没有任何(非矩形)窗口的情况下完成,因此即使对于干净的泛音序列也可以产生Sinc响应,响应的宽度与泛音序列的长度或数字大致成反比。泛音。而且,当然,任何略带不和谐的泛音(如实际乐器中所见)都会使倒谱效果更加混乱。因此,倒谱峰值可能只能给出一个基频的近似位置,这在进行频率估计时可能仍然是拒绝其他候选频率的有用结果。
“看起来很干净”的倒谱可能是一系列精确谐波泛音的结果,其频率响应几乎是平坦的,这可能不是现实生活中的信号。
答案 1 :(得分:2)
以下分析说明了倒谱在合成和现实世界信号上的表现。
首先,我们检查一个合成信号。
下图显示了合成稳态E2音符,使用典型的近DC分量合成,基频为82.4 Hz,总共8个谐波,整数倍为82.4 Hz。对合成正弦曲线进行编程以生成4096个样本。
下图显示了用于合成E2音符的倒谱计算的输入特写。它是合成E2音符的log(| FFT | ^ 2)输出。
下图显示了合成E2音符的倒谱。观察12.36处突出的非DC峰值。倒谱宽度为1024(第二个FFT的输出),因此峰值对应于1024 / 12.36 = 82.8 Hz,非常接近基波的实际82.4 Hz。
现在我们检查现实世界的信号。
下图显示了真正的原声吉他的E2音符的光谱。
下图显示了用于声学吉他E2音符的倒谱计算的输入特写。它是原声吉他E2音符的日志(| FFT | ^ 2)输出。
下图显示了原声吉他E2音符的倒谱。观察突出的非DC峰值542.8。倒谱宽度为32768(第二个FFT的输出),因此峰值对应于32768 / 542.8 = 60.4 Hz,这与基波的实际82.4 Hz相当。
用于此分析的E2吉他音符的录音在工作室条件下使用高质量麦克风以44.1 KHz采样,它基本上包含零背景噪音,而没有其他乐器或声音。
这说明了使用倒谱分析在真实世界音频信号中进行音高确定的重大挑战。
参考文献:
真实的音频信号数据,合成信号生成,绘图,FFT和倒谱分析在这里完成:Musical instrument cepstrum
答案 2 :(得分:1)
如果我理解的话,主要问题是从音频信号中检测频率。
当然,你的意思是频谱中最强的频率,所以我建议使用 这个优秀的图书馆http://www.schmittmachine.com/dywapitchtrack.html
“算法的核心是一个非常强大的小波算法,在Eric Larson和Ross Maddox的论文中描述:”使用小波的实时时域音高跟踪“。
希望这个帮助