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接收Gmail新邮件并发送到gtalk的方法
Mar 10 Python
简单介绍Python中的round()方法
May 15 Python
在Python中操作字典之update()方法的使用
May 22 Python
在Python的Django框架中创建和使用模版
Jul 15 Python
浅谈Python中函数的参数传递
Jun 21 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
Oct 11 Python
Django 设置多环境配置文件载入问题
Feb 25 Python
Python搭建Keras CNN模型破解网站验证码的实现
Apr 07 Python
Django如何使用jwt获取用户信息
Apr 21 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
用 Python 元类的特性实现 ORM 框架
May 19 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扩展函数
2006/10/09 PHP
php横向重复区域显示二法
2008/09/25 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
一个非常实用的php文件上传类
2017/07/04 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
javascript 面向对象编程 function也是类
2009/09/17 Javascript
javascript eval(func())使用示例
2013/12/05 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
2015/08/11 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
小程序兼容安卓和IOS数据处理问题及坑
2018/09/18 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
python实现五子棋小程序
2019/06/18 Python
Feelunique澳大利亚:欧洲的化妆品零售电商
2019/12/18 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
优秀教师先进事迹材料
2014/12/15 职场文书
nginx简单配置多个server的方法
2021/03/31 Servers
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python