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使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
用yum安装MySQLdb模块的步骤方法
Dec 15 Python
Python2.7读取PDF文件的方法示例
Jul 13 Python
python matplotlib坐标轴设置的方法
Dec 05 Python
python SSH模块登录,远程机执行shell命令实例解析
Jan 12 Python
目前最全的python的就业方向
Jun 05 Python
用pyqt5 给按钮设置图标和css样式的方法
Jun 24 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 Python
tensorflow中tf.reduce_mean函数的使用
Apr 19 Python
matplotlib.pyplot.plot()参数使用详解
Jul 28 Python
python两种获取剪贴板内容的方法
Nov 06 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中SimpleXML函数用法分析
2014/11/26 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
2017/03/08 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
微信小程序实现倒计时补零功能
2018/07/09 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
Python实现简单文本字符串处理的方法
2018/01/22 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
Python list与NumPy array 区分详解
2019/11/06 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
给领导的检讨书
2014/02/16 职场文书
美术课外活动总结
2014/07/08 职场文书
任长霞观后感
2015/06/16 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
手残删除python之后的补救方法
2021/06/26 Python
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python