Python对每秒25帧的动画波形数据执行FFT

2024-06-23 02:57:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个项目,我想用一个.wav文件的数据来驱动动画。我面临的问题主要是因为动画是25fps的,我在.wav文件中每秒有44100个样本,所以我将其分解为44100/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得到整个文件的频谱,但这不是我想要的,因为理想情况下,我希望根据不同的频率有不同的物体运动。在


Tags: 文件infordatarange动画minstruct
1条回答
网友
1楼 · 发布于 2024-06-23 02:57:54

看看这个小波浪文件。它会把wave文件变成numpy数组。Numpy还具有fft功能。Scipy/matplotlib有整个谱图的谱图图。在

from scipy.io import wavfile

sample_rate, data = wavfile.read(filename)

然后你必须知道你想如何读取数据。Matplotlib有动画工具,可以在给定的时间间隔调用函数。另一种方法是使用PyAudio。如果使用pyaudio,则可以在数据显示时监听数据。在

接下来通过FFT运行数据。将FFT值存储在谱图数组中,并使用matplotlib imshow显示谱图数组。在显示谱图时,可能需要以某种方式旋转阵列。在

从个人经验来看,要小心python线程。线程对I/O有效,但对于计算来说,线程只会控制整个应用程序,从而减慢一切。此外,GUI元素(比如绘图)在线程中并不起作用。使用matplotlibs动画工具进行打印。在

相关问题 更多 >

    热门问题