因此,我正在尝试制作音乐可视化程序,对于要制作音乐可视化程序的项目,我对python(对于一般的代码更不用说编码)很陌生,但是我很努力,我设法做到了开放的音频流。
我需要帮助的事情:
下面的代码是否是获取fft数据和fftfreq数据的正确方法(假设是振幅和频率数据)?我是否需要在其他地方进行此计算?还是在该功能内以正确的方式进行操作?
当我尝试在代码末尾打印fft_data时,为什么我会得到(fft_data未定义)的错误,即使我相信该函数先前已在代码中调用并且应该已经计算了什么?
我要纠正要从函数中返回的结果变量吗,我需要放return ( audio_data, fft_data, fft_freq)
等,如果是这样,为什么它仍然没有在底部显示fft_data?
当我克服这些问题后,我可能会在后面的文章中跟进。
真诚地感谢任何帮助<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未定义”。
答案 0 :(得分:1)
从docs,stream_callback
“必须返回一个元组:(out_data, flag)
”,并将控制权返回给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