用python的pylab画wave波形之sampwidth问题

网友投稿 311 2022-06-19


问题

网上找了好多地方,核心代码都是一样的,比如这句。

 

wavedata=np.fromstring(bindata,dtype=np.short)

效果也还行。

可一次随机加载了一个Office里的音效文件,波形完全不对,接近方波了,都是大起大落的数字。

再看波形参数是这样:

_wave_params(nchannels=1, sampwidth=1, framerate=11025, nframes=……)

看它的取样量化位宽(sampwidth)只是1字节,还使用numpy.short(int16)明显不对,byte/int8也不行。

加载到音频处理软件,显示信息为无符号8位,那么对于此WAV来说,用uint8才是正解。

另外,画图中也遇到了子图分块、颜色,总图标题及窗口标题的问题。

综合其它搜索结果及自行尝试,尤其是参考了这篇博文,画图参数很详细!

解决方法

写了如下的简单的代码,自动处理量化位宽、标题、声道个数与波形子图数目等相关事项。

 

# -*- coding: utf-8 -*-

 

import wave

 

import numpy as np

 

import pylab as pl

 

 

 

#fPath=r"C:\Program Files\Microsoft Office\root\Office16\MEDIA\CAMERA.WAV"

 

fPath=r"C:\Windows\Media\Alarm04.wav"

 

f=wave.open(fPath,"rb")

 

para=f.getparams()

 

bindata=f.readframes(para.nframes)

 

f.close()

 

 

 

#按量化位数定数据类型,不能全short,int16

 

#int0纯属占位,16位以上暂未列出,因24位量化无法直接处理,无numpy.int24,需自定义类型,另行开篇说明或找网上解决方案

 

dtypes=[np.int0,np.uint8,np.int16]

 

#新版python提示.fromstring()已经过时,不建议使用

 

wavedata=np.frombuffer(bindata,dtype=dtypes[para.sampwidth])

 

wavedata.shape = -1,para.nchannels

 

time=np.arange(0,para.nframes)*(1.0/para.framerate) #转为秒

 

 

 

pColors="bgrcmykw"

 

wTitle="Wave forms"

 

pl.figure(wTitle) #窗口自定义初始化,如标题等

 

#设置图的总标题,加上文件名;非Windows需修改分隔符

 

pl.suptitle(wTitle+" of " + fPath.split('\\')[-1])

 

for i in range(para.nchannels):

 

pl.subplot(para.nchannels*100+10+i+1)

 

pl.plot(time,wavedata[:,i],pColors[i])

 

pl.xlabel("Time(seconds)")

 

pl.show()


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Python】利用Python对招聘信息数据分析(Python三名面试者的基本数据)
下一篇:python 常用的内置函数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~