如何从FFT中获取基频?

3
我正在开发一个闪存吉他,似乎使用FFT是发现麦克风数据频率的唯一明显方法。然而,经过大约30个小时的研究,我无法找到最佳方法。我应该使用谐波产品谱(HPS)、倒谱法还是最大似然法?调音器将需要显示25到3000Hz的频率。
此外,如果有人知道一些开源代码可以找到基频,请告诉我。我可以将其翻译成ActionScript。
谢谢!
3个回答

7
我成功使用的最简单技术是使用FFT,然后执行谐波乘积谱。它很容易实现且资源占用不高,您只需要正确地降采样结果FFT并进行乘积即可。
以下问题也应该有用:检测基频

1

我尝试用我的基本记忆回答:当你有了信号的FFT时,基频不是具有最大幅度的那个吗?


3
不,它不是。它是频谱的第一个谐波。 - Nemeth
1
@Nemeth:据我所知,“第一谐波”是“基频”的同义词,通常具有最大振幅。 - Jim Lewis
1
@Jim:对于许多乐器来说,基音并不一定具有最高的振幅——我不确定吉他是否是这样,但这可能取决于音符和吉他的类型。无论如何,最好使用适当的“音高检测”算法,而不是武断地查看诸如基音之类的单个分量。 - Paul R
@Paul:对于弹拨吉他的琴弦来说,谐波序列中的最大振幅将是基频。对于铜管乐器来说,许多音符都是基频的第二、第三、第四等倍频产生的。吉他通常被标记为比实际音高高一个八度,这也可能会有些混淆…… - Jim Lewis
@Jim:弓弦乐器,例如小提琴和大提琴,通常在基音上具有非常少的能量。请注意,即使基音完全不存在,音高感知也可以很好地发挥作用。 - Paul R
显示剩余2条评论

0

我应该使用什么代替FFT? - Lucas Speranza
你可以使用自相关函数:http://en.wikipedia.org/wiki/Autocorrelation 但是,由于您正在处理吉他音频,对于此处的基频而言,音高似乎比基音更重要。因此,您应该在这里查看RAPT(鲁棒的音高跟踪算法):http://www.ee.columbia.edu/~dpwe/papers/Talkin95-rapt.pdf - Nemeth
根据文章所述,RAPT是一个非常好的算法。然而,我看到了一个C语言的开源实现,它有数百行代码。 - mmatloka
倒谱分析方法速度慢且复杂。建议使用比特流自相关方法:http://www.cycfi.com/2018/03/fast-and-efficient-pitch-detection-bitstream-autocorrelation/ - AldaronLau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接