活页乐谱的音频分析

问题描述:

我目前正在开发一个程序,用于分析演奏乐器的独奏音乐家的wav文件并检测其中的音符。要做到这一点,它执行FFT,然后查看生成的数据。目标是(在某个时候)通过编写MIDI文件来制作乐谱。活页乐谱的音频分析

我只想就什么可能会有困难,不管是否有人尝试过,也许有些事情是很好的研究。目前我最大的困难是,并不是所有的音符都是纯粹的一个频率,我还不能检测到和弦;只是单一的笔记。还有,我正在检测的音符之间有一段暂停,所以我确定一个音乐已经结束,另一个开始。对此的任何评论也将非常欢迎!

这是我使用的代码,当一个新的帧来自信号。它会寻找样本中最主要的频率:

//Get frequency vector for power match 
     double[] frequencyVectorDoubleArray = Accord.Audio.Tools.GetFrequencyVector(waveSignal.Length, waveSignal.SampleRate); 

     powerSpectrumDoubleArray[0] = 0; // zero DC 

     double[,] frequencyPowerDoubleArray = new double[powerSpectrumDoubleArray.Length, 2]; 

     for (int i = 0; i < powerSpectrumDoubleArray.Length; i++) 
     { 
      if (frequencyVectorDoubleArray[i] > 15.00) 
      { 
       frequencyPowerDoubleArray[i, 0] = frequencyVectorDoubleArray[i]; 
       frequencyPowerDoubleArray[i, 1] = powerSpectrumDoubleArray[i]; 
      } 
     } 

    //Method for finding the highest frequency in a sample of frequency domain data 
     //But I want to filter out stuff 
     pulsePowerDouble = lowestPowerAcceptedDouble;//0;//lowestPowerAccepted; 
     int frequencyIndexAtPulseInt = 0; 
     int oldFrequencyIndexAtPulse = 0; 
     for (int j = 0; j < frequencyPowerDoubleArray.Length/2; j++) 
     { 
      if (frequencyPowerDoubleArray[j, 1] > pulsePowerDouble) 
      { 
       oldPulsePowerDouble = pulsePowerDouble; 
       pulsePowerDouble = frequencyPowerDoubleArray[j, 1]; 

       oldFrequencyIndexAtPulse = frequencyIndexAtPulseInt; 
       frequencyIndexAtPulseInt = j; 
      } 
     } 
     foundFreq = frequencyPowerDoubleArray[frequencyIndexAtPulseInt, 0]; 
+0

你有任何代码可以告诉我们吗? – 2011-05-28 23:53:19

+0

当然。将张贴。 – Nyx 2011-05-29 00:46:59

+0

请参阅http://stackoverflow.com/questions/435533/detecting-the-fundamental-frequency – mtrw 2011-05-29 02:00:03

1)关于频率估计和基音估计(这是两个不同的主题)的研究文献有很多(几十年的价值)。 2)峰值FFT频率与音高不一致。一些独奏乐器只能为一个音符产生超过十几个频率峰值,更不用说和弦了,并且在音乐音调附近的任何地方都没有最大的峰值。对于一些常用仪器,峰值甚至可能不是数学上精确的谐波。

3)使用短的未加窗FFT的峰值箱不是一个很好的频率估计器。

4)根据仪器的不同,注释起始检测可能需要一些复杂的模式匹配。

+0

嗨。谢谢,我现在也在使用一个窗口(Hann),并且一直在考虑隐藏的马尔可夫模型进行模式匹配。该窗口大大提高了我找到的频率的准确性。 RE 2:这确实是一个问题。目前我有点解决其中的一部分,通过检查一组样本中最强大频率的较低八度音和最高频率的出现。 – Nyx 2011-06-02 04:21:34

您不想专注于最高频率,而是最低频率。任何乐器的音符都充满了谐波。期待听到最基本的,每个八度音阶。加上所有的二次和三次谐波。

谐波是什么让他们都在播放相同的音符喇叭声音不同于长号。

+0

请记住,虽然这通常会失去根本(http://en.wikipedia.org/wiki/Missing_fundamental)。 – mtrw 2011-05-29 01:59:42

+0

是的,上面的代码只会在样本中声音最大。稍后我会查看是否出现较低的频率,例如,如果II正在播放A4并将数据返回,如下所示: 440,880,880,880,880 显示A5更可能是音符I将会认为它是A4,因为至少有一次出现A4。然而,音符越低,我发现越难得到任何事件,因为它们足够大声。 – Nyx 2011-05-29 08:05:48

不幸的是,这是一个非常困难的问题,一些原因已经给出。我将从文献搜索开始(例如谷歌学术搜索)来进行“音符识别”。

如果这不是一个闲暇时间的项目,要小心 - 我已经看到了硕士论文创始人在这个特殊的浅滩没有得到任何有用的结果。