基于SoPC的实时说话人识别控制器
来源:电子工程世界 作者:—— 时间:2010-09-13 11:14
(1)CPU设置。NiosII core选定为NiosII/f。使能嵌入式硬件乘法器。复位地址设为cfi_flash,异常向量地址设定为ssram_2M,在custom instructions中添加用户自定义指令floating Point Hardware。
(2)定时器设置。本设计使用了两个定时器。Timer用于产生内部中断采集语音样点,设其计时周期为125 μs(对应采样率8 kHz)。Timer_stamp用于插入时间标签,定时周期采用默认值。
(3)其他外设。NiosII核中还包含以下外设:片上RAM/ROM、FLASH、SDRAM、SSRAM、按键、开关、LED、音频模块、七段数码管、LCD。
3 软件流程
总体工作流程如图7所示。系统首先初始化,然后读出模板数据,等待用户按下按键。在此期间,用户应设置好系统工作模式(建模或识别)及话者代码。然后按下按键开始以中断方式采集语音,并运行函数主体。
识别部分流程如图8所示。函数首先判断语音是否已经采集完毕及LPCC算法是否已经进行到最后一帧,若同时满足则结束运算,否则继续运行。若当前帧为有效音,则计算出其LPCC,并调用DTW子函数,针对各模板分别计算距离得分。运算完所有语音帧后,便可得到测试语音对各模板的最终得分,取其最大者记为当次得分。若该得分大于得分门限,则识别通过;否则予以拒绝。
建模部分流程的前半部分与识别过程类似,不同之处在于建模过程只调用了LPCC算法。算法完成后,系统将LPCC矩阵写入对应的Flash地址空间存储。
4 软硬件协同设计与优化
4.1 软件设计与优化
(1)将数据缓存至SDRAM。最初的程序设计中使用数组存储大型变量,后来改为将这些数据缓存于SDRAM中。改进后,在板运行速度无明显改变,但NiosII软件的运行速度及稳定性得到了提高。
(2)用float数据类型代替double。最初的程序大量使用了双精度数据类型,但后来发现单精度浮点型已经可以满足要求,因此将数据类型改为单精度浮点型(float),使得程序运行速度提升了一倍。
(3)用指针方式访问数组。改用指针的方式访问数组改善了程序的执行效率,运行速度有一定提升。
(4)用读表法获取汉明窗函数。最初的程序是通过运算公式的方式得到窗函数的各个样点值的,后改用读表法,使得加汉明窗这一步骤耗时减少了98.7%,整个LPCC运算耗时因此减少了59.3%。
(5)语音数据存储为float类型。最初的设计中,系统采集到原始语音数据后直接将其存储起来,后来改为将数据解码后再存储,使得LPCC中取语音部分的时间由888 μs降至98μs。
4.2 硬件设计与优化
(1)用定时器中断方式采集语音。最初的设计中,系统必须在采集完所有语音数据之后才能对其进行处理。后改用中断方式采集语音,则可实现每采集满一帧语音数据便进行处理,极大地提升了处理速度。
(2)添加用户自定义浮点指令。语音信号处理过程涉及大量单精度浮点型数据的运算,因此在CPU中添加浮点指令。加入浮点指令后,系统耗时降低了90%以上。
本设计在算法上充分利用了DTW算法的特点,既能识别语音内容又能区分说话人,很好地完成了文本有关的说话人识别功能。同时对识别算法进行帧同步处理,为算法的实时实现打下基础。本设计在实现时采用软硬件协同设计方法,在软件和硬件上进行设计和优化,使得设计有很好的实时性。
作品的实际测试情况是:选取门限为1.5时,系统的错识率可降至0%,此时正确识别率为90%,还有10%的拒识。识别时系统的响应时间是8.5 ms。