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".
从 docs、stream_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
所以我正在尝试制作音乐可视化工具,我对 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".
从 docs、stream_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