用python生成一边录音一边显示FFT图形的程序
时间: 2024-05-01 12:16:17 浏览: 178
python实现录音小程序
以下是使用Python生成同时录音和显示FFT图形的程序:
```python
import pyaudio
import numpy as np
import matplotlib.pyplot as plt
# 设置参数
CHUNK = 1024 # 每个缓冲区的帧数
FORMAT = pyaudio.paInt16 # 音频格式
CHANNELS = 1 # 声道数
RATE = 44100 # 采样率
RECORD_SECONDS = 5 # 录音时长
# 初始化PyAudio
p = pyaudio.PyAudio()
# 打开音频流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
# 创建FFT图形
fig, ax = plt.subplots()
x = np.linspace(0, RATE, CHUNK)
line, = ax.plot(x, np.random.rand(CHUNK))
# 设置图形属性
ax.set_ylim(0, 1)
ax.set_xlim(0, RATE//2)
ax.grid()
# 开始录音
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
# 读取音频数据
data = stream.read(CHUNK)
frames.append(data)
# 转换为numpy数组
y = np.frombuffer(data, dtype=np.int16)
# 计算FFT
fft_data = np.abs(np.fft.fft(y))[:CHUNK//2] / (CHUNK//2)
# 更新图形
line.set_ydata(fft_data)
plt.draw()
plt.pause(0.001)
# 结束录音
stream.stop_stream()
stream.close()
p.terminate()
# 将录音数据保存为WAV文件
wavefile = wave.open("output.wav", 'wb')
wavefile.setnchannels(CHANNELS)
wavefile.setsampwidth(p.get_sample_size(FORMAT))
wavefile.setframerate(RATE)
wavefile.writeframes(b''.join(frames))
wavefile.close()
```
该程序使用PyAudio库来读取音频数据和录制音频,使用NumPy库来计算FFT,使用Matplotlib库来显示FFT图形。程序首先打开音频流,然后创建FFT图形,并设置图形属性。在循环中,程序读取音频数据,将其转换为NumPy数组并计算FFT,然后更新图形。最后,程序将录音数据保存为WAV文件。
阅读全文