2017-01-26 2 views
0

Ist там способ конвертировать данные из wave.readframe (chunk) в numpy Array для fft?Python: Wave.readframe to numpy areay for fft

(чтение из файла WAV в Numpy массив не вариант, потому что я прочитал WAV файл из трубы)

ответ

1

wavio package, что я написал включает в себя функцию _wav2array(nchannels, sampwidth, data), которая делает то, что вы хотите. (Вы можете также find it on github.)

Чтобы использовать его, вам нужно:

Тогда вы можете написать

array = _wav2array(nchannels, sampwidth, data) 
+0

работает для меня, я думаю, спасибо :) но у меня есть проблемы с использованием моих результатов FFT для вещей, как beatdetection, любые намеки на то, что для использования, я получаю большой массив форме это : 'code' array = wavio._wav2array (1, 2, data) fft = abs (np.fft.rfft (array))' code' должен ли я превышать нижнюю часть для получения амплитуды низких частот? –

+0

Ваш вопрос состоит из двух частей: (1) как преобразовать данные, возвращаемые 'readframes (n)' в массив numpy, и (2) как использовать FFT для анализа ваших данных. Мой ответ здесь для первой части. Вторая часть заслуживает собственного вопроса: либо здесь, либо в stackoverflow или в [dsp.stackexchange.com] (http://dsp.stackexchange.com/) –

1

Вы должны вычислить БПФ на нескольких образцах (256, например), поэтому вам нужно прочитать несколько кадров одновременно.

Что-то, как это должно работать:

import wave, struct 
from numpy.fft import rfft 

nb_samples = 256 
sampwidth = waveFile.getsampwidth() 
datatypes = (None, "%iB", "%ih", None) 
datatype = fmts[sampwidth] 

waveData = waveFile.readframes(nb_samples) 
frame = struct.unpack(datatype % nb_frames, waveData) 
fft = abs(rfft(frame))**2 
+0

Я получаю эту ошибку Traceback (последний последний звонок): Файл "./wav.py", строка 55, в frame = struct.unpack ("% dh"% nb_samples, waveData) struct.error: unpack требует строкового аргумента длиной 512 –

+0

@spam junk. Это зависит от вашего типа данных. Я обновил ответ, чтобы прочитать моно-wav-файл с различным форматом (8 и 16 бит). Если ваш файл является стереофоническим, вам необходимо также использовать количество каналов для чтения данных. – PatriceG

Смежные вопросы