pau*_*508 1 android fft real-time pitch-tracking frequency-analysis
我尝试在android平台上开发一个吉他游戏。
我需要进行实时音高检测以获得吉他和弦/弦的频率。
我将从麦克风获取输入,然后分析输入(输入弹奏哪种吉他弦/和弦)
我发现有两种可以使用的方法,一种是YIN,另一种是FFT。
哪种方法可以获得更好的性能和准确的结果?
您需要首先了解“音高”到底是什么(阅读下面的维基百科链接)。当在吉他或钢琴上发出单个音符时,我们听到的不仅仅是声音振动的一个频率,而是在不同数学相关频率下发生的多种声音振动的组合。这种不同频率的振动组合的元素被称为谐波或分音。例如,如果我们按钢琴上的中间 C 键,复合谐波的各个频率将从 261.6 Hz 作为基频开始,523 Hz 将是第二谐波,785 Hz 将是第三谐波,1046 Hz 将是是第 4 次谐波,依此类推。后面的谐波是基频 261.6 Hz 的整数倍(例如:2 x 261.6 = 523、3 x 261.6 = 785、4 x 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 个可能的八度候选音符的所有泛音来计算八度。该算法旨在检测和弦 MP3 文件中任何给定时刻的最主要音调(音符)。这通常对应于器乐独奏的音符。对我的两阶段音高检测算法的 C++ 源代码感兴趣的人可能希望从 GitHub.com 上 SPitchCalc.cpp 文件中的 Estimate_ScalePitch() 函数开始。
https://github.com/CreativeDetectors/PitchScope_Player
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
下面是复调 mp3 录音中 3 秒吉他独奏的对数 DFT(由我的 C++ 软件创建)的图像。它显示了在演奏独奏时吉他上各个音符的和声如何出现。对于这个对数 DFT 上的每个音符,我们可以看到它的多个谐波垂直延伸,因为每个谐波将具有相同的时间宽度。确定了音符的八度后,我们就知道基音的频率了。
下图演示了我开发的八度检测算法,一旦确定了该音符的音阶音高,就可以选择正确的八度候选音符(即正确的基本音符)。那些希望在 C++ 中看到该方法的人应该转到名为 FundCandidCalcer.cpp 的文件中的 Calc_Best_Octave_Candidate() 函数,该文件包含在我在 GitHub 上的源代码中。
| 归档时间: |
|
| 查看次数: |
2655 次 |
| 最近记录: |