#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
Он берет идентифицированную частоту, сравнивает ее со списком реальных частот нот, находит ближайшую частоту и затем сопоставляет ее с соответствующим названием ноты.
Теперь все, что мне нужно, — это аналогичный фрагмент кода на время. Но я действительно не знаю, как мне это найти.