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

devtools/2025/3/30 20:36:09/

一 概念  

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

二 源码解析:

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfiledef 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信号,结果如下所示:

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


http://www.ppmy.cn/devtools/170795.html

相关文章

Ubuntu capolar 上实现内网穿透

在官网https://www.cpolar.com/ 注册用户,获取tocken 1.1 安装cpolar 在Ubuntu上打开终端,执行命令 首先,我们需要安装curl: sudo apt-get install curl 国内安装(支持一键自动安装脚本) curl -L htt…

Vue3前端开发:组件化设计与状态管理

Vue3前端开发:组件化设计与状态管理 一、Vue3组件化设计 组件基本概念与特点 是一款流行的JavaScript框架,它支持组件化设计,这意味着我们可以将页面分解成多个独立的组件,每个组件负责一部分功能,通过组件的嵌套和复用…

Docker 数据卷与文件挂载

Docker 数据卷与文件挂载的区别与管理指南 在 Docker 中,数据卷(Volume)和文件挂载(Bind Mount)是两种常用的数据持久化方式。它们的主要目的是将容器内的数据保存到主机上,以便在容器重启或删除后数据不会…

LeetCode707设计链表

思路:主要是确定,虚拟头节点不算个数,从第一个正式节点开始计数,下标从0开始,这个确定了就写就完了 typedef struct Node // 定义节点 {int val;struct Node* next; } Node;typedef struct MyLinkedList // 定义链表 …

Java算法队列和栈经常用到的ArrayDeque

主要是记录一下add,push,poll这三个常用api,因为这三个就是栈和队列一念之差的关键 1.add(E e) 方法 ​作用:将元素添加到双端队列的尾部​(等价于 addLast(E e))。​行为: ​成功时&#xff1…

华为终端将全面进入鸿蒙时代

在今天的华为Pura先锋盛典及鸿蒙智行新品发布会上,除了新品Pure X手机,华为还放出了一个重磅消息,那就是鸿蒙电脑。 华为常务董事、终端BG董事长、智能汽车解决方案部董事长余承东表示,华为终端全面进入鸿蒙时代,今年5…

雷电模拟器启动94%卡住不动解决方案

安卓模拟器启动失败/启动加载卡0-29%/启动卡50%/启动卡94%的解决方法 首先看官方论坛常见问题来尝试解决: 安卓模拟器启动失败/启动加载卡0-29%/启动卡50%/启动卡94%的解决方法-雷电安卓模拟器-手游模拟器安卓版_android手机模拟器电脑版_雷电模拟器帮助中心 所有…

用selenium+ChromeDriver豆瓣电影 肖申克的救赎 短评爬取(pycharm 爬虫)

一、豆瓣电影 肖申克的救赎 短评url=https://movie.douban.com/subject/1292052/comments 二、基本知识点讲解 1. Selenium 的基本使用 Selenium 是一个用于自动化浏览器操作的库,常用于网页测试和爬虫。代码中使用了以下 Selenium 的核心功能: webdriver.Chrome: 启动 Chr…