欢迎访问宙启技术站
智能推送

使用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的强大功能和丰富的库,可以轻松实现各种音频处理任务。