Мой алгоритм обнаружения заметок не работает в нескольких случаях? - PullRequest
0 голосов
/ 14 ноября 2018

Я использую простой подход, чтобы найти музыкальную ноту, используя FFT в Python включенные шаги:

  1. Чтение звукового файла (.wave)
  2. Обнаружение тишины в файле (путем вычисления квадратной суммы квадратов элементов ввода, попадающих в окно)
  3. Определение местоположения банкнот с использованием данных, полученных из (2)
  4. Расчет частоты каждой обнаруженной ноты с использованием DFT
  5. Сопоставление расчетной частоты со стандартными частотами нот для определения воспроизводимой ноты.

но в случае, когда нота должна быть A4 / 440hz, я получаю огромное изменение (2K Hz) есть ли фундаментальная ошибка в моем подходе?

ОБНОВЛЕНИЕ: как я могу передать свой файл audio.wav на эту частоту оценка

полный код Python здесь

window_size = 2000    # Size of window to be used for detecting silence
beta = 1   # Silence detection parameter
max_notes = 100    # Maximum number of notes in file, for efficiency
sampling_freq = 44100   # Sampling frequency of audio signal
threshold = 200


 # traversing sound_square array with a fixed window_size
while(i<=len(sound_square)-window_size):
    s = 0.0
    j = 0
    while(j<=window_size):
        s = s + sound_square[i+j]
        j = j + 1   
        # detecting the silence waves
    if s < threshold:
        if(i-k>window_size*4):
            dft = np.array(dft) # applying fourier transform function
            dft = np.fft.fft(sound[k:i])
            dft = np.argsort(dft)

            if(dft[0]>dft[-1] and dft[1]>dft[-1]):
                i_max = dft[-1]
            elif(dft[1]>dft[0] and dft[-1]>dft[0]):
                i_max = dft[0]
            else :  
                i_max = dft[1]
                        # claculating frequency             
            frequency.append((i_max*sampling_freq)/(i-k))
            dft = []
            k = i+1
    i = i + window_size

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Отслеживание высоты тона реализовано в librosa.piptrack https://librosa.github.io/librosa/generated/librosa.core.piptrack.html#librosa.core.piptrack

0 голосов
/ 16 ноября 2018

Шаг не совпадает с бином частоты пиковой величины БПФ.Пек является человеческим психоакустическим явлением.Звук основного тона может иметь отсутствующий или очень слабый фундаментальный (часто встречающийся в некоторых звуках голоса, пианино и гитары) и / или множество мощных обертонов в своем спектре, которые подавляют частоту основного тона (но все же могут быть услышаны человеком как нота основного тона),Таким образом, любой детектор пиковой частоты БПФ (даже с некоторыми окнами и интерполяцией, чего нет в вашем коде) не будет надежным методом оценки музыкального тона.FFT также будет квантовать частоту до некоторого разрешения бина (возможно, более грубого, чем ваши требования), которое зависит от длины FFT (или окна).

Ответ на этот стекопоток вопрос включает списокнекоторые альтернативные методы оценки высоты тона, которые могут привести к лучшим результатам.

...