分享python分析wave, pcm音訊檔案

YinKaisheng發表於2014-05-26

最近研究的,我用的是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 = 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 = 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://pan.baidu.com/s/1bp42TOj

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

相關文章