1

私は現在、楽器を演奏しているソロ ミュージシャンの wav ファイルを分析し、その中の音符を検出するプログラムに取り組んでいます。これを行うために、FFT を実行し、生成されたデータを調べます。目標は、(ある時点で) midi ファイルを作成して楽譜を作成することです。

何が難しいのか、以前に試した人がいるかどうか、調査するのが良いことについて、いくつかの意見を聞きたかっただけです。現時点で私の最大の苦労は、すべての音符が純粋に 1 つの周波数であるとは限らず、和音をまだ検出できないことです。ただの単音。また、検出している音符の間に一時停止が必要なので、1 つが終了し、もう 1 つが開始したことを確認できます。これについてのコメントも大歓迎です!

これは、信号から新しいフレームが入ってくるときに使用するコードです。サンプルで最も支配的な周波数を探します。

    //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 つの異なる主題) に関する研究文献は多数 (数十年に相当) あります。

2) ピーク FFT 周波数は、音楽のピッチと同じではありません。一部のソロ楽器は、コードは言うまでもなく、たった 1 つの音符に対して 12 をはるかに超える周波数ピークを生成することがあり、音楽のピッチの近くに最大のピークはありません。一部の一般的な楽器では、ピークが数学的に正確なハーモニクスでさえない場合があります。

3) 短いウィンドウ化されていない FFT のピーク ビンを使用することは、優れた周波数推定器ではありません。

4) 楽器によっては、音符の開始検出に高度なパターン マッチングが必要になる場合があります。

于 2011-05-30T06:50:52.407 に答える
1

残念ながら、これは非常に難しい問題であり、いくつかの理由はすでに示されています。「音符の識別」の文献検索(たとえば、Google Scholar)から始めます。

これが余暇のプロジェクトではない場合は、注意してください-私は、この特定の浅瀬で修士論文の創設者が有用な結果を得ていないのを見てきました.

于 2011-06-30T09:24:16.307 に答える
1

最高の周波数ではなく、最低の周波数に注目したいと考えています。あらゆる楽器のすべての音はハーモニクスでいっぱいです。基音とその上のすべてのオクターブを聞くことを期待してください。さらに、すべての 2 番目と 3 番目の高調波。

ハーモニクスは、トランペットとトロンボーンが同じ音を弾いているときに異なる音を出すものです。

于 2011-05-29T01:19:54.787 に答える