用python生成一边录音一边显示FFT的多线程程序
时间: 2024-05-07 18:15:23 浏览: 13
以下是一个使用Python生成一边录音一边显示FFT的多线程程序的示例:
```python
import pyaudio
import numpy as np
import matplotlib.pyplot as plt
import threading
# 录音参数
CHUNK = 1024 # 每次读取音频的大小
FORMAT = pyaudio.paInt16 # 音频格式
CHANNELS = 1 # 声道数
RATE = 44100 # 采样率
# 创建PyAudio对象
p = pyaudio.PyAudio()
# 创建一个用于存储录音数据的队列
audio_queue = []
# 创建一个用于绘制FFT图像的线程
def plot_fft():
while True:
# 读取最新录音数据
if len(audio_queue) > 0:
audio_data = audio_queue.pop(0)
else:
continue
# 计算FFT
fft_data = np.abs(np.fft.fft(audio_data))[:int(CHUNK/2)]
# 绘制FFT图像
plt.clf()
plt.plot(fft_data)
plt.ylim(0, 500)
plt.pause(0.001)
# 创建一个用于录音的线程
def record_audio():
# 打开音频流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
while True:
# 读取音频数据
audio_data = stream.read(CHUNK)
# 将音频数据加入队列
audio_queue.append(np.frombuffer(audio_data, dtype=np.int16))
# 启动绘制FFT图像的线程
fft_thread = threading.Thread(target=plot_fft)
fft_thread.daemon = True
fft_thread.start()
# 启动录音线程
record_thread = threading.Thread(target=record_audio)
record_thread.daemon = True
record_thread.start()
# 等待录音线程结束
record_thread.join()
# 关闭音频流和PyAudio对象
stream.stop_stream()
stream.close()
p.terminate()
```
该程序使用PyAudio模块进行录音,并使用numpy和matplotlib模块进行FFT计算和图像绘制。程序中创建了两个线程,一个用于录音,一个用于绘制FFT图像。录音线程将读取音频数据并将其存储在队列中,绘制FFT图像的线程将从该队列中读取最新的音频数据并计算FFT,在图像上绘制FFT结果。程序中还使用了matplotlib的`pause`函数来实现实时更新图像的效果。