У меня простой случай, я записываю звук пчелы в Bee have python pyAudio
. После записи мне нужно разделить эту запись на 10-секундные фрагменты и проанализировать эти фрагменты по python wave, numpy
или python scipy, numpy
, я не знаю, какой самый простой способ.
Я хотел бы прочитать запись, затем разделить ее на 10-секундный блок и применить fft или rfft , и после этого мне нужно получить доминирующие частоты в Гц в блоке.
Я собираю эти значения с отметкой времени в гистограмме для графика гистограммы.
Сейчас у меня есть несколько примеров, где я могу получить целую запись и построить график на python matplotlib, scipy.signal
, но я не знаю, как разделить ее на список значений Гц.
Если я ошибся, пожалуйста, скажите мне. Спасибо за совет.
import numpy as np
import struct, wave
def main():
audio = wave.open('wav_data/18-08-07_09_10_12.wav', 'rb')
rate = audio.getframerate()
num_frames = audio.getnframes()
dur = int(num_frames / rate)
fmt = "%ih" % rate
for x in range(dur):
data = audio.readframes(rate)
data_int = struct.unpack(fmt, data)
data_np = np.array(data_int, dtype='b')
w = np.fft.rfft(data_np)
freqs = np.fft.fftfreq(len(w))
idx = np.argmax(w)
freq = freqs[idx]
freq_in_hz = abs(freq * rate)
print(freq_in_hz)
if __name__ == "__main__":
main()