首页 文章

多音调检测:FFT还是其他?

提问于
浏览
1

我已经研究过快速傅里叶变换,并且无法看到它们从一个信号中解码多个频率的方法 . 有没有办法分解fft计算的结果,以便我们可以看到和弦中的单个音高,或者可能根据fft的结果计算最可能的和弦?

如果没有,是否有另一种音高检测方法可以检测实时设置中的多个音高?

编辑:我试图一次不超过6个球,因为我写的软件涉及吉他;在程序用户有七弦吉他的随机机会中,它需要能够最多拾取七个音高 .

在这种情况下,是一种FFT(或其他方法)能够从单个麦克风信号处理这个问题,还是我必须制作一个单独读取每个字符串的吉他拾音器?

3 回答

  • 3

    你需要先了解什么'音调_474795的谐波将从261.6赫兹开始作为基频,523赫兹将是第二谐波,785赫兹将是第三谐波,1046赫兹将是第四谐波等 . 后来的谐波是基频的整数倍,261.6Hz(例如:2×261.6 = 523,3×261.6 = 785,4×261.6 = 1046) .

    下面,在GitHub.com上,我设计了一个不寻常的两阶段算法的C源代码,它可以在Windows上播放时对复音MP3文件进行实时音高检测 . 这种免费应用程序(PitchScope Player,可在网上获得)经常用于在MP3录制时检测吉他或萨克斯独奏的音符 . 您可以下载Windows的可执行文件,以便在您选择的mp3文件上查看我的算法 . 该算法被设计成在MP3或WAV音乐文件中的任何给定时刻检测最主要的音调(音符) . 通过在MP3录制期间的任何给定时刻的最主要音高(音符)的变化来准确地推断音符开始 .

    我使用改进的DFT对数变换(类似于FFT)来首先通过查找具有峰值电平的频率来检测这些可能的谐波(参见下图) . 由于我为修改后的Log DFT收集数据的方式,我不必对信号应用窗口函数,也不必添加和重叠 . 我创建了DFT,因此其频率通道以对数方式定位,以便直接与吉他,萨克斯管等音符创建谐波的频率对齐 .

    我的音高检测算法实际上是一个两阶段过程:a)首先检测ScalePitch('ScalePitch'有12个可能的音高值:{E,F,F#,G,G#,A,A#,B,C,C#,D ,D#})b)并且在确定ScalePitch之后,通过检查4种可能的Octave-Candidate音符的所有谐波来计算Octave . 该算法旨在检测复音MP3文件中任何给定时刻的最主要音高(音符) . 这通常对应于乐器独奏的音符 . 那些对我的Two Stage Pitch Detection算法的C源代码感兴趣的人可能想要从GitHub.com的SPitchCalc.cpp文件中的Estimate_ScalePitch()函数开始 .

    https://github.com/CreativeDetectors/PitchScope_Player

    https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

    enter image description here

  • 1

    有两种众所周知的参数谱估计统计技术 . 一个是MUSIC,另一个是ESPRIT . 如果您可以将您的信号表示为加权复指数(即正弦波)的总和,则可以应用其中任何一个 . 此外,相关矩阵的特征分解还将告诉您信号中的频率数,因此您甚至不应该知道这一点 . ESPRIT比MUSIC更好,因为你不应该在频域搜索峰值 . 结果直接给出了频率 . 但是,众所周知,MUSIC更强大 .

  • 1

    可能需要一个隔离每根弦的吉他拾音器 . 否则,所有泛音的混合可能是一个非常困难的问题 .

相关问题