一、短时平均过零率的作用
1、对于连续语音信号,可以考查其时域波形通过时间轴的情况;
2、对于离散信号,实质上就是信号采样点符号变化的次数;
3、在一定程度上可以反映出频率的信息,比如正弦信号的平均过零率就是信号的频率除以两倍采样频率,而采样频率是固定的,所以根据短时平均过零率得出正弦信号的频率。
二、短时平均过零率的定义
1、过零率
单位时间内信号通过零值的次数就称为过零率。
2、短时平均过零率
短时平均过零率是语音信号时域分析中最简单的一种特征,一段短时间内的过零率称为短时平均过零率,这里的短时指的是一帧时间,一帧包含的采样点数为256点。(大家都这样取,我不知道为什么,若有大佬知道请告知一下)。
短时平均过零率的公式为:
此公式来源:韩纪庆《语音信号处理》第3版
计算过程:
1、先对语音信号序列x(n)进行成对处理,检查是否有过零现象,若符号有变化,则表示有一次过零现象;
2、然后进行一阶差分计算,取绝对值;
3、最后进行低通滤波。
三、代码实现
以数字0-9的语音波形做例子:
import wave
import numpy as np
from matplotlib import pyplot as plt
# path = "F:/Corpus/data/0.wav"
path = "F:/Corpus/some_numbers.wav"
f = wave.open(path, "rb") # 打开需要处理的内容
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
str_data = f.readframes(nframes)
wave_data = np.frombuffer(str_data, dtype=np.short)
print(wave_data)
print("len of wave_data:", len(wave_data))
f.close()
time = np.arange(0, nframes) * (1.0 / framerate)
ax1 = plt.subplot(2, 1, 1)
my_x_ticks = np.arange(0, time[159999], 0.5) # 修改x坐标的刻度为0.5
plt.xticks(my_x_ticks)
plt.plot(time, wave_data, "g-")
plt.xlabel('Time/s')
plt.ylabel('Ampltitude')
plt.title('waveform of voice')
# plt.show()
def calZeroCrossingRate(wave_data):
zeroCrossingRate = [] # 用于记录每帧的过零率
sum = 0
w0 = [] # 用于记录每个采样点的sgn值
for i in range(len(wave_data)):
sum += np.abs(np.sign(wave_data[i]) - np.sign(wave_data[i - 1]))
if (i + 1) % 256 == 0:
zeroCrossingRate.append(float(sum) / 255)
sum = 0
elif i == len(wave_data) - 1:
zeroCrossingRate.append(float(sum) / 255)
print('Zero Crossing Rate:\n', zeroCrossingRate)
print("len of zero crossing rate: ", len(zeroCrossingRate))
return zeroCrossingRate
time1 = np.arange(0, nframes/256) * (1.0 / framerate)*256
ax2 = plt.subplot(2, 1, 2)
my_x_ticks = np.arange(0, time[159999], 0.5) # 159999
plt.xticks(my_x_ticks)
plt.plot(time1, calZeroCrossingRate(wave_data), "r-") # r-代表红色
plt.xlabel('Time/s')
plt.ylabel('Ampltitude')
plt.title('Zero Crossing Rate')
plt.show()
运行结果:
[ 0 0 -1 ... 2 0 0]
len of wave_data: 160000
Zero Crossing Rate:
[0.3607843137254902, 0.5019607843137255,……,0.16470588235294117, 0.21176470588235294]
len of zero crossing rate: 625
图:
为了对比一下,我放上数字0的短时平均过零率图:
在下语音小白一枚,若有写错的地方,请多多指教。