python中的音乐可视化工具的问题(通常是ftf)

时间:2019-05-16 22:19:59

标签: python numpy struct fft pyaudio

因此,我正在尝试制作音乐可视化程序,对于要制作音乐可视化程序的项目,我对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未定义”。

1 个答案:

答案 0 :(得分:1)

docsstream_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