python 中的音乐可视化器问题(fft 和一般)

issue with music visualiser in python ( fft and generally )

所以我正在尝试制作音乐可视化工具,我对 python(更不用说一般编码)的项目非常陌生,我需要制作音乐可视化工具但是我正在努力,我已经设法获得一个开放的音频流。

我需要帮助的事情:

下面的代码是否是获取 fft 数据和 fftfreq 数据的正确方法(假设这是振幅和频率数据)?我需要在其他地方做这个计算吗?还是在该功能中以正确的方式进行操作?

当我尝试在代码末尾打印 fft_data 时,为什么会出现错误(fft_data 未定义),尽管我相信该函数之前已在代码并且应该计算出一些东西?

我是否更正了要从函数返回的结果变量,我需要放置 return ( audio_data, fft_data, fft_freq) 等,如果是这样,为什么它仍然没有在底部打印 fft_data?

当我解决了这些问题后,我可能会在稍后跟进 post。

真诚地感谢任何帮助<3

p.s 因为我是 python 的新手并且一般来说编码请尽量不要以复杂的方式解释,或者如果我问,尽可能用更简单的术语详细说明(不必是可笑的简单 )

这是我想要的方法,我不想使用 librosa 或其他模块,我想坚持使用 numpy struct 和 pyaudio,因为我知道这是可能的

import pyaudio
import numpy as np
import time
import matplotlib.animation as animation
import matplotlib.pyplot as plt
from matplotlib import style

pa = pyaudio.PyAudio()

def callback(in_data, frame_count, time_info, flag):
audio_data = np.fromstring(in_data, dtype=np.float32)
print(audio_data)
fft_data = np.fft.fft(audio_data)
fft_freq = np.fft.fftfreq(len(fft_data))
return (audio_data, fft_data, fft_freq, pyaudio.paContinue)



stream = pa.open(format=pyaudio.paFloat32,
             channels=1,
             rate=44100,
             output=False,
             input=True,
             stream_callback=callback)

stream.start_stream()

stream.close()
pa.terminate()

print(fft_data)

如果我在回调函数中执行 print(audio_data),它会打印音频数据,但我不确定它是否已经可以绘制,所以我想我必须对其使用 fft。但是,当我尝试在代码底部打印 fft_data 时,它显示 "fft_data is not defined".

docsstream_callback "must return a tuple: (out_data, flag)" 和 returns 控制回到 PortAudio 而不是您的代码。

对于调试,您可能需要执行如下操作:

callback_output = []

def callback(in_data, frame_count, time_info, flag):
    audio_data = np.fromstring(in_data, dtype=np.float32)
    callback_output.append(
        audio_data
    )
    return None, pyaudio.paContinue

然后对 callback_output

中存储的数据进行 FFT