【问题标题】:Audio Analysis for Sheet Music乐谱的音频分析
【发布时间】:2011-05-28 23:52:22
【问题描述】:

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

我只是想就它可能有什么困难,是否有人以前尝试过,也许有一些东西可以研究一下,得到一些意见。目前,我最大的困难是并非所有音符都纯粹是一个频率,而且我还无法检测和弦;只是一个音符。我检测到的音符之间也必须有一个停顿,所以我确定一个已经结束,另一个开始了。对此的任何 cmet 也将非常欢迎!

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

    //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];

【问题讨论】:

  • 你有什么代码可以给我们看吗?
  • “不是所有的音符都纯粹是一个频率”:可能几乎没有一个普通乐器的音符是纯粹的一个频率。顺便说一句,纯正弦音对人耳来说听起来很烦人,因此在音乐中相当罕见。
  • @Curd - 好点,我没有想到正弦波与音符波。

标签: signal-processing fft audio-analysis


【解决方案1】:

1) 有很多(数十年)关于频率估计和音高估计(这是两个不同的主题)的研究文献。

2) 峰值 FFT 频率与音高不同。一些独奏乐器可以为一个音符产生十几个频率峰值,更不用说和弦了,而且在音高附近没有任何最大的峰值。对于一些常见的仪器,峰值甚至可能不是数学上精确的谐波。

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

4) 音符开始检测可能需要一些复杂的模式匹配,具体取决于仪器。

【讨论】:

  • 嗨。谢谢,我现在也在使用窗口(Hann),并且一直在考虑使用隐藏马尔可夫模型进行模式匹配。该窗口极大地提高了我找到的频率的准确性。 RE 2:这确实是个问题。目前,我正在通过检查一组样本中最强大频率和最高频率的低八度音阶的出现来解决部分问题。
【解决方案2】:

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

谐波是小号和长号在演奏同一个音符时发出不同声音的原因。

【讨论】:

  • 请记住,虽然经常缺少基本要素 (en.wikipedia.org/wiki/Missing_fundamental)。
  • 是的,上面的代码只取样本中最响亮的部分。稍后我会寻找是否出现了较低的频率,例如,如果我正在播放 A4 并像这样获取数据:440、880、880、880、880 显示 A5 的可能性更大它是 A4,因为至少出现了一次 A4。然而,我发现音符越低,就越难找到任何出现的地方,因为它们的音符足够响亮。
【解决方案3】:

不幸的是,这是一个非常困难的问题,其中一些原因已经给出。我会从“音符识别”的文献搜索(例如 Google Scholar)开始。

如果这不是一个业余项目,请注意 - 我曾在这个特定的浅滩上看到硕士论文创始人没有得到任何有用的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多