Найдите длительность частот wav — файла в Python

#python-3.x #signal-processing #fft #frequency #duration

Вопрос:

Я пытаюсь написать код, который принимает в качестве входных данных wav-файл и преобразует частоты из этого wav-файла в музыкальную партитуру. Я написал код, который использую для поиска своих частот, и он работает. Но сейчас я пытаюсь найти способ определить продолжительность каждой частоты, и я не совсем уверен, как это сделать. Мой текущий вывод для определения высоты тона нот — это список Гц, который я сопоставил с именами нот. В идеале я хотел бы что-то подобное для моей продолжительности.

Вот код, который я использую для поиска своих частот:

 def find_frequency(data):
    # play the stream and find the frequency of each chunk
    while len(data) == chunk * sample_width:
        # unpack the data and multiply it times the blackman window
        unpacked_data = np.array(wave.struct.unpack("%dh" % (len(data) / sample_width), data)) * window
        # Take the fft and square each value
        fft_data = abs(np.fft.rfft(unpacked_data)) ** 2
        # find the maximum
        max = fft_data[1:].argmax()   1

        # use quadratic interpolation around the max
        if max != len(fft_data) - 1:
            y0, y1, y2 = np.log(fft_data[max - 1:max   2:])
            x1 = (y2 - y0) * .5 / (2 * y1 - y2 - y0)

            # find the frequency and output it

            frequency = (max   x1) * fps / chunk

            print("The freq is %f Hz." % frequency   " , which is ")
            #call function to map to corresponding note
            find_nearast(note_frequency, frequency)
            # call function to play back the sound
            play_note(note_frequency, frequency)

        else:
            frequency = max * fps / chunk
            print("The freq is %f Hz." % frequency   " , which is")
      
          
            find_nearast(note_frequency, frequency)
            play_note(note_frequency, frequency)
        # read some more data
        data = file.readframes(chunk)
    if data:
        stream.write(data)
    stream.close()
    p.terminate()
    
 

Мой список результатов(список частот) — это список заметок, сгенерированных из следующего кода:

 result_list =[]
def find_nearast(note_frequency, frequency):
    note_frequency = np.asarray(note_frequency)
    idx = (np.abs(note_frequency - frequency)).argmin()
    print(notes[idx])
    global result_list
    result_list.append(notes[idx])
    return result_list
 

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

Теперь все, что мне нужно, — это аналогичный фрагмент кода на время. Но я действительно не знаю, как мне это найти.