Profile - CN321


CN321

基于语音识别及RFID的多重安防门禁监控系统

广西师范大学
物理与电子工程学院






Advisor

Name: 王志高

Members

No. Name English Name
1 甘宇健 Gan Yujian
2 王明娟 Wang Mingjuan
3 彭宇林 Peng Yulin

Project Paper

1. 设计概述 (Preliminary Paper)

随着生物识别产品的不断问世,其在安防门禁系统的应用将越来越多,生物识别产品的高安全性和防盗等特性正被越来越多的客户接受。由此可预见,在不久的将来,生物识别产品必将成为安防门禁系统前端识别设备的强大力量,在安防领域必将发挥越来越大的作用。

生物识别技术是利用人体生物特征进行身份认证的一种技术。生物特征是识别人身体上唯一的与他人不同,可以测量或可自动识别和验证的生理特征或行为方式。

用于生物识别的生物特征有指纹,掌纹,脸形,虹膜,视网膜,脉搏,耳廓等,行为特征有签字,声音,按键力度等,基于这些特征,人们已经发展了指纹识别,掌纹识别,面部识别,发音识别,虹膜识别等多种生物识别技术,也相应地生产了各种生物识别产品。目前市场上使用的最多是指纹仪,其次是脸形识别产品,掌纹仪,虹膜仪和声纹仪,生物识别产品具有以下特点:

1)高安全性;

2)技术先进;

3)不易仿冒;

4)防盗取。

由于生物识别产品具有技术先进,安全性能高,身份确认唯一等特点,目前越来越多的集成使用在安防门禁系统中,生物识别产品采用的技术不同于传统的RFID技术的门禁系统,因此将生物识别产品集成使用在采用传统RFID技术的门禁中,是一项合理且创新的尝试。

鉴于实际应用,需要考虑人类特征符合身份认证的要求,从安全性,可接受性,生产成本,实时性能方面, 本设计采用了一种易获取的生物特征——语音,并结合射频识别技术的多重身份认证保障用户的更高安全防范,从而确保人生财产的安全。相对于传统的磁卡及IC卡技术,RFID具有非接触、阅读速度快、无磨损等特点,在最近几年里得到快速发展。

本系统设计理念新颖,其软硬件均可裁剪,主要分为高端和低端两种设计方案(实际系统设计制作以高端型为制作蓝本),故应用非常广泛。高端型系统具有语音识别、RFID卡识别、动态随机密码保护等多重安防功能。高端型系统设计主要面向安全级别要求较高的原子能实验室,生产基地等场所。经过软硬件裁剪,本系统也可应用于图书馆,住宅小区等安全要求相对较低的场所。

本系统整体设计基于DE2开发平台,采用基于Nios IISOPC技术。Nios II 软核集成在FPGA内部,采用这种解决方案的优点是实现了片上系统,减少了系统的物理体积和总体功耗;同时系统控制核心都在FPGA内部实现,可以极为方便地更新和升级系统,大大地提高了系统的通用性和可维护性。此外,由于本系统需要大量的高速数据运算,在设计中我们充分利用了Cyclone II 芯片的丰富的硬件乘法器,实现了语音信号的端点检测模块,FFT快速傅立叶变换模块,DCT离散余弦变换模块等硬件设计模块。为了提高系统的整体性能,我们充分利用了FPGA的高速并行的优势,以及配套开发环境中的Avalon总线自定义硬件外设,使系统处理数字信号的能力大大提高,其性能远优于传统的微控制器和普通DSP芯片。综上所述,我们采用了基于Cyclone II的系统设计方案。

 

(Revision: 4 / 2008-06-15 17:48:54)

2. 功能描述 (Final Project Paper)

    本系统采用SOPC系统设计,控制方式灵活。以下为本系统在实际运用中的示例图(如图1所示)。

 

 1  实际应用示范图

本系统采用SOPC系统设计实现了语音识别及RFID的多重安防门禁监控系统:一方面主要对 语音信号实时采集,存储,并通过各种DSP运算模块进行分析和处理;另一方面主要实现射频识别。

其功能描述如下:
1.实时语音信号采集模块
话筒线入输入,语音通过音频编解码芯片WM8731,以8KHZA/D采样率转换成16PCM码缓存。 
 
2.语音信号预处理模块
算法处理的一部分,主要功能是把缓存区的数据归一化,一阶高通滤波,分帧,按帧计算短时能量和短时过零量,去除首尾的静音和噪声,得到有效语音帧,存入SRAM。为语音特征提取做准备。
 
3.语音信号特征提取模块
按帧读取SRAM中的语音数据,经过FFT模块得到一帧数据的功率谱,功率谱在24MEL滤波器组加权后取对数,再经过DCT离散余弦变换模块,得到12维倒谱域特征矢量,作为测试模版。这样把一帧多维时域数据压缩至12维倒谱域数据,为模板匹配提供了高效处理,降低了识别的难度和计算量。
 
4.随机密码模块
为了提高安全防范,用户将限制在系统的指示范围内录音,随机密码模块每次都会给出三个随机码的排列组合,用户只能按照提示,录制语音数据,避免了他人盗取客户声音录制数据而非法闯入系统。 
 
5.语音识别模块
用户预先录制语音样本,并运用PC机上的MATLAB平台对这些语音样本进行特征参数提取,最终以文件形式存入SD卡。Nios II控制SD卡驱动获取所有用户模板,在Nios II上实现软件算法DTW动态时间规整,将测试模板与SD卡中的用户模板比较欧式距离,得到设置的语音密码识别结果。
 
6.LCD液晶屏显示模块
完成菜单显示,提示用户进行ID卡鉴别,进而回显系统产生的随机密码,提示用户根据随机密码进行语音输入操作,待处理完成,送识别结果回显,提示用户的合法性。
 
7.射频识别模块
     射频识别系统由两部分组成:射频卡和读卡器。射频卡用作承载用户信息载体,读卡器具有读/写功能,本系统通过Nios II处理器读/写射频识别模块的数据信息,在语音识别前开启门禁系统的第一重身份认证,再通过语音识别控制门禁控制器最终开启门禁系统,突破传统安防系统单一射频识别的缺点,提高安防性能。
 
 8.监控模块
监控模块包括有温度,烟雾等受监控环境的常见参数监控。通过CAN总线远程与Nios II进行数据交互,再经过以太网为监控中心提供环境参数,便于调整受控环境。
(Revision: 19 / 2008-09-14 22:45:35)

3. 性能参数 (Final Project Paper)

 1. 资源使用情况

(1) 系统设计资源使用情况如图:
图2  系统资源利用率
(2) Frequency:116.75MHZ(fmax)
 
2. 作品性能参数
 
2.1 系统语音识别率
试验用户数:10个
试验次数: 20次/人
识别率: 93%
拒识率: 7%
 
2.2系统运行速度对比
为了显示本系统设计性能的优越性,我们选择PC机与之对比。PC的配置性能如下:
表1 PC机配置

品牌
CPU
时钟(主频)
内存
软件平台
联想
Inter Pentium D 940
双核处理器
3.2Ghz
1024 Mbyte
DDR2
MATLAB 6.5

 
2.2.1语音MFCC特征提取:
PC MATLAB 6.5上运行耗时截图:
 
图3  PC MATLAB 6.5上计算一次MFCC耗时截图
在本系统中,MFCC系数提取采用纯硬件描述语言实现,其工作在50Mhz下时,计算一帧MFCC系数所用的时间约为60us。运行速度对比如下表:
表2 PC与DE2平台运行MFCC系数提前速度对比

测试平台
处理对象
时钟
处理耗时
DE2平台性能提升
PC
MFCC系数提取
3.2Ghz
47ms
783
DE2开发平台
50Mhz
60us

 
2.2.2语音端点检测:
运行速度对比如下表:
表3 PC与DE2平台运行端点检测速度对比

测试平台
处理对象
时钟
处理耗时
DE2平台性能提升
PC
语音端点检测
3.2Ghz
62ms
33.2
DE2开发平台
50Mhz
27Mhz
1.87ms

 
2.2.3 从语音录入到识别结果输出:
语音识别的运行时间与端点检测后截取出来的语音帧长有关,在本系统中,将语音信号以256个语音采样数据为一帧(8Khz采样率)。以下运行时间对比是基于三段分别为131316帧的语音数据进行的运行时间对比:
运行速度对比如下表:
表4 PC与DE2平台对三段语言识别运行时间对比

测试平台
处理对象
时钟
处理耗时
DE2平台性能提升
PC
三段语音识别
3.2Ghz
2.45s
6.2
DE2开发平台
50Mhz
397ms

MFCC系数提取中,包含大量的复杂运算:FFT运算、取对数、浮点乘除法等等,尽管PC机的主频很高,但其在这些复杂的数字信号处理中运算效率不够高,计算一次需要几个时钟周期,而我们设计的基于FPGA的数字信号处理采用并行处理方式,以较少的资源消耗换取了较大的性能提升。
而在端点检测中,只有Fir滤波部分需要大量的乘法运算,其他部分大致都是加法和判断处理状态转移过程,此时PC主频高的优势得以发挥,拉近了与硬件实现方法的差距。
在最后的性能对比中,由于识别算法DTW是基于Nios II实现,并非全硬件实现,所以最终两者性能差距大致在6倍左右,这已是一个非常好的成绩,完全满足本系统设计的要求了。
 
2.3 与竞争方案的性能对比
我们选择了较为有说服力的:国家自然科学基金资助项目( 90407017) 、北京市教委基金资助项目(KP2701200201),来与我们实现的方案进行对比。该项目在《小型微型计算机系统》20078月第8期,发表的论文《基于FPGA 的嵌入式语音识别控制系统》展示其设计的系统。该系统基于Xilinx公司的Virtex II Pro50 FPGA芯片,处理器为芯片内部的硬核Power PC 405。我们将两个方案进行对比:
表5 本方案与竞争方案对比
 
本系统设计方案
同类竞争方案
价格
功耗
较高
特征提取时间(模板形成时间)
 短  (0.003s)
长  (0.69s)
DTW计算时间
较长 (0.39s)
短  (0.02s)
整体响应时间
短   (0.4s)
稍长 (0.7s)
分析两方案的异同,本方案采用相对流行的MFCC语音特征提取办法,而对比方案采用LPCC语音特征提取办法。就计算复杂程度而言,MFCC的运算量较多。本系统充分利用Cyclone II的资源和SOPC的设计理念,设计了基于Avalon总线的MFCC系数提取模块,并用DMA进行数据搬运。这使得更为复杂的语音特征提取时间较竞争方案的时间更短。
在识别部分,两方案均采用DTW识别算法。而竞争方案采用了硬件实现的方法,性能较我们好。
就总体情况而言,若同为10个参考模板,本方案模板形成与识别的总时间在0.4s左右,而竞争方案模板形成与识别的总时间在0.7s左右。我们以合理的设计思路、较低的设计成本取得了良好的性能参数。
 
2.4 系统误差分析
 
2.4.1 MFCC特征提取误差分析:
为了验证MFCC模块运算正确,我们构造了一个256元素的一维数组进行MFCC系数提取:[1,2,3,4,0,0,0,0……,0,0,0];以下为该矩阵分别在MATLABNios IDE平台运算后提取出来的数据:
           

       图4  MATLAB运算结果                                                     图5  MFCC模块运算结果

左图为在MATLAB 6.5上对上述矩阵进行MFCC系数提取后的截图,而右图为在Nios IDE软件平台上采用Nios处理器从AVALON总线上读取上述矩阵进行MFCC系数提取后的数据截图。从图中的数据可以看到,两者间的绝对误差大约保持在0.0001左右,这个精度已经可以满足本系统的要求。
 
2.4.2 CORIC对数运算单元误差分析:
CORIC对数运算是属于MFCC系数提取模块的一个部分,尽管上文已经对MFCC特征提取误差范围做出了评价,但由于在整个MFCC系数提取中,只有对数运算没有采用标准的直接求取法来求解(事实上也很难采用直接求解法在硬件平台上求解对数),所以对其做误差评价也是很有必要的。
根据CORDIC的计算原理,我们在MATLAB上建立了一个CORDIC对数运算的仿真模型,该仿真模型的计算结构与FPGA端一致。
下图为CORDIC对数运算模型与MATLAB标准对数运算函数结果对比图:
图6  CORDIC对数运算误差分析图
图中蓝线为标准对数运算的结果,而红线为我们在FPGA端设计的对数运算结果。从图中可以看出,我们设计的CORDIC对数算法仅在约2.97—3.03的范围内产生误差,其最大误差产生在输入值为3的时候,此时:ln(3) = 1.0986 ,而我们设计的CORDIC对数运算为:1.1080,其绝对误差为0.0094;相对误差为0.86%。这个精度已经满足本设计的需求,而且除了2.97—3.03这个范围外的CORDIC对数运算与实际的对数运算相比基本上没有误差。
注:在此只进行2.000——3.999数据的效验是因为CORDIC对数运算的数据输入范围为:(2.000——3.999)*2nln(x*2n)=ln(x)+n*ln(2),所以只需验证2.000——3.999CORDIC对数运算结果即可。详细的设计论证请参考本文第四部分的设计方法。

 

(Revision: 4 / 2008-09-15 17:59:14)

4. 设计结构 (Preliminary Paper)

1.系统主要框架设计:

系统设计充分利用Cyclone II芯片及DE2开发板硬件资源。系统主要硬件模块为:射频识别模块,SD卡读写模块,音频采集模块,RS232通信模块,以太网控制模块,液晶显示屏等。而系统主要软件模块包括:基于Verilog HDL的高速语音信号预处理模块,基于Nios II的语音信号匹配识别模块,RFID识别模块,液晶显示控制模块,以太网控制模块,SD卡文件系统控制模块等。系统主要框图(如图7所示):

 

系统总体结构

2.主要算法流程设计:

高速语音信号处理模块由以下几部分组成:语音端点检测模块,语音特征提取模块。语音端点检测模块主要包括:FIR滤波器的设计,能量的计算,过零率的计算。语音提取模块主要包括:基2256FFT模块设计,MEL滤波器组的设计,DCT离散余弦变换模块等。

这部分处理采用Verilog HDL设计,应用流水线和乒乓操作,实现了数据的高速处理。

网络模块通过以太网技术,利用TCP/IP通信协议实现DE2实验板与监控中心的PC机系统终端的网络传输。系统终端利用.NET应用软件实现网络通信GUI接口,以实现上位机与下位机的网络通信,以便管理系统用户数据库。算法主要流程(如图8所示):

 

8  算法流程图

 

(Revision: 4 / 2008-09-14 21:58:14)

5. 设计方法 (Final Project Paper)

           本系统基于DE2开发板进行设计,充分利用了DE2板上丰富的资源,系统的TCP/IP网络通信基于DM9000A芯片,语音采集基于WM8731语音编解码芯片,语音的加密数据保存于SD卡,并采用了板上的LCD 作人机友好交互。同时系统利用DE2的外扩插槽扩展自己设计的射频识别读卡器和CAN总线接收器。

在设计过程中,充分考虑SOPC系统的特色,充分发挥了SOPC系统在数字信号处理中的并行运算优势和Nios自定义指令加快程序运行速度的优势。下图为本系统的SOPC builder定制图:

图9  系统SOPC builder定制图
1 系统硬件设计
 
1.1 识别模块设计实现方法
RFID识别模块采用的是ZLG500B系列的射频识别模块,而Mifare 卡则采用NXP公司的MF1S50系列射频卡。该模块基于NXP高集成度读卡芯片MFRB500。当读卡模块初始化工作完成后,便开始监测 Mifare卡,Mifare卡一共有五种状态,以下是Mifare卡的状态转移图。

图10  Mifare卡的状态转移图
ID 卡是客户身份卡,装载客户的ID信息和自行设定的48bit密码,当客户刷卡成功,蜂鸣器提示一重认证通过,开启语音识别认证,确保门禁系统的安全。
 
1.2 环境参数监控模块设计实现方法
本模块模拟监控实验室温度的过程,由于在实际实验室中,各种干扰信号及通讯距离较远,故本模块采用CAN总线进行通讯。CAN(Controller Area Net)是一种现场总线,主要用于各种过程检测及控制,其具有抗干扰性强、通信距离较远等优点。在本模块的设计框图如下:

图11  环境参数监控模块原理图
本模块采用SJA1000做为CAN总线控制器,CAN总线收发器则采用CTM1050T高速隔离收发器。在实物设计中,我们选择对环境的温度进行实时监控,如果要对其他的环境参数进行监控,只需更换传感器即可。
环境参数实时采集卡的设计基于AT89S51单片机,单片机采集温度数据后,将温度h数据通过CAN总线发送到Nios II。下图为环境参数采集卡CAN总线网络连接图:

 

 

图12  CAN总线网络连接图
 
1.3 语音采集与预处理模块
本模块要实现的功能是采集语音信号,并对其进行FIR滤波、语音数据归一化、语音的端点检测处理。
 
1.3.1语音采集单元:
语音采集部分采用DE2板上的WM8731进行设计,通过I2C总线设置后,WM8731就会一直工作在设定的模式中。语音采集单元包含一个PLL,一个I2C总线控制器、一个左对齐模式下的语音采集控制器。
PLL给予WM8731工作在18.4Mhz的时钟频率下,通过I2C总线控制器设置WM8731工作在8Khz的采样频率下。下图为在嵌入式逻辑分析仪(SignalTap II Logic Analyzer)下图语音采集控制器的采样图:

图13  语音采集控制器的采样图
从图中可见,左对齐语音采集过程一共有19个脉冲,其中前16个脉冲为有效语音数据提取脉冲,后三个脉冲为将来处理扩展预留。有效语音提取出来之后便存入SRAM中。本模块通过计数器,从启动录音开始,自动录制4s的语音信号。
 
1.3.2语音归一化处理单元:
语音归一化处理典型的计算公式为:DATA/MAX(DATA),如果按照这种标准归一化处理,则需要消耗2个硬件乘法器资源。本着节约片上资源的设计理念,我们创新地提出了一种经过简化的归一化处理模型,该模型只需移位即可实现归一化运算。流程如下:
第一步:先取语音数据的最大值MAX(DATA)。
第二步:令m>= MAX(DATA)且m=2^n(n>=8),寻找一个最小值n。
第三步:将归一化运算由DATA/MAX(DATA)改为DATA/m。在数字电路中除以2^n只需简单的移位即可实现。
鉴于我们这里将16位的原始语音归一化为8位的小数,所以只要将每一个语音数据右移(n-8)位即可。当n小于8时,则无需再移位。
经过修改后的归一化运算,运行速度更快,资源消耗更少,其不足在于牺牲一点采样精度而已。
 
1.3.3 Fir滤波器运算单元:
由于原始录入的语音高频部分的频谱比低频部分的成分少,为此要在预处理中加入预加重处理,预加重的目的是提升高频,使得信号的频谱变得平坦。一般采用的是一阶高通滤波器,系统函数为 。我们利用了DSP Builder设计了一阶FIR滤波器。方法如下:
第一步:由系统函数得到差分表达式:
第二步:在DSP Builder 中生成 Simulink 系统仿真图,并生成VHDL代码。
设计的FIR模型顶层文件如下:

图14  FIR模型顶层文件
从DSP builder的截图可以看出,Fir滤波器的输入是16位的Q8定点小数,运算后输出也取16位Q8定点小数。下图为Fir在Quartus II的仿真图:

图15  Fir仿真图
我们在MATLAB对该仿真结果进行验证:

图16  Fir仿真结果验证
 
1.3.4语音端点检测运算单元:
由于原始数据中含有噪声和无声段以及静音段,为了获取有效语音数据,必须从原始数据中截取有效的语音数据。在端点检测中,我们把语音分为:静音段,过渡段,语音段,结束段。语音端点检测状态转移图如下所示:

 

图17  语音的端点检测状态图
端点检测后的语音数据仍保存于SRAM中。我们将DE2板上的512KB的SRAM划分为5个区:地址0——0x7fff为原始语音数据保存区,0x8000——0xffff为经端点检测后的第一段语音数据(在端点检测之前已对该段语音数据进行归一化处理与Fir滤波处理)保存区。0x10000——0x17fff为经端点检测后的第二段语音数据保存区。0x18000——0x1ffff为经端点检测后的第三段语音数据保存区。0x20000——0x3ffff(0x3ffff 是SRAM的最终地址)为将来扩展而预留。
下图为语音预处理模块处理我们录进去的“大家好“效果图。本图是通过DE2控制面板软件读取SRAM前256KB数据(地址:0——0x1ffff)在MATLAB软件上画出来的图形:
图18 语音的端点检测效果图
从图中可以看出语音预处理模块可以很好地完成Fir滤波、语音归一化、语音端点检测的任务。
 
1.4 MFCC特征提取模块
在设计之初,我们曾计划将MFCC模块做成一个Nios II的指令,以此加快其对语音数据的处理速度。但是每次MFCC运算的输入数据为256Byte,如果将MFCC做成Nios II的指令,这就意味着需要Nios II从SRAM读取(搬运)这大量的语音数据。此时Nios II的工作效率和最终系统的运行速度将会大大降低,所以我们将MFCC模块做成了一个Avalon总线的从设备,使用DMA来为它搬运数据。设计结构图如下:

图19  识别部分整体设计结构图
在介绍MFCC中各运算单元实现步骤之前,有必要详细说明一下本系统的数据格式变换,数据变换的原因下文会有讲解。在上文中提到,语音经过归一化处理后,成为16位的Q8格式小数语音信号,整个MFCC数据格式变化如下图所示:

 

图20  FPGA中数据格式变化
MFCC特征提取模块包含:FFT运算、数据取模运算、Mel滤波器运算、对数运算、DCT离散余弦变换、一阶倒谱提升。由于篇幅的关系,在此仅选择其中最复杂的三个部分进行介绍。
 
1.4.1 FFT运算单元
 
(1) FFT设计方案对比
在FFT运算单元设计之初,我们有两个设计方案:浮点型FFT和定点型FFT。两者的区别在于:前者计算的值的范围大,而后者所能计算的范围较小。在前文我们提到,在本系统中语音归一化处理后变为8位有效数据,如果采用浮点FFT,则得将原来的八位数据扩展为32位,而采用定点的FFT则只需在原来数据位宽的基础上扩充一倍即可。无论逻辑资源的消耗、乘法器资源的消耗还是FPGA内部存储资源的消耗都是定点型FFT比浮点型FFT来得少。基于上述原因,本系统采用定点FFT。
 
(2) 定点FFT的设计方法
定点FFT设计的关键就在于蝶形结单元的设计和地址产生逻辑的设计。蝶形结是FFT处理器的基本运算单元,本模块的蝶形结消耗了8个硬件乘法器,一半用于数据的实部相乘,另一半用于数据的虚部相乘。鉴于Cyclone II的乘法器均为9bit,因此我们在蝶形运算单元将原来的8位小数扩充为10位,组成高8位为整数位,低10位为小数位的Q10格式数据。这样即充分利用了现有资源又提高了FFT运算的精度。蝶形结采用流水线设计,数据输入到输出有6个时钟周期的延迟,由于蝶形运算数据的连续输入,所以每计算一次蝶形结只需一个时钟周期。
FFT模块设计的难度主要在地址产生逻辑,地址产生逻辑的设计直接影响FFT模块的性能和FFT运算结构。我们的FFT地址产生模块按照标准FFT地址跳变方式设计并满足蝶形运算单元流水线运算的需要。为了得到高速的FFT处理速度,我们在FFT模块中开辟了两个RAM数据存储区,以此组成典型的乒乓操作模式:在FFT第一级运算中,数据从RAM1经蝶形单元计算存入RAM2,在第二级中则正好相反,依次类推……下图为FFT整体设计框图:

 

图21  FFT结构功能图
在这种设计结构下,计算一次蝶形运算只需要一个时钟,处理速度达到同类设计结构的最高极限。经Quartus II综合后FFT模块的时钟可达162Mhz,消耗的逻辑资源约为700多。在100Mhz时钟下,计算一个256点FFT的时间不到11us,达到了数据高速处理的目的。以下为FFT模块仿真图:

图22  Q10格式256点FFT时序仿真
对上面Q10格式的FFT仿真结果进行验证:从图中可以看到FFT运算结果的头几个数为:0x0A0000000,0x09FD3FE0C,0x09F0FFC19……按照Q10格式,这三个数分别为:10、9.9882-0.48828i、9.9404-0.97460i。而MATLAB计算的结果为:10、9.9849 - 0.49054i、9.9399 - 0.97911i,两者相差不大,定点FFT运算模块与MATLAB计算的结果相比存在小小误差。
为了更直观地验证FFT模块计算的正确性,对一帧实际语音数据进行FFT计算:下图中蓝色代表FFT 模块对一帧语音数据经过FFT 运算后的频谱图,红色代表同样的语音数据是用MATLAB 指令fft(data)运行的仿真图,可以看到我们自行设计的模块能达到应用的要求,并且与MATLAB软件有同样的效果。

图23  一帧语音数据的频谱图
 
1.4.2 MEL滤波器的设计
MFCC(Mel-Frequency Cepstral Cofficients)的分析着眼于人耳的听觉特性,因为,人耳所听到的声音的高低与声音的频率并不成线性正比关系,而Mel频率尺度则更符合人耳的听觉特性。所谓Mel 频率尺度,它的值大体上对应于实际频率的对数分布关系。Mel频率与实际频率的具体关系可用下式表示:
Mel(f)=2595lg(1+f/700)
这里,实际频率f 的单位是Hz。根据Zwicher 的工作,临界频率带宽随着频率的变化而变化,并与Mel频率的增长一致,在1000Hz 以下,大致呈线性分布,带宽为100Hz左右;在1000Hz 以上呈对数增长。类似于临界频带的划分,可以将语音频率划分成一系列海明窗滤波器序列,即Mel 滤波器组。
在本系统中,此MEL滤波器组是一个24阶的海明窗滤波器,此滤波器系数是一个24X128的矩阵,而在这个滤波器系数组中,有许多的系数都是0,如下图示:

图24   部分MEL滤波系数在MATLAB软件上的截图
从图中可以清晰看到,MEL滤波系数组大部分元素均为0。对该系数组在MATLAB下调用plot函数绘图可以看到Mel滤波器系数组的图形:

图25  MEL24阶的海明窗滤波系数组
从上图可以发现Mel滤波系数组每一阶的非零数据是不相同的。也就是说想在FPGA上构造一个与C语音类似的稀疏矩阵,难度很大。而如果将整个滤波系数矩阵的24*128个系数均存入FPGA的存储区中,又会造成非常大存储资源浪费。
为了以最少的资源、最快的速度实现Mel滤波器,我们将Mel滤波系数组设计成单一状态转移结构。即采用一个计数器,给予每一级Mel滤波一个特定的值,从Mel滤波计算开始,该计数器便开始计数,利用该计数器便可决定Mel滤波器的计算状态。采用这种设计方式便可在FPGA中仅仅保存Mel滤波系数中的非零系数,且综合后的运行速度可达180多Mhz。下图为Mel滤波器第一阶计算的结果:

图26  Mel滤波器第一阶计算仿真结果
 
1.4.3对数运算单元设计
MFCC 中语音信号的幅度谱在每一个滤波器组中累加将得到一个较大的加权值,算法中需要对各个加权值取对数来达到压缩数据的目的。
 
(1)FPGA对数算法运算方案对比
通常情况下FPGA实现对数运算的方法一般采用一下三个:
方法一:采用查表的方式来实现
方法二:采用泰勒级数来近似这个函数,也就是:

方法三:基于坐标旋转数字式计算机(Coordinate Rotation Digital Computer,CORDIC)的算法。
对比三个方法,其中方法一的实现最为简单。但是方法一的计算精度与所制作的表的大小成正比,也就是说采用方法一实现较高精度的对数运算将要耗费巨大的存储器资源。显然在本系统中并不适用。
而方法二和方法三,在其收敛区间上均可以取得较好计算结果。在方法二中,每一个级数的计算需要3到4个的硬件乘法器。如果采用各级共享乘法器的设计方法,则计算一次对数需要较长的时间。而如果使用流水线结构设计,又会消耗大量的乘法器资源。
采用方法三的CORDIC算法具有突出的优势:不需要硬件乘法器,所有运算只有移位累加;可以使用流水线方法,以提高工作频率与效率;也可以使用循环迭代方法,以节约硬件资源。其计算精度与运算迭代次数成正比(也就是逻辑资源)。我们设计的15次流水线迭代的CORDIC对数运算单元消耗的LE约为1100左右。
对比方案二和方案三,显然方案三在各个方面都具有突出的优势。故本系统采用CORDIC算法实现对数运算。
 
(2)CORDIC对数运算实现方法
三角函数的CORDIC算法最初由Jack Volder提出,应用与实时导航的数字处理,John Walther等人将CORDIC理论进行了扩展。现在CORDIC算法已经应用与众多领域。
本文不涉及过多的理论,关于CORDIC的资料可以参考《A survey of CORDIC algorithms for FPGA based computers》一文。要实现CORDIC对数运算的关键就是找到它的迭代多项式。本系统采用的是利用CORDIC结构实现双曲线坐标变换,而双曲线函数可以很方便转换为对数函数,在本系统中采用的迭代方程推导如下:

进一步分析这一迭代方程,对该多项式迭代后的结果为:我们所需的ln(t)等于2* 。为了省去乘2这一步,我们再将迭代多项式优化为:

在此迭代多项式下,只需令x的初值等于t+1,y的初值等于t-1,z的初值等于0。经过n次迭代后,ln(t)=
通过对后一个多项式的迭代运算,我们就可以得到所需的对数运算结果。需要注意的是,在这个CORDIC迭代方程中无法满足整个自然域的实数运算,此时可以通过简化公式进行化简:
 
可以发现, 正好是浮点格式数据。也就是说,只要输入CORDIC对数运算的数据为浮点格式,就可以轻松处理大范围的实数。
为了对数运算的方便,本处没有采用标准浮点格式,而是针对CORDIC对数运算的需要设计了一个简单的浮点格式。该浮点格式表示规定为:。这样定义的原因是:CORDIC对数运算方程y的初始输入变量为:t-1,当t趋近于1时,y趋于0,这样迭代结果就会产生较大误差。所以在此直接规定了t的取值范围,防止y=0的情况发生。又MEL滤波器输出的数据恒为正数,所以浮点的符号位也可忽略。最终这种简化的浮点格式为:20bit为t,后12bit为2的指数位(指数位为有符号数据)。
下图为对数运算在Quartus II仿真结果:

图27 CORDIC对数运算仿真
浮点格式0x20000800 = 2.0*2^(-2048),ln(2.0*2^(-2048))= -1418.87228,而CORDIC对数运算的仿真结果采用Q16定点小数表示,0xA752172 = -1418.86936 两者的绝对误差:0.003。
对后一个仿真结果的验证:浮点格式0x22000000 = 2.125*2^(0)=2.125,ln(2.125)= 0.7537718,仿真结果Q16定点数据:0xC106 =0.7539978 两者的绝对误差:0.0002。
 
(3)定点小数转浮点格式小数的实现方法
上文提到,在对数运算单元中,输入的数据为浮点制的格式。但我们之前的数据一直都采用定点小数格式,所以必须在对数运算之前将定点格式的数据转换成浮点格式的数据。
定点转浮点格式采用状态机的方法设计,下图是其状态转移图:

图28  定点转浮点格式状态转移图
按照这一流程便可将原来的32位Q16格式数据转换为CORDIC对数运算设计的浮点格式数据。
下图为定点格式转浮点格式的Quartus II仿真结果:

图29  定点格式转浮点格式仿真结果
从图中可以看到,输入32位Q16格式0x00011000=1.0625,
0x22000fff=2.125*2^(-1)=1.0625。同理对后一个仿真结果验证:输入Q16格式0x12345678=4660.3377,0x2468A00B=2.275542*2^(11)=4660.3125。结果均在误差范围之内。
 
1.5 随机密码产生模块
随机密码产生模块采用伪随机序列(也称为m序列)的原理进行设计。伪随机序列在通信、雷达、导航以及密码学等重要的技术领域中获得了广泛的应用。在本系统中,随机密码起到了非常重要的作用,在每次语音识别之前,系统通过随机序列得到随机数,要求用户录入相对应的语音密码,这就相当于扩大了系统密码库。即相当于将10个语音密码扩展为1000个语音密码。伪随机序列采用移位反馈寄存器设计,下图为设计顶层结构图:

图30  随机密码产生顶层结构
在伪随机序列产生的这些移位寄存器中,不允许全零的状态出现。所以我们设置了一个延时复位单元,在系统上电后一段微小的时间后,图中的所有移位寄存器都会被置1。下图为随机密码模块仿真图:

图31  随机密码模块仿真
 
1.6 自定义指令
在本系统中,定制了基于Nios II的DTW计算指令,DTW的计算结果取值范围较大,一般从几百到几十万,而用于计算DTW的MFCC系数的值大多从0到正负十几之间,如果此时继续采用定点数据,显然已经无法满足系统要求。所以,我们自己设计定制了计算DTW的浮点Nios指令。
定制的指令包括:
1)定点Q16格式数据转浮点格式数据
2)浮点相加指令
3)浮点欧式距离计算指令
4)浮点数据大小比较指令
5)浮点数相乘指令
指令定制截图:

图32  自定义指令
通过这些指令的定制,使得本系统在DTW识别算法的计算时间缩短了4.12倍:
表6  自定义指令运行时间对比
实现方法
运行时间
自定义指令速度提升
直接采用程序实现DTW
1429ms
 
4.12
采用自定义指令实现DTW
346ms
可见在Nios中自定义指令可以获得很好的性能提升幅度。需要注意的是,在Nios IDE中,如果直接定义浮点型变量无法直接输入到自定义指令中进行运算,所以本系统采用alt_u32型变量来“装载”浮点变量。当然,这样处理后,就不能在Nios IDE中直接采用+-*/等运算符直接对这些变量进行运算了,只能采用自定义的指令来操作。
 
2.系统软件设计
本系统采用了两个Nios II处理器,一个负责识别算法实现,另一个则负责与上位机的TCP/IP网络通信等。
 
2.1 识别算法的程序流程(CPU_1)
系统上电复位后,液晶屏上将显示系统初始化成功,将等待用户刷卡,由串口接受合法用户的ID号,非法用户将无法进入下一步语音识别,并在液晶屏上显示非法ID,验证ID 合法后,产生随机密码并液晶回显,并开始采集四秒钟语音数据,进入语音识别验证。最后系统通过TCP/IP网络发送识别结果给远程监控中心。下图为CPU_1的程序流程图:

图33   CPU_1的程序流程图
 
2.1.1 DTW识别程序设计
在孤立词语音识别中,最为常用的方法就是DTW 动态时间规整算法,它与其它识别算法如HMM算法在相同环境条件下,识别效果相差不大,但HMM算法的实现要复杂得多,这主要体现在HMM 算法在训练阶段需要提供大量的语音数据,通过反复计算才能得到模型参数,而DTW算法的训练中几乎不需要额外的计算。在本系统中考虑到算法复杂程度以及对系统速度性能的要求,选择兼顾识别效果和低复杂度的高效算法DTW。
算法实现流程:
(1)首先读取SD卡里面的语音模板库,客户的语音参数模板都是以经过特殊处理的二进制文件存放在SD卡内。Nios II读入文件,作为语音特征矢量R。
(2)特征参数提取模块组件处理得到的实时采集的测试客户模板,作为语音特征矢量T。
(3)比较T和R之间的相似度,即使计算累积距离,距离越小则相似度越高。这一失真距离,可采用动态规划的方法。下图是把测试模板的各个帧号在一个二维直角坐标系中的横轴标出,把参考模板的各个帧号在纵轴标出,通过这些帧号的整数坐标画出一些纵横线即可形成一个网络,交叉点表示测试模式中某一帧与训练模式中某一帧的交汇点。DP算法可以归结为寻找一条通过此网格中若干格点的路径,路径通过的格点即为测试和参考模板中进行距离计算的帧号。路径的选择必须从左下角出发,在右上角结束,且生长点的斜率必须在1/2到1之间。如下图所示。

图34  DTW搜索路径
以下是算法流程图:

图35  DTW 算法流程图
 
2.1.2 FAT文件系统的移植与实现
FAT是Microsoft推出的文件系统,具有高度兼容性,目前仍然广泛应用。FAT(File Allocation Table)是“文件分配表”的意思。顾名思义,就是用来记录文件所在位置的表格,它对于存储盘的使用是非常重要的,假若丢失文件分配表,那么存储盘上的数据就会因无法定位而不能使用了。
在本系统中,FAT文件系统在一张1G的SD卡中实现,所以选择移植FAT16文件系统。FAT16使用了16位的空间来表示每个扇区(Sector)配置文件的情形,故称之为FAT16。
要实现FAT16文件系统,最关键就是对FAT16目录项32个字节的操作,下表为该目录项32个字节的定义:
表7  FAT16目录项32个字节的定义
字节偏移(16进制)
字节数
定义
0x0~0x7
8
文件名
0x8~0xA
3
扩展名
0xB
1
属性字节
0xC~0x15
10
系统保留
0x16~0x17
2
文件的最近修改时间
0x18~0x19
2
文件的最近修改日期
0x1A~0x1B
2
表示文件的首簇号
0x1C~0x1F
4
表示文件的长度
在SD卡中进行读取二级目录文件的程序流程图:

图36  SD卡操作流程图
如果要进行三级目录文件读写,只需重复上述黄色部分的流程即可。而如果要进行根目录下文件读写,则只需去掉黄色部分流程。由此可见,其实文件夹在FAT16文件系统中将会占1个簇的存储空间。
 
2.2 网络通信的程序框架图(CPU_0)
CPU_0负责的工作在实时操作系统下以多任务的形式是与电脑进行TCP/IP网络通信、收集实验室环境数据和门禁识别结果等。程序整体框架如下图所示:

图37 CPU_0程序整体框架
 
2.2.1 uC/Os II 操作系统的实现
Altera公司已经为用户移植好了uC/Os-II实时操作系统,并将其像外设驱动一样当作一个软件模块集成到了Nios II IDE,在Nios II IDE环境下,用户不用修改其源文件对uC/Os-II的配置,只需通过图形界面就可以实现,使用起来非常方便。正是这些原因,在Nios系统中使用uC/Os-II操作系统非常方便。
 
2.2.2 LWIP网络通信实现与应用
LWIP全称为Lightweight IP TCP/IP stack,是一个轻量级的TCP/IP协议栈,其主要特性是以最小的资源占用实现完整的TCP/IP协议,因此特别适用于嵌入式系统。Altera公司已经在Nios处理器上为用户移植好了LWIP,并内嵌到Nios IDE中。所以在本系统的软件设计中,我们很方便地将uC/Os-II和LWIP结合到我们的系统中,并大大减少了系统开发的时间。
网络通信采用DE2板载DM9000A以太网控制器芯片。它集成了介质访问控制子层(MAC)和物理层的功能,它为嵌入式系统实现的以太网连接提供了良好、便捷的解决方案。
 
1)DM9000A驱动与LWIP的衔接
DM9000A与LWIP的衔接通过LWIP提供的几个重要的结构体实现,如下图所示:

图38 DM9000A与LWIP的衔接
例如:netif结构体作为LWIP中网络接口的基础数据类型,描述了网络接口的基本属性以及输入、输出函数。alt_lwip_dev结构体描述了符合LWIP规范的网络端口设备。alt_lwip_dev_list:设备链表。在LWIP定义的这些结构体类型的基础上,我们在主程序中定义了针对DM9000网络接口的一个结构体:alt_avalon_dm9k_if。有了这个结构体,DM9000的寄存器读写操作开始与LWIP的工作机制发生了联系。
总的设计思路是这样的:LWIP定义了一个全局变量alt_lwip_device_list,所有LWIP提供的API均可以对这一变量进行操作。而DM9000通过ALTERA_AVALON_DM9K_INSTANCE宏指令将DM9000作为alt_lwip_device_list中的一个alt_lwip_dev,使得LWIP的API函数的操作将转换为对DM9000的寄存器读写操作。
 
2)网络应用程序的开发
移植成功LWIP后,就能够利用socket API来完成应用程序的设计。本系统基于Nios IDE提供的simple_socket_server模板进行网络应用扩展。这使得TCP/IP网络通信的实现更加简单。
网络Socket通讯过程:先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。
当连接建立后,我们就可以在sss_handle_receive()函数中建立自已在TCP/IP连接中所需的任务。如下图所示:

图39 TCP/IP新建任务流程图
当TCP/IP连接断开后,再把在TCP/IP连接中建立的任务删除即可。
 
2.2.3 RFID射频识别的程序设计
RFID选择现在最为常见的MF1S50系列。系统上电复位,读卡芯片装载正确的密钥到非易失性密匙存储器,等待有RFID卡的到来,启动卡的验证 ,将验证命令发送到卡,当从卡接收到第一个报文令牌后,微控制器必须检测通信状态标志。如果通信到目前为止保持成功,则启动卡验证的第二部分。卡将会以第二个报文令牌进行响应。然后微控制器必须检测通信状态标志。如果验证已成功,则与MIFARE卡继续进行CRYPTO1加密下的通信,读出ID,卡置为挂起状态,蜂鸣器响,发送ID号。 在RFID射频识别的设计中,需要注意的是:RFID射频识别的流程如下图所示:

图40  RFID射频识别的流程图
 
2.3 环境参数采集卡程序设计
在实际设计中,环境参数采集卡是安装在离主控板(DE2板)较远的地方,直接采用主控板进行数据采集显然不合理。所以在此我选择低价、应用普遍的89S51单片机完成环境参数采集的任务。采集卡的任务就是通过相应的传感器采集环境参数,再通过CAN总线将环境参数发送到主控模块中去。
其程序流程如下图所示:

图41  环境参数采集卡程序流程
 
2.4 .上位机监控软件设计
本系统设计了一个简单的监控软件,对门禁系统实时进行远程监控。监控软件上可以看到门禁监控系统采集的环境参数变量和门禁识别结果。下图为软件运行截图:

图42  上位机监控软件运行截图
除了使用监控软件进行远程监控外,也可以使用Windows自带的远程登录命令登录到监控系统中。下图为采用windows自带的telnet命令登录本系统后的截图:

图43  DOS 命令截图
 
2.5 双Nios通信的实现方法
CPU1 和CPU2有各自的存储区,为了他们之间通信的方便,添加了一个共享的存储区以此来交换数据,为了避免两个CPU 同时访问共享的存储单元时引起资源冲突,而导致系统崩溃,这里添加了互斥核,在访问共享区时,任何一个CPU 都必需先打开互斥核,这时可以实现消息传递,然后关闭互斥核。另一CPU 同样可以通过这样的操作获取消息。设计框图如下图所示:

图44  双Nios II共享存储区交换数据
3. 系统整合与效果
本系统在语音识别部分的综合后时钟可达130Mhz左右,但在这一部分我们仅使用50Mhz的时钟,因为现在的处理速度已经能满足我们的要求,而且每次综合所得电路存在随机性,无论从稳定性还是系统功耗考虑,都是采用较低时钟。如果更换更高时钟,性能参数还能继续增加。
下面是作品在软硬件整合后运行的演示图:

 

图45  作品实物照片

 

(Revision: 13 / 2008-09-14 23:34:05)

6. 设计特点 (Preliminary Paper)

1.我们采用Nios II搭配自己设计的外设逻辑进行语音识别及RFID的多重安防门禁监控系统的设计和开发,利用FPGA的并行优势,控制系统全部集成于一片FPGA实现。这与使用MCU方案相比,系统更加小型化,集成度高、运行速度更快。除此之外,本系统设计减少了物理连接和节约了PCB面积,这样不仅降低了功耗,还增强了系统的稳定性。

2.由于我们的系统需要进行大量的数据运算,仅使用CPU进行软件计算远远无法满足速度的要求,因此我们采用Verilog HDL设计了语音识别的处理模块,本模块充分利用了Cyclone II芯片中的丰富的乘法器资源,并且在设计的过程中采用合理的流水线设计和乒乓操作,其运行处理速度完全优于现在流行的DSP处理平台。

3.我们把语音识别和无线电识别巧妙的结合在一起共同实现安全系统的防范技术,这是市场上正刚刚兴起的新型技术的结合应用,使得社会价值和市场效益将会有很大的发展空间,也是本系统设计的最大亮点,非常具有社会效益和经济价值。

4.我们充分利用了DE2板上丰富的接口资源,例如网络接口,音频接口,SD卡接口,串口,外部扩展接口等,这样解决了独立外设带来的接线复杂与互相干扰等问题,有利于我们针对性地基于FPGA设计功能强大的系统。

 

(Draft / 2008-06-12 18:09:22)

7. 总结 (Final Project Paper)

        首先感谢Altera 公司提供了本次比赛的机会,以及在比赛过程中对我们所遇到的问题所提供的帮助和支持。经过连续两个多月的学习,我们对SOPC系统有了更加深入的了解。在系统设计中使用了SOPC Builder中提供的常用IP 核,大大节省了系统开发时间,让我们的设计工作变得更加有针对性。SOPC Builder灵活的自定义组件功能充分发挥了我们的系统性能,针对我们的语音识别系统,需要实时采集大量的语音数据,也需要实时对它们处理,我们把最重要也是难度要求最高的数字语音预处理,特征提取,全部用硬件实现,并通过SOPC Builder 的友好自定义图形用户向导轻松构建了合适的SOPC 系统。

        通过此次比赛,我们对基于Nios的SOPC系统有了更深入的了解,深刻感受到了SOPC系统设计构架的博大精深。在短暂的学习过程中,我们完成了复杂的系统构架,充分利用了Altera 公司提供给我们的自由空间,比如双核协同工作,复杂IP设计,操作系统的移植,自定义指令加速软件运行时间等等。

         另外,在此次比赛过程中,我们了解到团队合作的重要性,正是因为我们在设计过程中的分工合作,每个人都负责自己熟悉的部分,并及时交流沟通,使得我们收到了事半功倍的效果,最后顺利完成了预期的整个系统。

        最后,感谢指导老师对我们的指导,也感谢所有在这段时间给予我们支持的老师和同学。

(Draft / 2008-09-14 17:38:39)