2016-11-11 6 views
0

Я создаю приложение для обучения голосованию, и я использовал БПФ для преобразования сигнала из временной области в частотную область. До применения FFT я сделал окно с окном blackman-harris. Затем я использовал спектр гармонических продуктов для извлечения основной частоты. Самая низкая частота - F2 (87,307 Гц), а самая высокая - C6 (1046.502 Гц). Длина FFT - 8192, частота дискретизации - 44100 Гц.Как исправить ошибки октавы в спектре гармонических продуктов?

Чтобы исправить ошибки октавы, я применил указанное правило here;

 float[] array = hps.HPS(Data); 
    float hpsmax_mag = float.MinValue; 
    float hpsmax_index = -1; 

    for (int i = 0; i < array.Length; i++) 
      if (array[i] > hpsmax_mag) 
       { 
       hpsmax_mag = array[i]; 
       hpsmax_index = i; 
       } 

    // Fixing octave too high errors  
     int correctMaxBin = 1; 
     int maxsearch = (int) hpsmax_index * 3/4; 
     for (int j = 2; j < maxsearch; j++) 
     { 
     if (array[j] > array[correctMaxBin]) 
     { 
      correctMaxBin = j; 
     } 
     } 

     if (Math.Abs(correctMaxBin * 2 - hpsmax_index) < 4) 
     { 
      if (array[correctMaxBin]/array[(int)hpsmax_index] > 0.2) 
      { 
       hpsmax_index = correctMaxBin; 
      } 
     } 

Я проверил систему с использованием пилообразных волн, и я заметил, что ошибки октавы все еще видны. От 87.307 Гц до ~ 190 Гц, это приводит к высоким ошибкам октавы. G5 (783.991) вверх иногда показывает октаву ниже.

Вот некоторые из результатов: Вход | Результат | Ошибка

F2 (87.307) - F4 (349.228) - 2 octaves higher 
    G2 (97.999)- G4 (391.995) - 2 octaves higher 
    A2 (110) - A3 (220) - an octave higher 
    D3 (146.832) - D4 (mostly) (293.665) and D3 - an octave higher 
    A3 (220) - A3 - Correct 
    A4 (440) - A4 - Correct 
    G5 (783.991) - G5 (mostly) and G4 (391.995) - an octave lower 
    A5 (880) - A5 - Correct 
    C6 (1046.502) - C6 - Correct 

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

ответ

0

Когда я обнаружил шаг и октаву от полифонических сигналов на MP3-записи, я использовал немного другой подход. Чтобы определить гармоники, которые содержат «шаг», я решил использовать модифицированный ДПФ, который был логарифмически разнесен, а не БПФ.

Я также решил использовать двухэтапный алгоритм для определения высоты тона, который определил Octave (и предполагаемую Фундаментальную частоту) позже на втором этапе. Алгоритм работает следующим образом:

a) Сначала обнаружен ScalePitch доминирующей ноты - «ScalePitch» имеет 12 возможных значений высоты тона: {E, F, F #, G, G #, A, A #, B, C , C#, D, D #}. И после определения ScalePitch и Time-Width ноты,

b) тогда Октав (основной) этой ноты вычисляется путем изучения ВСЕХ гармоник 4 возможных заметок Октава-кандидата.

Октавное обнаружение может быть очень сложным, особенно на полифоническом сигнале, где отсутствуют основные гармоники и/или другие гармоники. Но мой алгоритм будет работать, даже если некоторые гармоники отсутствуют. Вы можете захотеть скомпилировать и выполнить мой код Windows для PitchScope Player на GitHub, чтобы узнать, как я определяю октаву.

Вы хотите сосредоточиться на функции FundCandidCalcer :: Calc_Best_Octave_Candidate() в файле FundCandidCalcer.cpp, чтобы увидеть алгоритм Octave Detection в C++.

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

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

enter image description here

+0

Я работаю на однотонном поле .. я попробовать и посмотреть, – Giggity

 Смежные вопросы

  • Нет связанных вопросов^_^