Аудиоанализ для нот - PullRequest
       34

Аудиоанализ для нот

1 голос
/ 29 мая 2011

В настоящее время я работаю над программой, которая анализирует wav-файл соло-музыканта, играющего на инструменте, и обнаруживает в нем ноты.Для этого он выполняет БПФ, а затем просматривает полученные данные.Цель состоит в том, чтобы (в какой-то момент) создать ноты, написав миди-файл.

Я просто хотел получить несколько мнений о том, что может быть трудным в этом вопросе, пробовали ли кто-нибудь это раньше, может быть, нескольковещи, которые было бы хорошо исследовать.На данный момент моя самая большая борьба состоит в том, что не все ноты являются чисто одной частотой, и я пока не могу обнаружить аккорды;только отдельные заметки.Также должна быть пауза между заметками, которые я обнаруживаю, чтобы я точно знал, что одна из них закончилась, а другая началась.Любые комментарии по этому поводу также будут очень кстати!

Это код, который я использую, когда из сигнала приходит новый кадр.он ищет частоту, которая является наиболее доминирующей в выборке:

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

Ответы [ 3 ]

4 голосов
/ 30 мая 2011

1) Существует много (несколько десятилетий) исследовательской литературы по оценке частоты и оценке высоты тона (это два разных предмета).

2) Пиковая частота БПФ не совпадает с музыкальной высотой,Некоторые сольные музыкальные инструменты могут воспроизводить более дюжины частотных пиков только для одной ноты, не говоря уже об аккорде, и без каких-либо самых больших пиков где-либо вблизи музыкальной высоты.Для некоторых распространенных инструментов пики могут даже не быть математически точными гармониками.

3) Использование пиковой корзины короткого неокругленного БПФ не является хорошей оценкой частоты.

4) Примечание началообнаружение может потребовать некоторого сложного сопоставления с образцом, в зависимости от инструмента.

1 голос
/ 30 июня 2011

К сожалению, это чрезвычайно сложная проблема, некоторые из причин уже приведены.Я бы начал с поиска литературы (например, Google Scholar) для «идентификации музыкальной ноты».

Если это не проект свободного времени, будьте осторожны - я видел основателей магистерских диссертаций на этом конкретном мелководье без каких-либо полезных результатов.

1 голос
/ 29 мая 2011

Вы не хотите фокусироваться на самой высокой частоте, а скорее на самой низкой.Каждая нота любого музыкального инструмента полна гармоник.Ожидайте услышать основную и каждую октаву над ней.Плюс ко всему, вторая и третья гармоники.

Гармоника - это то, что отличает звук трубы от тромбона, когда они обе играют одну и ту же ноту.

...