最近我问了这个问题: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
重要信息:
我不知道:
谢谢!
答案 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)