语音识别研究的根本目的是研究出一种具有听觉功能的机器,能直接接受人的口呼命令,理解人的意图并做出相应的反映。语音识别系统的研究涉及微机技术、人工智能、数字信号处理、模式识别、声学、语言学和认知科学等许多学科领域,是一个多学科综合性研究领域。近年来,高性能数字信号处理芯片DSP(Digital Signal Process)技术的迅速发展,为语音识别的实时实现提供了可能,其中,AD公司的数字信号处理芯片以其良好的性价比和代码的可移植性被广泛地应用于各个领域。因此,我们采用AD公司的定点DSP处理芯片ADSP2181实现了语音信号的识别。

1 语音识别的基本过程

根据实际中的应用不同,语音识别系统可以分为:特定人与非特定人的识别、独立词与连续词的识别、小词汇量与大词汇量以及无限词汇量的识别。但无论那种语音识别系统,其基本原理和处理方法都大体类似。一个典型的语音识别系统的原理图如图1所示。

1a320b36d94e312b29e0ef69570ca013.gif

语音识别过程主要包括语音信号的预处理、特征提取、模式匹配几个部分。预处理包括预滤波、采样和量化、加窗、端点检测、预加重等过程。语音信号识别最重要的一环就是特征参数提取。提取的特征参数必须满足以下的要求:

(1)提取的特征参数能有效地代表语音特征,具有很好的区分性;

(2)各阶参数之间有良好的独立性;

(3)特征参数要计算方便,最好有高效的算法,以保证语音识别的实时实现。

在训练阶段,将特征参数进行一定的处理后,为每个词条建立一个模型,保存为模板库。在识别阶段,语音信号经过相同的通道得到语音特征参数,生成测试模板,与参考模板进行匹配,将匹配分数最高的参考模板作为识别结果。同时,还可以在很多先验知识的帮助下,提高识别的准确率。

2 系统的硬件结构

2.1 ADSP2181的特点

AD公司的DSP处理芯片ADSP2181是一种16b的定点DSP芯片,他内部存储空间大、运算功能强、接口能力强。有以下的主要特点:

(1)采用哈佛结构,外接16.67MHz晶振,指令周期为30ns,指令速度为33MI/s,所有指令单周期执行;

(2)片内集成了80 kB的存储器:16 kB字的(24b)的程序存储器和16kB字(16b)的数据存储器;

(3)内部有3个独立的计算单元:算术逻辑单元(ALU)、乘累加器(MAC)和桶形移位器(SHIFT),其中乘累加器支持多精度和自动无偏差舍人;

(4)一个16b的内部DMA端口(1DMA),供片内存储器的高速存取;一个8b自举DMA(BDMA)口,用于从自举程序存储器中装载数据和程序;

(5)6个外部中断,并且可以设置优先级或屏蔽等。

由于ADSP2181以上的特点,使得该芯片构成的系统体积小、性能高、成本和功耗低,能较好地实现语音识别算法。

2.2 系统的硬件结构

在构成语音识别电路时,我们采用了ADSP2181的主从结构设计方式,通过IDMA口由CPU装载程序。语音识别系统的硬件结构如图2所示。

99edb3946ba80035fd8817ddb6dd9d65.gif

在这种结构中,PC机为主CPU,ADSP2181为从CPU,由PC机通过IDMA口将程序装载到ADSP2181的内部存储器中。PC机总线通过CPLD译码,形成IRD,IWR,IAL,IS等控制信号,与ADSP2181的IDMA口相连。这样,在ADSP2181全速运行时,主机可以查询从机的运行状态,可以访问到ADSP2181内部所有的程序存储器和数据存储器。这对程序的编译和调试,以及语音信号的实时处理带来了极大的方便。

3 语音识别的DSP实现技术

3.1 浮点运算的定点实现

在语音识别的算法中,有许多的浮点运算。用定点DSP来实现浮点运算是在编写语音识别程序中需要首先解决的问题。这个问题可以通过数的定标方法来实现。数的定标就是决定小数点在定点数中的位置。Q表示法是一种常用的定标方法。其表示机制是:

设定点数是J,浮点数是)/,则Q法表示的定点数与浮点数的转换关系为:

浮点数)/转换为定点数x:x= (int)y×2Q;

定点数z转换为浮点数y:y =(float)x×2-Q。

3.2 数据精度的处理

用16b的定点DSP实现语音识别算法时,虽然程序的运行速度提高了,但是数据精度比较低。这可能由于中间过程的累计误差而引起运算结果的不正确。为了提高数据的运算精度,在程序中采用了以下的处理方法:

(1)扩展精度

在精度要求比较高的地方,将计算的中间变量采用32b,甚至48b来表示。这样,在指令条数增加不多的情况下却使运算精度大大提高了。

(2)采用伪浮点法来表示浮点数

伪浮点法即用尾数+指数的方法来表示浮点数。这时,数据块的尾数可以采用Q1.15数据格式,数据块的指数相同。这种表示数据的方法有足够大的数据范围,可以完全满足数据精度的要求,但是需要自己编写一套指数和尾数运算库,会额外增加程序的指令数和运算量,不利于实时实现。

以上两种方法,都可以提高运算精度,但在实际操作时,要根据系统的要求和算法的复杂度,来权衡考虑。

3.3 变量的维护

在高级语言中,有全局变量与局部变量存储的区别,但在DSP程序中,所有声明的变量在链接时都会分给数据空间。所以如果按照高级语言那样定义局部变量,就会浪费大量的DSP存储空间,这对数据空间较为紧张的定点DSP来说,显然是不合理的。为了节省存储空间,在编写DSP程序时,最好维护好一张变量表。每进入一个DSP子模块时,不要急于分配新的局部变量,应优先使用已分配但不用的变量。只有在不够时才分配新的局部变量。

3.4 循环嵌套的处理

语音识别算法的实现,有许多是在循环中实现的。对于循环的处理,需要注意以下几个问题:

(1)ADSP2100系列DSP芯片中,循环嵌套最多不能超过4重,否则就会发生堆栈溢出,导致程序不能正确执行。但在语音识别的DSP程序中,包括中断在内的嵌套程序往往超过4重。这时不能使用DSP提供的do…unTIl…指令,只能自己设计出一些循环变量,自己维护这些变量。由于这时没有使用DSP的循环堆栈,所以也不会导致堆栈溢出。另外,如果采用jump指令从循环指令中跳出,则必须维护好PC,LOOP和CNTR三个堆栈的指针。

(2)尽量减少循环体内的指令数。在多重循环的内部,减少指令数有利于降低程序的执行次数。这样有利于减少程序的执行时间、提高操作的实时性。

3.5 采用模块化的程序设计方法

在语音识别算法的实现中,为了便于程序的设计和调试,采用了模块化的程序设计方法。以语音识别的基本过程为依据进行模块划分,每个模块再划分为若干个子模块,然后以模块为单元进行编程和调试。在编写程序之前,首先用高级语言对每个模块进行算法仿真,在此基础上再进行汇编程序的编写。在调试时,可以采用高级语言与汇编语言对比的调试方式,这样可以通过跟踪高级语言与汇编语言的中间状态,来验证汇编语言的正确性,并及时的发现和修改错误,缩短编程周期。另外,在程序的编写过程中,应在关键的部分加上必要的注释与说明,以增强程序的可读性。

在总调时,需要在各模块中设置好相应的人口参数与出口参数,维护好堆栈指针与中间变量等。

3.6 利用C语言与汇编语言的混合编程

现在,大多数的DSP芯片都支持汇编语言与C或C++语言的混合编程,ADSP2181也不例外。用C语言开发DSP程序具有缩短开发周期、降低程序复杂度的优点,但是,程序的执行效率却不高,会增加额外的机器周期,不利于程序的实时实现。为此,在用C语言编写语音识别算法时,我们采用了定点化处理技术。ADSP2181是16位定点处理器,定点化处理应注意以下几个问题:

(1)ADSP2181支持小数和整数两种运算方式,在计算时应选择小数方式,使计算结果的绝对值都小于1;

(2)用双字定点运算库代替C语言的浮点库,提高运算精度;

(3)注意在每次乘加运算之后进行饱和操作,防止结果的上溢和下溢;

(4)循环处理后的一组数据可能有不同的指数,要进行归一化处理,以便后续定点操作对指数和尾数部分分别处理。

4 结 语

用定点DSP芯片构成的语音识别系统有着广泛的应用前景,在编写语音识别算法时,对其进行定点化处理以及一些原则和方法对其他类似的算法也有着现实指导意义。在实际应用中,应注意根据DSP芯片的特点,对算法进行优化,使得DSP芯片的性能得到充分的发挥。

语音识别及其定点DSP实现相关推荐

  1. 定点DSP与浮点DSP的比较(定点DSP和浮点DSP的定义)

    [ 首先要理解什么是定点运算,浮点运算 你要知道DSP芯片是如何处理小数的 这就涉及的是小数的定标问题.数值的精度与数值的范围就成了一对矛盾了. 你要知道:支持浮点运算的DSP就是浮点DSP芯片,在这 ...

  2. Bmu计算机,高性能定点DSP位处理单元BMU的 - 处理器/DSP - 电子发烧友网

    1 功能概述 位处理单元(Bit ManipulaTION unit,BMU)主要由取指电路.移位数据处理电路.移位选择处理电路.桶形移位电路和输出电路等几部分组成.BMU的输入数据是36位的BMUi ...

  3. 【DSP学习笔记】定点DSP小数乘加计算

    由于我装的版本是CCS5.5,此版本只支持C55系列的软件仿真而不支持C54系列的软件仿真,所以本次试验我采用TMS320C5510芯片进行,新建工程的过程这里不再赘述. 以下分别采用汇编语言和C语言 ...

  4. 浅论定点DSP与浮点DSP的区别

    最近在研究的一个项目中必须要用到DSP处理器.可是在选型时遇到了一个问题,该选择定点型的DSP,还是选浮点型的DSP?这两者有什么区别呢?于是专门查找并总结了一些资料,如下: 一般来说,定点DSP处理 ...

  5. DSP应用学习:定点DSP的小数运算方法—Q格式

    一.定点DSP做小数运算思路梳理: 1.由于定点DSP适用于做整数的加减乘除运算,在做小数的加减乘除等运算时效率极低,因此在做含小数数据运算时需要将小数转换为Q格式的整数,从而将问题转变为整数的加减乘 ...

  6. dsp处理浮点数_定点DSP如何做浮点运算

    许多DSP芯片只支持整数运算,如果现在这些芯片上进行小数运算的话,定点小数运算应该是最佳选择了,此外即使芯片支持浮点数,定点小数运算也是最佳的速度选择. 在DSP世界中,由于DSP芯片的限制,经常使用 ...

  7. python可以用于dsp吗_将Python/Matlab移植到C和定点DSP处理器上-C也应该是定点的吗?...

    我绝对建议你现在用定点实现算法.我使用了一个工具来测试针对Python浮点引用实现的定点实现 ctypes 从Python代码中直接调用C函数进行直接比较. 例如,要使用ctypes,必须将定点C函数 ...

  8. DSP定点与浮点计算

    在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示.一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位.显然,字长越长,所能表示的数的范围越大,精度也越高 ...

  9. DSP中定点与浮点运算

    一.定点数及其定标 在定点DSP芯片中,采用的是定点数据数值运算,其操作数一般采用整形数来表示.一个整形数的最大表示范围由DSP芯片给定字长决定.字长越长,表示的范围越大,精度越高. 举例16位字长 ...

最新文章

  1. Android startActivityForResult
  2. [译]15个关于Chrome的开发必备小技巧
  3. 一个视觉交互设计失败的案例
  4. 【Linux网络编程】广播
  5. Linux Boot,Kernel 和 Service 介绍
  6. javascript学习代码
  7. 训练日志 2019.1.23
  8. cron一点半到两点半之间每分钟_分辨率,定位精度,重复定位精度三者之间有什么关系?...
  9. ImageDataGenerator生成器的flow,flow_from_directory用法
  10. 软件测试周刊(第31期):所有的伟大 都源于一个勇敢的开始
  11. PLC通过485与单片机通讯示例
  12. 什么是加密狗?加密狗由来
  13. 质数/素数 - 合数
  14. 人生的第一篇博客φ(>ω<*)
  15. C语言小案例_小程序学习(三)
  16. 应付帐款—制单处理,出现“供应商被锁定”的解决方法
  17. 如何查找并下载paper
  18. html输入框字体字号设置,HTML网页怎么设置文本框里面输入的文字大小
  19. 机器人编程与python语言的区别_少儿编程和机器人编程的区别有哪些?
  20. 米联客 ZYNQ/SOC 精品教程 S02-CH15 AXI_Lite 总线详解

热门文章

  1. POJ1201 Intervals 【差分约束】
  2. Xen Server 7.0 一直无法退出维护模式
  3. 高精度计时器 -- C++/Windows版
  4. js bom dom
  5. Spring Security(09)——Filter
  6. java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRunt
  7. MySql的架构和历史
  8. C语言系列(二):最近重拾C语言的想法,谈到C中易错点,难点;以及开源代码中C语言的一些常用技巧,以及如何利用define、typedef、const等写健壮的C程序...
  9. NUC1422 字母旋转游戏【水题】
  10. I00030 Grades conversion