概述
机器学习第3章第9节 : 绘制声音波形图
注意事项
本教程使用到了wave库,pylab库和numpy库
wave库是Python的wav声音处理库.
思路
声音波波形属于正弦波,拥有振幅和频率两个特征,振幅就是音量,频率就是音调
打开wav文件,使用wave库的open方法,主要参数为文件名和存取文件方式.
读取格式信息,使用wave库的getparams方法,该方法返回了6个信息,我们需要使用的是前四项,依次为通道数,样本宽度,样本频率,波形数据长度.
读取波形数据,波形数据是wav文件采样后生成的采样数据,使用wave库的readframes方法读取,该方法返回的数据是字符类型
转换波形数据为numpy的整型数组对象
计算时间轴
绘制波形,绘制前调用pylab的subplot方法创建两个上下行驶的绘图区,每个绘图区各绘制一个声道的数据.
代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
绘制波形图
plottingWaveform.py
"""
import wave
import pylab as pl
import numpy as np
print('working')
#打开wav文档
file = wave.open(r"wav/back.wav","rb")
#读取格式信息
#(nchannels,sampwidth,framerate,nframes,comptype,compname)
params = file.getparams()
nchannels,sampwidth,framerate,nframes = params[:4]
#读取波形数据
str_data = file.readframes(nframes)
#文件使用完毕,关闭文件
file.close()
#将波形数据装换成数组
wave_data = np.fromstring(str_data,dtype=np.short)
wave_data.shape = (-1,2)
wave_data = wave_data.T #矩阵转置
time = np.arange(0,nframes) * (1.0 / framerate)
#绘制波形
"""
subplot(mnp) / (m,n,p)是将多个图画到一个平面上的工具.
其中,m表示是图排成m行,n表示图排成n列,也就是整个figure中有n个图是排成一行的,一共m行,
如果m=2就是表示2行图.p表示图所在的位置,p=1表示从左到右从上到下的第一个位置.
"""
pl.subplot(2,1,1) #这里也可以使用pl.subplot(211)
pl.plot(time,wave_data[0])
pl.subplot(2,1,2)#这里也可以使用pl.subplot(212)
pl.plot(time,wave_data[1],c="g")
pl.xlabel("time (seconds)")
pl.show()
运行结果
示例音频地址
笔记
getparams:一次性返回所有的WAV文件的格式信息,它返回的是一个元组(tuple):
nchannels sampwidth framerate nframes comptype compname 音频通道数(1单声道、2立体声) 以字节的形式返回量化位数(byte单位) 采样频率 音频帧数 压缩类型(“NONE”是唯一支持的类型) 压缩类型的描述 wave模块只支持非压缩的数据,因此可以忽略最后两个信息:
numpy.fromstring(str_data,dtype=numpy.short)是使用字符串创建矩阵.
wave_data.shape = (-1,2) 这行代码是可以用于对数组进行“重新排列”,只要不需要对元素总数进行修改就可以了.
subplot(mnp) / (m,n,p)是将多个图画到一个平面上的工具.其中,m表示是图排成m行,n表示图排成n列,也就是整个figure中有n个图是排成一行的,一共m行,如果m=2就是表示2行图.p表示图所在的位置,p=1表示从左到右从上到下的第一个位置.
比如:subplot(212)表示绘图区有两个,一共一列,当前索引为第2个绘图区.
最后
以上就是平淡长颈鹿为你收集整理的机器学习第3章第9节 : 绘制声音波形图机器学习第3章第9节 : 绘制声音波形图的全部内容,希望文章能够帮你解决机器学习第3章第9节 : 绘制声音波形图机器学习第3章第9节 : 绘制声音波形图所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复