2016-02-25 6 views
0

Я делаю проект, в котором хочу использовать данные WAV-файла для анимации дисков. Проблемы, с которыми я сталкиваюсь, связаны главным образом с тем, что анимация составляет 25 кадров в секунду, и у меня есть 44100 выборок в секунду в файле .wav, поэтому я разбился на 44100/25. Работа с амплитудой прекрасна, и я создал начальный тест, чтобы попробовать, и это сработало. Это кодPython выполняет FFT по волновым данным для анимации 25 кадров в секунду

import wave 
import struct 

wav = wave.open('test.wav', 'rb') 

rate = 44100 
nframes = wav.getnframes() 

data = wav.readframes(-1) 

wav.close() 

data_c = [data[offset::2] for offset in range(2)] 

ch1 = struct.unpack('%ih' % nframes, data_c[0]) 
ch2 = struct.unpack('%ih' % nframes, data_c[1]) 

kf = [] 

for i in range(0, len(ch2), 44100/25): 
    cur1 = 0 
    cur2 = 0 
    for j in range(i, i+44100/25): 
     cur1+=ch2[j] 
     cur2+=ch1[j] 
    cur = (cur1+cur2)/44100./25./2. 
    kf.append(cur) 

min_v = min(kf) 
max_v = max(kf) 
if abs(max_v) > abs(min_v): 
     kf = [float(i)/max_v for i in kf] 
else: 
     kf = [float(i)/min_v for i in kf] 

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

ответ

0

Посмотрите на scipy wavfile. Он превратит волновой файл в массив numpy. Numpy также имеет функции fft. Scipy/matplotlib имеет график спектрограмм для всей спектрограммы.

from scipy.io import wavfile 

sample_rate, data = wavfile.read(filename) 

Тогда вам нужно узнать, как вы хотите прочитать данные. Matplotlib имеет анимационные инструменты, которые будут вызывать функцию с заданным интервалом. Другой способ сделать это - использовать PyAudio. Если вы используете pyaudio, вы можете прослушивать данные во время их отображения.

Далее выполните данные через БПФ. Храните значения FFT в массиве спектрограмм и используйте matplotlib imshow для отображения массива спектрограмм. Вероятно, вам придется вращать массив каким-то образом, когда вы показываете спектрограмму.

Из личного опыта будьте осторожны с потоками питона. Threading работает для ввода-вывода, но для вычислений поток может просто доминировать над всем приложением, замедляя все. Также элементы GUI (например, построение графиков) действительно не работают в потоках. Используйте инструменты анимации matplotlibs для построения графика.

+0

Спасибо за быстрый ответ. Я использую массивы numpy и выполняю FFT на них без задержек, но моя проблема заключается в правильном выборе времени. Как вы можете видеть, я разделил синхронизацию с частотой 25 кадров в секунду для амплитуды, но я изо всех сил стараюсь делать БПФ на этих фрагментах 1764 образцов. Я попытался запустить БПФ на них, но тогда я не знаю, как интерпретировать вывод этого в спектральном анализе. – vshotarov

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

  • Нет связанных вопросов^_^