【问题标题】:Cleaning up noisy Cepstrum results清理嘈杂的倒谱结果
【发布时间】:2011-07-14 04:01:27
【问题描述】:

我一直在 iphone 上进行简单的频率检测设置。在存在谐波的情况下,使用 FFT 结果在频域中进行分析有些不可靠。我希望使用倒谱结果来帮助确定播放的基频。

我正在使用 AudioToolbox 框架中的 AudioQueues,并使用 Accelerate 框架进行傅里叶变换。

我的过程与 Wikipedia 的倒谱文章中列出的 Real Power Cepstrum 完全相同,具体为:signal → FT → abs() → square → log → FT → abs() → square → power cepstrum。

我遇到的问题是倒谱结果非常嘈杂。我必须删除第一个和最后 20 个值,因为它们与其他值相比是天文数字。即使在“清理”数据之后,仍然存在大量变化 - 远远超过我对第一张图表的预期。有关频域和频域的可视化,请参见下面的图片。 FFT Cepstrum

当我在该图上看到频域中如此明显的赢家时,我希望在频域中看到同样清晰的结果。我玩过 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 调用,我不知道这会有多大帮助。

【问题讨论】:

  • 您可能想尝试在第一次 FFT 之前应用窗口函数。
  • 我花了一大早上的时间试图理解为什么这么多人建议这样做。为什么窗口函数会改进变换并不明显。直到现在我才理解频谱泄漏,我相信这是造成混乱的原因。感谢您的提示!

标签: iphone signal-processing fft pitch frequency-analysis


【解决方案1】:

以下分析说明了倒谱在合成信号和真实信号上的表现。

首先我们检查一个合成信号。

下图显示了合成的稳态 E2 音符,使用典型的近直流分量合成,基波频率为 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 音符的 log(|FFT|^2) 输出。

下图显示了原声吉他 E2 音符的倒谱。观察 542.8 处显着的非 DC 峰值。倒谱宽度为 32768(第二个 FFT 的输出),因此峰值对应于 32768/542.8 = 60.4 Hz,与实际的基波 82.4 Hz 相差甚远。

用于此分析的 E2 吉他音符的录音是在录音室条件下使用高质量麦克风以 44.1 KHz 采样的,它基本上包含零背景噪音,并且没有其他乐器或声音。

这说明了在现实世界的音频信号中使用倒谱分析来确定音高的重大挑战。

参考资料:

真实音频信号数据、合成信号生成、绘图、FFT 和倒谱分析均在此处完成:Musical instrument cepstrum

【讨论】:

  • 你的图表总结得很好。我放弃了倒谱,因为做出算法决定的噪音非常大。
【解决方案2】:

如果我理解得很好,主要问题是从音频信号中检测频率。

您的意思是频谱中最强的频率,所以我建议使用 这个优秀的图书馆http://www.schmittmachine.com/dywapitchtrack.html

“该算法的核心是一个非常强大的小波算法,Eric Larson 和 Ross Maddox 在一篇论文中进行了描述:UIUC Physics 的“Real-Time Time-Domain Pitch Tracking Using Wavelets”。”

希望有帮助

【讨论】:

  • 感谢您添加此答案!工具箱中的另一个工具总是有帮助,尤其是对于这样一个难题。今晚我会检查一下并给出结果。
  • 这是一个令人印象深刻的算法。我使用使用施坦威样本的数码钢琴进行了测试,它在 C2 和 C5 之间相当准确。很好找,再次感谢分享。
【解决方案3】:

倒谱或倒谱分析是一种用于尝试将具有高泛音内容的信号分成两部分的技术。 DC 附近的部分代表所有泛音或语音共振峰的频谱包络,这可能对说话人或乐器识别很有用。如果该频率产生足够的谐波泛音内容,则倒谱结果中后面的峰值代表一个或多个激励频率。

由于倒谱通常在没有任何(非矩形)窗口的情况下完成,它甚至可以对干净的泛音序列产生 Sinc 响应,响应的宽度大致与泛音序列的长度或数量成反比的泛音。当然,任何轻微不和谐的泛音(如在实际乐器中发现的)都会使倒谱结果更加混乱。因此,倒谱峰值可能只擅长给出基频的大致位置,这仍然可能是在进行频率估计时拒绝其他候选频率的有用结果。

“看起来干净”的倒谱可能是由非常长的谐波泛音序列产生的结果,该序列具有几乎平坦的频率响应,这可能不是在现实生活中的信号中发现的。

【讨论】:

  • 所以试图清理倒谱结果是不现实的。扔掉第一个和最后几个垃圾箱是否常见?还有其他我可以使用的澄清技巧吗?
  • @fast4ear : DC 附近的 bin 包含有关共振峰的信息。如果您不关心共振峰的形状,则可能不需要这些箱中的信息。
  • 因此,如果我以 44100Hz 采样并且我有 4096 个 bin 样本,并且我对 440Hz 感兴趣,我会查看 bin 82 ((22050/4096)*82) 的频率领域。我是否也应该查看 quefrency 域中的 bin 82?或者我会查看 bin 50 (22050/440) 吗?
  • @brodney 您是否能够使用倒谱分析获得基频估计?对于 440Hz,我想您应该查看 bin 44100/440。我不太确定。
  • @Ravi 信息在那里,但事实证明它太嘈杂而无法持续使用。我可以查看图表并查看它,但通过倒谱检测存在哪些频率(如果有)的算法仍然让我望而却步。我会建议一个不同的方向。
猜你喜欢
  • 1970-01-01
  • 2014-09-26
  • 2013-04-19
  • 1970-01-01
  • 2013-05-10
  • 2018-07-12
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
相关资源
最近更新 更多