问题

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

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()

用python的pylab画wave波形之sampwidth问题的更多相关文章

  1. Python matplotlib pylab 画张图

    from pylab import * w1 = 1 w2 = 25 fs = 18 y = np.arange(-2,2,0.001) x = w1*y*log(y)-1.0/w2*exp(-(w2 ...

  2. python运用turtle 画出汉诺塔搬运过程

    python运用turtle 画出汉诺塔搬运过程 1.打开 IDLE 点击File-New File 新建立一个py文件 2.向py文件中输入如下代码 import turtle class Stac ...

  3. python生成字符画

    python生成字符画 这个idea来自于实验楼,非常适合练习PIL的像素处理,更重要的是非常有意思. 环境配置 依赖的第三方库就是PIL(Python Image Library),可以直接使用pi ...

  4. python中matplotlib画折线图实例(坐标轴数字、字符串混搭及标题中文显示)

    最近在用python中的matplotlib画折线图,遇到了坐标轴 "数字+刻度" 混合显示.标题中文显示.批量处理等诸多问题.通过学习解决了,来记录下.如有错误或不足之处,望请指 ...

  5. Python——教你画朵太阳花

    用python中的turtle函数画个太阳花,有以下几个步骤 1.首先,我们在开始中找到Python语言的IDLE软件脚本     2.然后出现该软件界面,如图,点击上面的Eile     3.然后在 ...

  6. Python下字符画(ascii art)生成

    之前在b站上看到有人用C写了个脚本把妹抖龙op转换成字符画的形式输出了,感觉比较好玩在下就用python也写了一遍(主要是因为python比较简单好用).这里就这里就不介绍字符画了,因为能搜到这个的肯 ...

  7. Python 的 Matplotlib 画图库

    Matplotlib安装 NumPy库方便数值运算,但枯燥的数据并不利于人们的直观理解. 数据需要可视化. Matplotlib:一个数据可视化函数库 使用前需要安装  利用Python自带 ...

  8. Python:Matplotlib 画曲线和柱状图(Code)

    原文链接:http://blog.csdn.net/ikerpeng/article/details/20523679 参考资料:http://matplotlib.org/gallery.html ...

  9. python之turtle画蚊香

    原理:利用turtle绘制圆形,并使圆半径逐步增加 代码如下: import turtle turtle.pensize(30) for i in range(30): turtle.circle(i ...

  10. Python 中 plt 画柱状图和折线图

    1. 背景 Python在一些数据可视化的过程中需要使用 plt 函数画柱状图和折线图. 2. 导入 import matplotlib.pyplot as plt 3. 柱状图 array= np. ...

随机推荐

  1. C# WPF 自学 MVVM简单介绍

    一.MVVM介绍 MVVM是Model-View-ViewModel(模型-视图-视图模型)的缩写形式 1.View就是用xaml实现的界面,负责与用户交互,接收用户输入,把数据展现给用户. 2.Vi ...

  2. maven的下载与安装 win10系统

    1.安装maven的前提是jdk环境要配置好 不然下载jar包的时候会出错 2. Maven软件安装包下载 (推荐官网下载) 官网地址https://maven.apache.org/ 然后 3.下载 ...

  3. AutoCAD2018

    「AutoCAD_2018_SC.exe」https://www.aliyundrive.com/s/GvpR9yg6TWg 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线 ...

  4. 20200921--同行列对角线的格(奥赛一本通P89 2 二维数组)

    输入三个自然数n,i,j(1<=i<=n,1<=j<=n),输出在一个n*n格的棋盘中(行列均从1开始编号),与格子(i,j)同行,同列,同一对角线的所有格子的位置. 如:n= ...

  5. Ubuntu系统update时提示源不安全被禁用的一种解决办法

    参考自这篇文章Ubuntu系统update时提示源不安全被禁用 - 知乎 (zhihu.com). 安装好Ubuntu18.04并更换清华源后,在运行 sudo apt update 更新源时报错如下 ...

  6. CSS vw与vh动态设置元素的高度宽度

    做为一个前端开发者,总有一天我们要设置页面某一部分内容自适应浏览器窗口大小,下面分享下使用vw和vh的设置方式, 一波解释: v(即viewport):可视窗口,也就是浏览器窗口大小.vw Viewp ...

  7. 微信小程序地理定位和城市选择列表

    1.先获取用户是否授权地理定位,如果没有让其跳转到设置页面手动开启(获取到的位置是经纬度,需要借助其他地图SDK的地址逆解析获取省市区的名字) getSetting() { wx.getSetting ...

  8. 复制文件到U盘提示“一个意外错误使您无法复制该文件”处理办法

    运行cmd 运行 chkdsk H(U盘所在盘符):/f    即可

  9. vite + vue安装 注意事项

    一.要求node版本必须>12.0.0 1.node 如何升级 · 执行npm cache clean -f 清除缓冲 · npm install -g n 安装 n 模块  n模块用于管理 n ...

  10. 深入理解C++的型别推导

    所谓型别推导,指的是我们在为变量赋予类型时不必再显式声明,编译器可以根据代码来自动推导类型.C++11中有两种型别推导的场景:模板和auto.下面我们来一一解析. 模板的型别推导 模板在C++中的应用 ...