使用python numpy计算并显示音频数据的频谱信息

发布于:2025-03-24 ⋅ 阅读:(31) ⋅ 点赞:(0)

一 概念  

    最近需要用到这个数据。笔者需要,使用 Python 的numpy库结合scipymatplotlib库来计算并显示音频数据频谱信息的示例代码。我们将使用scipy.io.wavfile来读取音频文件,numpy进行快速傅里叶变换(FFT)计算频谱,最后用matplotlib来绘制频谱图。

二 源码解析:

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile


def plot_audio_spectrum(file_path):
    # 读取音频文件
    sample_rate, audio_data = wavfile.read(file_path)

    # 如果音频是立体声,取单声道数据
    if len(audio_data.shape) > 1:
        audio_data = audio_data[:, 0]

    # 计算音频数据的长度
    audio_length = len(audio_data)

    # 进行快速傅里叶变换
    fft_data = np.fft.fft(audio_data)

    # 计算频率轴
    frequencies = np.fft.fftfreq(audio_length, 1 / sample_rate)

    # 取单边频谱
    frequencies = frequencies[:audio_length // 2]
    fft_data = 2.0 / audio_length * np.abs(fft_data[:audio_length // 2])

    # 绘制频谱图
    plt.figure(figsize=(12, 6))
    plt.plot(frequencies, fft_data)
    plt.title('音频频谱')
    plt.xlabel('频率 (Hz)')
    plt.ylabel('幅值')
    plt.grid()
    plt.show()


if __name__ == "__main__":
    # 替换为你的音频文件路径
    audio_file_path = 'your_audio_file.wav'
    plot_audio_spectrum(audio_file_path)

三 代码解析:

  1. 读取音频文件:使用scipy.io.wavfile.read函数读取指定路径的音频文件,返回采样率和音频数据。
  2. 处理立体声音频:如果音频是立体声(即有多个声道),代码会选取第一个声道的数据进行处理。
  3. 执行快速傅里叶变换:使用numpy.fft.fft函数对音频数据进行快速傅里叶变换,得到频域表示。
  4. 计算频率轴:使用numpy.fft.fftfreq函数计算频率轴,该函数根据采样率和数据长度生成对应的频率值。
  5. 获取单边频谱:为了方便显示,代码只保留了单边频谱(正频率部分),并对频谱幅值进行归一化处理。
  6. 绘制频谱图:使用matplotlib库绘制频谱图,展示音频数据的频谱信息。

四 效果展示:

   笔者使用了一个192khz的原始音频数据,输入了一个20khz左右的tone信号,结果如下所示:

可以看出,能采集到信号的数据。