如何使用cepstral?

时间:2011-02-07 19:05:30

标签: arrays actionscript fft frequency frequency-analysis

最近我问了这个问题:How to get the fundamental frequency from FFT?(你实际上并不需要阅读它)

我现在怀疑:如何使用倒频谱算法?

我只是不知道如何使用它,因为我所知道的唯一语言是ActionScript 3,因此我几乎没有关于C,Java等中的本机函数的引用,以及我应该如何实现他们在AS上。大多数文章是关于这些语言= / (尽管如此,欢迎使用除AS以外的其他语言的答案,请解释脚本的工作原理,请

我发现有关cepstral的文章找到FFT结果的基本频率告诉我应该这样做:

信号→FT→abs()→square→log→FT→abs()→square→power cepstrum

数学: | F {日志(| F {F(T)} | 2)} | 2

重要信息:

  • 我正在开发一个闪光灯的GUITAR TUNER
  • 这是我第一次处理高级声音
  • 我正在使用FFT从到达用户麦克风的信号中提取频率分档,但我无法从中获取基频

我不知道:

  • 如何在ARRAY中应用一个正方形(我的意思是,我的FFT给我的数据是一个数组。我应该自己乘以它吗?当我尝试fftResults * fftResults时,ActionScript的调试会抛出错误)
  • 如何应用“日志”。即使我有一个号码,我也不知道如何应用它。
  • 复杂倒谱和倒立势之间有什么区别。另外,我应该使用它们中的哪一个?我正在努力开发吉他调音器。

谢谢!

3 个答案:

答案 0 :(得分:6)

注意,FFT的输出是复数值的数组,即每个bin = re + j*im。我想你可以组合abs和square操作并为每个bin计算re*re + im*im。这为每个bin提供了一个正值,显然您可以非常轻松地计算每个bin的日志值。然后,您需要对此对数平方数据执行第二次FFT,并再次使用此第二个FFT的输出,您将为每个bin计算re*re + im*im。然后,您将获得一系列正值,这些值将有一个或多个峰值代表您输入的基本频率。

答案 1 :(得分:2)

自相关是最简单,最合乎逻辑的方法,也是最佳起点。

要使其正常工作,从简单的自相关开始,然后,如有必要,请按照YIN提供的大纲进行改进。 (YIN基于与细化的自相关。但是,你是否需要这些改进取决于你的情况的细节。)这样,你也可以学习,而不是试图一次性理解整个事物。

尽管FFT方法也可以起作用,但它们更令人困惑。问题在于你真正追求的是周期,而FFT并没有很好地表现出来。丢失的基波就是一个很好的例子,如果你有2Hz和3Hz,基波是1Hz,但在FFT中没有,而1Hz在基于时间的表示中是显而易见的(例如自相关)。除此之外,泛音不一定是谐波,噪音等......所有这些问题通常最好从问题的直接解决方法开始。

答案 2 :(得分:1)

有很多方法可以找到基频(F0)。

对于像Java这样的语言,有许多库已经实现了这些类型的算法(你可以研究它们的来源)。

  • MFCC(基于cepstral)在Comirva中实施(开源)。
  • Audacity(测试版!)(开源)介绍了倒谱,自动放松,增强自动放松,
  • Yin基于自相关(example
  • 在FFT
  • 之后查找最大信号值

所有这些算法可能对您非常有帮助。获得F0(一个以Hz为单位)的最简单方法是使用Yin。