基于短时能量和短时过零率的VAD算法及其FPGA实现
FPGA中IIR滤波器的设计一般采用如图3所示的流水线结构(图中以2阶IIR滤波器为例)。这种结构的滤波器可在一个时钟周期内完成一次滤波计算[5~6], 并行度较高,但硬件上需要5个乘法器、4个加法器和若干个寄存器,占用了较多的资源。采用非流水线结构的滤波器(仍以2阶IIR滤波器为例)的结构如图4所示。其中:fifo_out为FIFO模块输出的数据,empty为FIFO是否为空的标志信号,ready_out信号为完成一次滤波计算的标志信号。此结构的滤波器每5个时钟周期完成一次滤波计算,并行度较低,但在硬件上只需要1个乘法器、1个累加器、1个计数器以及若干个寄存器。
本文引用地址:http://www.amcfsurvey.com/article/84500.htm由于本文的算法其信号的采样率只有8kHz,非流水线结构滤波器的处理速度已可以满足要求。因此,为了合理利用资源,本设计采用了基于非流水线结构的滤波器。同时考虑到系统的同步性和稳定性,所设计的滤波器每8个时钟周期完成一次滤波运算并将结果锁存。表1为两种不同结构的滤波器(系数采用18位量化,即2位整数加16位小数)在同一器件上实现的结果比较,所用器件为Altera公司CycloneII系列的EP2C5T144C7,综合工具为QuartusII 5.0,优化选项均为balanced。由表1的比较结果可以看出,虽然非流水线结构的滤波器速度比流水线的慢,但所使用的资源却大大减少,并且能在101.61ns内完成一次滤波计算,可满足实时性的要求。此模块的处理延迟为8个时钟周期。
2.3 加窗、平均能量计算模块
(1)相关公式
将通过高通滤波器的信号进行加Hamming窗处理,窗长为80个数据。处理所使用的计算公式如下:
其中,x(i)为通过高通滤波器后的信号,y(i)为经过加窗处理后的信号。
对经过加窗处理过的信号,计算其平均能量的计算公式如下:
其中,y(0)、y(1)、……、y(79)为经过加窗处理的信号,E_average为该帧的平均能量。
在加窗的计算中涉及到余弦的运算,为了节省资源及提高处理速度,采用查表法来得到0.54-0.46×cos(e×i/79)部分的数值。
(2)平方器的实现
由于平方运算与普通的乘法器相比具有一定的特殊性,因此在平方器的硬件实现上采用如下的算法来减少硬件资源并提高运算速度:
设X的二进制表示为 In In-1……I1I0,Iij为第i位和第j位的乘积。由于在平方运算中Iij=Iji,故 Iij+Iji=2Iij。因此以4bit数的平方运算为例,参考图5,可以通过合并相同项后,左移一位(相当于乘2运算)来减少部分积的位数[7]。对所得到的部分积使用Wallace压缩树将部分积压缩至两组,然后再使用超前进位加法器来得到最后结果。
由于本模块计算得到的平均能量仅用于同语音判决模块中的门限比较,出于节省硬件资源的考虑,该平均能量和语音判决模块中的门限均不化成dB单位。通过Matlab仿真验证,这种做法并不会影响到最后的判决结果。加窗、平均能量计算模块的处理延迟为5个时钟周期,图6为本模块的结构框图。图中的ready_out信号为高通滤波模块完成一次滤波计算后输出的数据可读信号,acc_clken信号为累加器的时钟使能信号。
2.4 语音判决模块
根据计算出的当前帧的平均能量以及之前帧的情况,判断该帧是否为语音帧。通过使用四个标志位:frame_attribute[2:0]和smooth来决定是否需要进行平滑,其中,frame_attribute[2:0]记录前三帧的属性,smooth记录前三帧中是否存在非平滑过的语音。此模块的处理延迟为1个时钟周期。
评论