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之大话题小函数(1)
Oct 10 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
python爬取基于m3u8协议的ts文件并合并
Apr 26 Python
Django结合ajax进行页面实时更新的例子
Aug 12 Python
Django之PopUp的具体实现方法
Aug 31 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
python isinstance函数用法详解
Feb 13 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
jenkins+python自动化测试持续集成教程
May 12 Python
如何利用python进行时间序列分析
Aug 04 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
用python对oracle进行简单性能测试
Dec 05 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
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
PHP+MYSQL 出现乱码的解决方法
2008/08/08 PHP
php类常量用法实例分析
2015/07/09 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
javascript原型模式用法实例详解
2015/06/04 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
Angularjs修改密码的实例代码
2017/05/26 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
Python 元类使用说明
2009/12/18 Python
pygame播放音乐的方法
2015/05/19 Python
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
深入理解Python中装饰器的用法
2016/06/28 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
python cumsum函数的具体使用
2019/07/29 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
python归并排序算法过程实例讲解
2020/11/04 Python
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
银行实习人员自我鉴定
2013/09/22 职场文书
打架检讨书100字
2014/01/08 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
成龙洗发水广告词
2014/03/14 职场文书
文明好少年事迹材料
2014/08/19 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
Python源码解析之List
2021/05/21 Python
Python Matplotlib绘制条形图的全过程
2021/10/24 Python