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创建系统目录的方法
Mar 11 Python
python字符串连接方法分析
Apr 12 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
Jun 28 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
Java分治归并排序算法实例详解
Dec 12 Python
详解TensorFlow在windows上安装与简单示例
Mar 05 Python
对python读取CT医学图像的实例详解
Jan 24 Python
python实现最小二乘法线性拟合
Jul 19 Python
基于python实现把图片转换成素描
Nov 13 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
python 正则表达式参数替换实例详解
Jan 17 Python
Java多线程实现四种方式原理详解
Jun 02 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获取中英混合字符串长度的方法
2014/06/07 PHP
Linux系统下PHP-FPM的安装和配置教程
2015/08/17 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
表单元素值获取方式js及java方式的简单实例
2016/10/15 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
详解vue中使用微信jssdk
2019/04/19 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
用Python编写web API的教程
2015/04/30 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
python实现可变变量名方法详解
2019/07/01 Python
Python 内置变量和函数的查看及说明介绍
2019/12/25 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
Python Spyder 调出缩进对齐线的操作
2021/02/26 Python
我的大学生活职业生涯规划
2014/01/02 职场文书
同学聚会老师邀请函
2014/01/28 职场文书
优秀员工推荐信
2014/05/10 职场文书
2014年党员自我评议总结
2014/09/23 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
读书笔记格式
2015/07/02 职场文书
小学新课改心得体会
2016/01/22 职场文书
golang日志包logger的用法详解
2021/05/05 Golang