python wav文件过零率并plot出来

版权声明:https://blog.csdn.net/barry_j https://blog.csdn.net/Barry_J/article/details/84176872
import math
import wave
import numpy as np
import pylab as pl

def ZeroCR(waveData,frameSize,overLap):
    wlen = len(waveData)
    step = frameSize - overLap
    frameNum = math.ceil(wlen/step)
    zcr = np.zeros((frameNum,1))
    for i in range(frameNum):
        curFrame = waveData[np.arange(i*step,min(i*step+frameSize,wlen))]
        #To avoid DC bias, usually we need to perform mean subtraction on each frame
        curFrame = curFrame - np.mean(curFrame) # zero-justified
        zcr[i] = sum(curFrame[0:-1]*curFrame[1::]<=0)
        # print(zcr[i])
    return zcr


fw = wave.open(r'D:\Workspace\dejavu\preprocessing\tool\aim call wav file\guanji      4.wav','rb')
params = fw.getparams()
print(params)
nchannels, sampwidth, framerate, nframes = params[:4]
str_data = fw.readframes(nframes)
wave_data = np.fromstring(str_data, dtype=np.int16)
wave_data = wave_data*1.0/(max(abs(wave_data)))#wave幅值归一化
fw.close()

# calculate Zero Cross Rate
frameSize = 512
overLap = 0
zcr = ZeroCR(wave_data,frameSize,overLap)
zcr_1=zcr.T
print(zcr_1)
time = np.arange(0, len(wave_data)) * (1.0 / framerate)
time2 = np.arange(0, len(zcr)) * (len(wave_data)/len(zcr) / framerate)
pl.subplot(211)
pl.plot(time, wave_data)
pl.ylabel("Amplitude")
pl.subplot(212)
pl.plot(time2, zcr)
pl.ylabel("ZCR")
pl.xlabel("time (seconds)")
pl.show()

猜你喜欢

转载自blog.csdn.net/Barry_J/article/details/84176872