实时音调检测

Nia*_*all 26 audio signal-processing fft pitch-tracking pitch

我正在尝试对用户唱歌进行实时音调检测,但我遇到了很多问题.我已经尝试了很多方法,包括FFT(FFT问题(返回随机结果))和自相关(自相关音调检测返回麦克风输入的随机结果),但我似乎无法获得任何方法来给出好的结果.任何人都可以建议一种实时音高跟踪方法或如何改进我已有的方法?我似乎无法找到任何好的C/C++方法进行实时音高检测.

谢谢,

尼尔.

编辑:请注意,我已经检查过麦克风输入数据是否正确,并且当使用正弦波时,结果或多或少是正确的音高.

编辑:对不起,这是迟到的,但此刻,我通过从结果数组和每个索引中取出值,并在X轴上绘制索引和在Y轴上绘制值来显示自动相关(两者都被除以100000或其他东西,我使用OpenGL),将数据插入VST主机并使用VST插件不是我的选择.目前,它看起来像一些随机点.我正确地做了,或者你能不能指点我做一些代码或者帮助我理解如何可视化原始音频数据和自相关数据.

tom*_*m10 33

退一步......为了使这个工作你必须想出一种方法来绘制这个过程的中间步骤.你想要做的并不是特别难,但它容易出错并且很烦人.削波,开窗,接线不良,走样,直流偏移,读取错误的通道,奇怪的FFT频率轴,阻抗不匹配,帧大小错误......谁知道.但是,如果您可以绘制原始数据,然后绘制FFT,那么一切都将变得清晰.


Dea*_*art 19

我找到了几个实时音高跟踪的开源实现

还有一些音高跟踪器可能不是专为实时设计的,但可能对我所知的所有方式都可用,并且还可以作为参考来比较你的实时跟踪器:


TJA*_*TJA 7

我知道这个答案不会让每个人都开心,但这里就是这样.

这个东西很难,很难.首先阅读尽可能多的关于FFT,自相关,小波的教程.虽然我还在努力学习DSP,但我确实从以下方面获得了一些见解.

https://www.coursera.org/course/audio目前该课程尚未开始,但视频仍然可用.

http://miracle.otago.ac.nz/tartini/papers/Philip_McLeod_PhD.pdf关于开发音高识别算法的论文.

http://dsp.stackexchange.com是一个致力于数字信号处理的整个网站.

如果像我一样你没有做足够的数学来完全遵循教程,不要放弃,因为一些图表和例子仍然帮助我理解发生了什么.

接下来是测试数据和测试.给自己写一个库,生成用于检查算法的测试文件.

1)超简单的纯正弦波发生器.所以说你正在寻找写YAT(Yet Another Tuner)然后使用你的正弦发生器创建一系列440Hz左右的文件,比如从420-460Hz以不同的增量,看看你的代码是多么灵敏和准确.它可以解决到5Hz,1Hz,更精细吗?

2)然后升级你的正弦波发生器,以便它为信号增加一系列较弱的谐波.

3)接下来是谐波的真实世界变化.因此,对于大多数弦乐器而言,您会看到一系列谐波是基频F0的简单倍数,对于单簧管和长笛等乐器,由于空气在腔室中的行为方式,偶数谐波将会丢失或非常弱.对于某些仪器,F0缺失但可以根据其他谐波的分布来确定.F0是人耳所感知的音高.

4)通过以不规则的方式上下移动谐波峰值频率来引起一些故意的失真

关键在于,如果您正在创建具有已知结果的文件,那么更容易验证您正在构建的内容是否正常工作,当然还有错误.

还有一些包含声音样本的"库". 来自上面提到的Coursera系列的https://freesound.org. http://theremin.music.uiowa.edu/MIS.html

接下来要知道你的麦克风并不完美,除非你花了数千美元就可以获得相当可变的频率响应范围.特别是如果您使用低音符然后便宜的麦克风,阅读PC或手机中的内置麦克风,则会在80-100Hz左右开始显着降低音量.对于相当好的外部设备,你可能会降到30-40Hz.去找麦克风上的数据吧.

您还可以通过扬声器播放音调然后使用您喜欢的麦克风录制来检查会发生什么.但当然,现在我们谈论的是两组频率响应曲线.

在性能方面,有许多免费提供的库,但要注意各种许可模式.

最重要的是在你的第一次尝试之后不要放弃.祝你好运.


Dip*_*ick 5

我在几年前做过的项目中遇到类似的麦克风输入问题 - 结果是由于DC偏移造成的.

在尝试FFT或您正在使用的任何其他方法之前,请确保删除任何偏差.

您也可能遇到头上空间或剪裁问题.

图形是诊断大多数音频问题的最佳方法.

  • 您可以通过将高通滤波器设置为非常低的截止频率来消除直流偏置.基于延伸弦(5或6-)低音吉他的最低结果,我通常使用25-30赫兹. (3认同)

Jam*_*ard 5

这是我设计的一个不寻常的两阶段算法的C++源代码,它可以在Windows 上播放时对复音 MP3文件进行实时音高检测.这种免费应用程序(PitchScope Player,可在网上获得)经常用于在MP3录制时检测吉他或萨克斯独奏的音符.该算法被设计为在MP3音乐文件中的任何给定时刻检测最主要的音调(音符).在MP3录音期间的任何给定时刻,最主要音高(音符)的显着变化准确地推断音符开始.

当在钢琴上按下单个琴键时,我们听到的不仅仅是声音振动的一个频率,而是在不同的数学相关频率上发生的多个声音振动的复合.这种不同频率的振动合成元素被称为谐波或部分.例如,如果我们按下钢琴上的中间C键,复合谐波的各个频率将以261.6 Hz开始作为基频,523 Hz将是2次谐波,785 Hz将是3次谐波,1046 Hz将是后谐波是基频的整数倍,261.6 Hz(例如:2 x 261.6 = 523,3 x 261.6 = 785,4 x 261.6 = 1046).在底部链接,是在吉他独奏的复音MP3录制期间发生的实际谐波的快照.

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

现在退休了,我决定在一个名为PitchScope Player的免费演示应用程序中发布我的音调检测引擎的源代码.PitchScope Player可在网上获得,您可以下载Windows的可执行文件,以便在您选择的mp3文件上查看我的算法.下面链接到GitHub.com将引导您到我的完整源代码,您可以在其中查看我如何使用自定义对数DFT变换检测谐波,然后查找其频率满足正确整数关系的部分(谐波),其定义了'沥青'.

我的音高检测算法实际上是一个两阶段过程:a)首先检测ScalePitch('ScalePitch'有12个可能的音高值:{E,F,F#,G,G#,A,A#,B,C,C#, d,d#})b)和被确定ScalePitch后,则八度是通过检查所有谐波的4个可能的倍频候选笔记计算.该算法旨在检测复音MP3文件中任何给定时刻的最主要音高(音符).这通常对应于乐器独奏的音符.那些对我的两阶段音高检测算法的C++源代码感兴趣的人可能想要从GitHub.com的SPitchCalc.cpp文件中的Estimate_ScalePitch()函数开始. https://github.com/CreativeDetectors/PitchScope_Player

下面是对数DFT(由我的C++软件创建)在复音mp3录音中进行3秒吉他独奏的图像.它显示了在演奏独奏时吉他上各个音符的谐波是如何出现的.对于此对数DFT上的每个音符,我们可以看到它的多个谐波垂直延伸,因为每个谐波将具有相同的时间宽度.在确定音符的八度音符之后,我们知道基音的频率.

在此输入图像描述