Python 对 25fps 动画的波形数据执行 FFT

Posted

技术标签:

【中文标题】Python 对 25fps 动画的波形数据执行 FFT【英文标题】:Python perform FFT on wave data for a 25fps animation 【发布时间】:2016-02-25 22:16:41 【问题描述】:

我正在做一个项目,我想使用 .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 获得整个文件的频谱,但这不是我想要的,因为理想情况下我希望对象根据不同的频率进行不同的运动。

【问题讨论】:

【参考方案1】:

查看 scipy wavfile。它会将波形文件转换为 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 动画工具进行绘图。

【讨论】:

感谢您的快速回答。我一直在使用 numpy 数组并对它们执行 FFT,但我的问题是要把握好时机。正如您所看到的,我已经以 25 fps 的方式将时间分割为幅度,但我正在努力对这些 1764 个样本块进行 FFT。我试过在它们上运行 FFT,但我不知道如何在频谱分析中解释它的输出。

以上是关于Python 对 25fps 动画的波形数据执行 FFT的主要内容,如果未能解决你的问题,请参考以下文章

高效动画

HI3521是不是具有1080p@30fps编解码能力?

用于波形颜色变化的动画图像擦除

在 Python 中绘制 Wav 文件视听

#私藏项目实操分享# CSS3 实现“完全体”的 60 FPS 动画效果,CodeReview 同事直呼:细节!

动画FPS计算