博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分享python分析wave, pcm音频文件
阅读量:6296 次
发布时间:2019-06-22

本文共 2442 字,大约阅读时间需要 8 分钟。

最近研究的,我用的是python3.3, 用matplotlib画图,

下面代码演示分析pcm文件,如果是wave文件,把wave的文件头去掉就是pcm文件了。

代码如下

1 # -*- coding:utf-8 -*- 2  3 import array 4 import os 5 from matplotlib import pyplot 6  7 fileName = 'e:/music/qianqian.pcm' # 2 channel, 16 bit per sample 8 file = open(fileName, 'rb') 9 base = 1 / (1<<15)10 11 shortArray = array.array('h') # int1612 size = int(os.path.getsize(fileName) / shortArray.itemsize)13 count = int(size / 2)14 shortArray.fromfile(file, size) # faster than struct.unpack15 file.close()16 leftChannel = shortArray[::2]17 rightChannel = shortArray[1::2]18 19 def showPCM(leftChannel, rightChannel, start = 0, end = 5000):20     fig = pyplot.figure(1)21 22     pyplot.subplot(211)23     pyplot.title('pcm left channel [{0}-{1}] max[{2}]'.format(start, end, count))24     pyplot.plot(range(start, end), leftChannel[start:end])25 26     pyplot.subplot(212)27     pyplot.title('pcm right channel [{0}-{1}] max[{2}]'.format(start, end, count))28     pyplot.plot(range(start, end), rightChannel[start:end])29 30     pyplot.show()31     # fig.savefig('pcm.pdf') # save figure to pdf file32 33 showPCM(leftChannel, rightChannel, 0, count)

 

 

另一种分析方法,用struct.unpack,但读取要比上一种慢很多

1 # -*- coding:utf-8 -*- 2  3 import struct 4 from matplotlib import pyplot 5  6 file = open('e:/music/qianqian.pcm', 'rb') # if file is too large, pyplot may overflow 7 count = 0 8 total = 0 9 base = 1 / (1<<15)10 maxl = 011 minl = 012 maxr = 013 minr = 014 larray = []15 rarray = []16 # file has two channels, 16 bit per sample17 while True:18     lr = file.read(4)19     if len(lr) < 4:20         break21     count += 122     lvalue = struct.unpack('h', lr[:2])[0] * base23     larray.append(lvalue)24     if lvalue > maxl:25         maxl = lvalue26     if lvalue < minl:27         minl = lvalue28     total += lvalue29     rvalue = struct.unpack('h', lr[2:])[0] * base30     rarray.append(rvalue)31     if rvalue > maxr:32         maxr = rvalue33     if rvalue < minr:34         minr = rvalue35 36 file.close()37 avarage = total / count38 print(count, total, avarage)39 print('max = {0} min = {1}'.format(maxl, minl))40 41 fig = pyplot.figure(1)42 pyplot.subplot(211)43 pyplot.title('pcm left channel')44 pyplot.plot(range(count), larray)45 pyplot.subplot(212)46 pyplot.title('pcm right channel')47 pyplot.plot(range(count), rarray)48 pyplot.show()49 # fig.savefig('pcm.pdf')

 代码及pcm下载:

下面这个地址也有一个例子:可以看看。

转载于:https://www.cnblogs.com/Yinkaisheng/p/3753124.html

你可能感兴趣的文章
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.6 UDP回射客户程序:dg_cli函数...
查看>>
不要将时间浪费到编写完美代码上
查看>>
《算法基础:打开算法之门》一3.4 归并排序
查看>>
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>
《锋利的SQL(第2版)》——1.7 常用函数
查看>>
jquery中hover()的用法。简单粗暴
查看>>
线程管理(六)等待线程的终结
查看>>
spring boot集成mongodb最简单版
查看>>