Частота волны ниже частоты музыкальной ноты? - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь извлечь частоту заметки из mp3-файла, который содержит синтезированный образец заметки A3, который должен составлять 220 Гц.

Это часть формы волны, которую я получаю, используя librosa:

Saw waveform zoom

Как видите, волна повторяется каждые 400 сэмплов. Следовательно, путем деления частоты дискретизации, которая составляет 22050 Гц, на 400 I следует получить частоту сигнала. Однако вместо 220 я получаю 55,125 Гц. Я что-то упускаю или делаю ошибку?

РЕДАКТИРОВАТЬ : Вот код, который я использую

import librosa
from matplotlib import pyplot as plt
import numpy as np
%matplotlib notebook

y, sr = librosa.load("Simple_synth/A3-saw.mp3")

plt.figure(figsize=(18,6))
plt.plot(y[2000:3000])

note_freq = sr/400

Ссылка на аудиофайл: https://www.filefactory.com/file/7aqmrvq375n9/A3-saw.mp3

1 Ответ

0 голосов
/ 19 марта 2019

Для данного аудиосэмпла

import librosa
from matplotlib import pyplot as plt
import numpy as np

y, sr = librosa.load("A3-saw.mp3")

возможно вычислить преобразование Фурье (см. , как извлечь частоту, связанную со значениями fft в python )

# calculate fast fourier transform
w = np.fft.fft(y)

# frequencies associated to the fourier transform
freqs = np.fft.fftfreq(len(y))

А затем найдите самый высокий пик в преобразовании Фурье и его частоту в Гц

idx = np.argmax(np.abs(w))
freq = freqs[idx]
freq_in_hertz = abs(freq * sr)
print(freq_in_hertz)

54.90196078431373

В выборке также присутствуют высшие гармоники, которыеможно увидеть, построив еще несколько пиков

plt.plot(sr*freqs[0:500],abs(w[0:500]))

enter image description here

plt.plot(sr*freqs[0:2000],abs(w[0:2000]))

enter image description here

...