如何使用cepstral?

Luc*_*nza 5 arrays actionscript fft frequency frequency-analysis

最近我问了这个问题:如何从FFT获得基频?(你实际上不需要阅读它)

我现在怀疑它:如何使用cepstral算法?

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

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

信号→FT→abs()→square→log→FT→abs()→square→power倒谱

数学上:| F {log(| F {f(t)} |²)} |²

重要信息:

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

我不知道:

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

谢谢!

Pau*_*l R 6

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


mma*_*oka 1

寻找基频 (F0) 的方法有很多。

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

  • MFCC(基于倒谱)在Comirva(开源)中实现。
  • Audacity(测试版!)(开源)呈现倒谱、自相关、增强自相关、
  • 基于自相关的 Yin(示例
  • 查找 FFT 后的最大信号值

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