首页 > 代码库 > 分享python分析wave, pcm音频文件

分享python分析wave, pcm音频文件

最近研究的,我用的是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) # int16
12 size = int(os.path.getsize(fileName) / shortArray.itemsize)
13 count = int(size / 2)
14 shortArray.fromfile(file, size) # faster than struct.unpack
15 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 file
32 
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 = 0
11 minl = 0
12 maxr = 0
13 minr = 0
14 larray = []
15 rarray = []
16 # file has two channels, 16 bit per sample
17 while True:
18     lr = file.read(4)
19     if len(lr) < 4:
20         break
21     count += 1
22     lvalue = http://www.mamicode.com/struct.unpack(h, lr[:2])[0] * base
23     larray.append(lvalue)
24     if lvalue > maxl:
25         maxl = lvalue
26     if lvalue < minl:
27         minl = lvalue
28     total += lvalue
29     rvalue = http://www.mamicode.com/struct.unpack(h, lr[2:])[0] * base
30     rarray.append(rvalue)
31     if rvalue > maxr:
32         maxr = rvalue
33     if rvalue < minr:
34         minr = rvalue
35 
36 file.close()
37 avarage = total / count
38 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下载:http://yun.baidu.com/s/1gdf3e3D

下面这个地址也有一个例子:http://stackoverflow.com/questions/18625085/how-to-plot-a-wav-file可以看看。