python wav檔案短時能量並plot出來
阿新 • • 發佈:2018-11-20
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)