使用Python和PyAudio实现音频频谱分析和频谱绘制
发布时间:2024-01-09 09:18:51
音频频谱分析是指将音频信号的时域信息转换为频域信息,从而得到音频信号在各个频率上的能量分布。频谱绘制则是将频谱信息以图像的形式展示出来。在Python中,可以使用PyAudio库来实现音频的录制和频谱分析。
首先,我们需要安装PyAudio库。可以使用以下命令在终端中安装:
pip install pyaudio
接下来,我们可以使用以下代码来录制音频并进行频谱分析和绘制:
import pyaudio
import numpy as np
import matplotlib.pyplot as plt
def audio_spectrum_analysis():
CHUNK = 1024 # 每一帧的大小
FORMAT = pyaudio.paInt16 # 采样位数
CHANNELS = 1 # 声道数
RATE = 44100 # 采样率
RECORD_SECONDS = 5 # 录音时长
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
stream.stop_stream()
stream.close()
p.terminate()
audio_data = np.frombuffer(b''.join(frames), dtype=np.int16) / 32768.0 # 归一化
freq_data = np.fft.fft(audio_data) # 进行傅里叶变换
freq_data = np.abs(freq_data) / len(frames) # 计算频域能量
return freq_data
if __name__ == '__main__':
freq_data = audio_spectrum_analysis()
plt.figure()
plt.plot(freq_data)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.title('Audio Spectrum')
plt.show()
在上述代码中,首先定义了一些常量,比如每一帧的大小(CHUNK)、采样位数(FORMAT)、声道数(CHANNELS)和采样率(RATE)等。然后使用PyAudio库初始化一个音频流(stream),并循环读取音频帧并保存在一个列表(frames)中。
接下来,在停止音频流并关闭后,我们将读取到的音频数据进行归一化处理,然后使用np.fft.fft()函数进行傅里叶变换,得到频谱数据(freq_data)。最后,我们使用Matplotlib库绘制频谱图。
运行上述代码后,会弹出一个窗口显示音频信号的频谱图。图中的横轴表示频率,纵轴表示频域能量。可以根据实际需求对图形进行进一步的美化和定制。
需要注意的是,以上示例只是对音频频谱进行简单的分析和绘制,如果需要对音频进行更复杂的处理,如降噪、特征提取等,可能需要更多的处理步骤和算法。但基于PyAudio和Python的强大功能和丰富的库,可以轻松实现各种音频处理任务。
