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