1

我目前正在开发一个程序,该程序分析独奏音乐家演奏乐器的 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];
4

3 回答 3

4

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

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

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

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

于 2011-05-30T06:50:52.407 回答
1

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

谐波是小号和长号在演奏同一个音符时听起来不同的原因。

于 2011-05-29T01:19:54.787 回答
1

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

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

于 2011-06-30T09:24:16.307 回答