1. 程式人生 > >python wav檔案短時能量並plot出來

python wav檔案短時能量並plot出來

import wave
import pyaudio
import numpy as np
import pylab

import pylab as pl

# 計算每一幀的能量 256個取樣點為一幀
def calEnergy(wave_data) :
    energy = []
    sum = 0
    for i in range(len(wave_data)) :
        sum = sum + (int(wave_data[i]) * int(wave_data[i]))
        if (i + 1) % 256 == 0 :
            energy.append(sum)
            sum = 0
        elif i == len(wave_data) - 1 :
            energy.append(sum)
    return energy





# f = wave.open("./語料/" + str(i + 1) + ".wav","rb")

f=wave.open("C:/Users/Administrator/Desktop/du.wav","rb")
# getparams() 一次性返回所有的WAV檔案的格式資訊
params = f.getparams()
# nframes 取樣點數目
nchannels, sampwidth, framerate, nframes = params[:4]
# readframes() 按照取樣點讀取資料
str_data = f.readframes(nframes)            # str_data 是二進位制字串

# 以上可以直接寫成 str_data = f.readframes(f.getnframes())

# 轉成二位元組陣列形式(每個取樣點佔兩個位元組)
wave_data = np.fromstring(str_data, dtype = np.short)
print( "取樣點數目:" + str(len(wave_data)))          #輸出應為取樣點數目
f.close()



energy = calEnergy(wave_data)


time = np.arange(0, len(wave_data)) * (1.0 / framerate)
time2 = np.arange(0, len(energy)) * (len(wave_data)/len(energy) / framerate)
pl.subplot(211)
pl.plot(time, wave_data)
pl.ylabel("Amplitude")
pl.subplot(212)
pl.plot(time2, energy)
pl.ylabel("short energy")
pl.xlabel("time (seconds)")
pl.show()


# print("短時能量:",energy)