Python 读取WAV音频文件 画频谱的实例


Posted in Python onMarch 14, 2020

Python 读取WAV文件

import wave
import struct
from scipy import *
from pylab import *
 
#读取wav文件,我这儿读了个自己用python写的音阶的wav
filename = '1.wav'
wavefile = wave.open(filename, 'r') # open for writing
 
#读取wav文件的四种信息的函数。期中numframes表示一共读取了几个frames,在后面要用到滴。
nchannels = wavefile.getnchannels()
sample_width = wavefile.getsampwidth()
framerate = wavefile.getframerate()
numframes = wavefile.getnframes()
 
print("channel",nchannels)
print("sample_width",sample_width)
print("framerate",framerate)
print("numframes",numframes)
 
#建一个y的数列,用来保存后面读的每个frame的amplitude。
y = zeros(numframes)
 
#for循环,readframe(1)每次读一个frame,取其前两位,是左声道的信息。右声道就是后两位啦。
#unpack是struct里的一个函数,用法详见http://docs.python.org/library/struct.html。简单说来就是把#packed的string转换成原来的数据,无论是什么样的数据都返回一个tuple。这里返回的是长度为一的一个
#tuple,所以我们取它的第零位。
for i in range(numframes):
  val = wavefile.readframes(1)
  left = val[0:2]
#right = val[2:4]
  v = struct.unpack('h', left )[0]
  y[i] = v
 
#framerate就是44100,文件初读取的值。然后本程序最关键的一步!specgram!实在太简单了。。。
Fs = framerate
specgram(y, NFFT=1024, Fs=Fs, noverlap=900)
show()

补充知识:matlab生成wav文件并用python验证

在进行频谱分析时,发现MATLAB和python读取wav文件的波形不一致,导致不能得出正确结果,为了验证MATLAB和python哪部分有问题,于是有了这篇博客。

1、需求分析

用MATLAB生成一个正弦波并保存为wav文件,然后用python读取这个wav文件画出波形,查看python读取出来的波形和matlab生成的波形是否一致。

2、代码实现

2.1 MATLAB生成wav文件

Df=5;   %频率间隔
fs = 8000; %采样频率
T = 1/fs; %采样周期
N=fs/Df;  %序列点数
time = (N-1)./fs; %第一个声音片段的总时长
t=0:T:(N-1)./fs;
y = sin(2*pi*200*t); %生成第一个声音片段,注意需要用db2mag()函数把dB转换成magnitude。

sound(y,fs) %可以播放声音的函数 sound()
filename = ('sinwave.wav'); %给文件取名
plot(t,y)
audiowrite(filename,y,fs) %存储.wav音频文件,在这里文件名为sinwave.wav

其中生成的正弦波波形如下图所示:

Python 读取WAV音频文件 画频谱的实例

2.2 python读取wav文件

import wave
import numpy as np
import pylab as plt

#打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据。
f = wave.open(r"E:\练习\音频信号处理\spectrum.m\sinwave.wav","rb")
#读取格式信息
#一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采
#样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
#读取波形数据
#读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位)
str_data = f.readframes(nframes)
f.close()
#将波形数据转换成数组
#需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组
wave_data = np.fromstring(str_data,dtype=np.short)
#通过取样点数和取样频率计算出每个取样的时间。
time=np.arange(0,nframes)/framerate
print(params)
print(wave_data.max())#找出正弦波的峰值
#time 也是一个数组,与wave_data[0]或wave_data[1]配对形成系列点坐标
plt.plot(time,wave_data/32768)
plt.show()

python读取wav文件显示出来的正弦波如下图所示:

Python 读取WAV音频文件 画频谱的实例

python读取wav文件的信息及求出波形峰值的结果如下图所示:

Python 读取WAV音频文件 画频谱的实例

我们可以看出峰值为32767(该wav文件有16bit,且带一个符号位。215=32768215=32768 ),我们进行归一化处理后的到波形如下图所示:

Python 读取WAV音频文件 画频谱的实例

由上图可以看出MATLAB生成的正弦波保存为wav文件后,python读取该wav文件。两种语言下正弦波相同。

以上这篇Python 读取WAV音频文件 画频谱的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python新手在作用域方面经常容易碰到的问题
Apr 03 Python
Python序列化基础知识(json/pickle)
Oct 19 Python
Python实现一个简单的验证码程序
Nov 03 Python
python如何去除字符串中不想要的字符
Jul 05 Python
python3.X 抓取火车票信息【修正版】
Jun 19 Python
Django框架实现逆向解析url的方法
Jul 04 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 Python
python实现打砖块游戏
Feb 25 Python
基于logstash实现日志文件同步elasticsearch
Aug 06 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 Python
pytorch中的 .view()函数的用法介绍
Mar 17 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
Mar 14 #Python
python matplotlib包图像配色方案分享
Mar 14 #Python
python 使用cx-freeze打包程序的实现
Mar 14 #Python
python matplotlib imshow热图坐标替换/映射实例
Mar 14 #Python
python pyqtgraph 保存图片到本地的实例
Mar 14 #Python
Python 实现将大图切片成小图,将小图组合成大图的例子
Mar 14 #Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 #Python
You might like
关于PHP结束标签的使用细节探讨及联想
2013/03/04 PHP
PHP中数组的分组排序实例
2014/06/01 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
必须收藏的23个php实用代码片段
2016/02/02 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
JQuery 常用方法基础教程
2009/02/06 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
javascript实现模拟时钟的方法
2015/05/13 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
Python实现图片转字符画的示例代码
2017/08/21 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
Python3.5局部变量与全局变量作用域实例分析
2019/04/30 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
Weblogic和WebSphere不同特点
2012/05/09 面试题
护士自荐信范文
2013/12/15 职场文书
文明学生标兵事迹
2014/01/21 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server