语音信号的短时平均过零率

一、短时平均过零率的作用

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的短时平均过零率图:
在这里插入图片描述
  在下语音小白一枚,若有写错的地方,请多多指教。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值