您当前的位置:五五电子网电子知识单片机-工控设备DSP/FPGA技术PLD在数字语音处理中的应用 正文
PLD在数字语音处理中的应用

PLD在数字语音处理中的应用

点击数:7116 次   录入时间:03-04 11:39:06   整理:http://www.55dianzi.com   DSP/FPGA技术

  前两期我们用PLD来控制数字语音信号的传输、交换和分配,对语音信号本身并没有做什么处理。在这一期里,我们要用PLD对经由PCM技术取样得到的数字语音信号做一些基本的处理。首先,要把串行输入的语音数据转换为便于处理的8bit并行数据,再把这些被语音编解码器压缩过的A律码语音数据转换成线性码,以便进行各种代数运算,如根据预设值比较音量的大小并显示等等。当然,线性码也能够重新转换回A律码输出。通过本期的介绍,大家就能初步熟悉用PLD处理数字语音的一些基本技术。

  一.语音数据的串行,并行转换和锁存

  通过语音编解码芯片(如TP3094等)输出的PCM语音信号是串行传输的,这是为了简化数据传输电路。但在数据处理时,处理并行数据更方便快捷,这时就要把串行的语音数据转换成8bit的并行数据。

  上期我们已经设计出了能完成并行/串行数据转换的电路符号p2s。类似地,采用“MegaWizardPlug-inManager”工具也能够设计出串行/并行数据转换的电路符号s2p,如下图左边符号所示。

43

    s2p的移位输入端shiftin接收来自bx的串行语音数据,并在q0时钟的作用下执行移位操作。经8次移位,从s2p的q[7..0]得到1个8位的并行数据。s2p的赋能端enable可用来控制移位操作是否执行,高电平有效。

  s2p的输出虽然是8位并行数据,但这一数据是随着dx每个比特的移入而变化的。我们需要的是每个时隙里的8个数据,而不能任意截取8个串行数据转换为并行数据。因此,再用“MegaWizardPlug-inManager”工具设计1个8位锁存器latchl,用Load信号来及时锁存数据,如图1右边的符号所示。在上期里已经知道,load信号是跨在前后两个时隙之间的,所以正好能在每个时隙的8bit数据都已移位进来时用load信号把它锁存住,得到每次PCM取样的8位A律码数据。这些信号的波形如下图所示。并行数据转换的电路符号s2p

  图中,来自dx的串行数据在fsO到fS3的4个时隙窗口中分别是01010101、01000101、00010110和01110101。因为dx数据是在mclk时钟的上升沿发生变化的,而qO和mclk反相,用q0做移位时钟就相当于用mclk时钟的下降沿来移位,也就是在bx数据前后两次变化的中间来取样,这时数据最稳定。经移位和load信号锁存后,就得到并行数据55、45、16、75(16进制数)。

  二.A律码和线性码的相互转换

  A律码是按对数规律压缩的非线性码,要转换成线性码后才能对其进行代数运算。从有关资料可查得,未经偶数位反转的A律码和线性码的转换关系见下表。

未经偶数位反转的A律码和线性码的转换关系

  表中WXYZ为各位的码值,最高位a7和112是符号位,不转换。

用PLD能够简单地做出A律码到线性码的转换电路。在转换前要先把A律码的偶数位再次“取反”,回到反转前的状态。用AHDL语言编写的A律码/线性码转换程序如下:

4

     第4、5行语句定义1个节点(NODE)t[6..0]为中间变量(VARIABLE),以便对a[6..0]的偶数位作反转。

线性码和A律码

  以上程序可创建成a21_t电路符号,如下图左边符号所示。同样可查得,线性码和A律码的对照关系见 上表 ,上表中的“+”号取值既可为0也可为1。用类似方法也能编写出线性码/A律码转换的AHDL程序,并创建成电路符号12a+t,如下图右边符号所示。

右边符号

  图3中先把A律码转换成线性码,再把线性码反转换成A律码。从表2可看出,A律码并不能完全反映出线性码低位数据的不同,这是因为PCM压缩编码不完全是无损压缩。不过对于人耳来说,几乎不能察觉这些细微的差异。线性码的最低位虽然在转换成A律码时不起作用,但如对线性码作运算,该位会影响运算精度,所以仍应保留。

  三、用PLD设计语音音量显示电路

  对于模拟语音电路来说,如果要用多段LED来显示语音音量的话,就得使用多个模拟比较器或专用的多段显示集成电路。而数字语音的数值直接与语音音量相关,有可能用来驱动多段LED显示音量。但PCM语音经过压缩编码尤其是做了偶数位反转处理后,数值大小和语音振幅之间已完全不成比例,所以PCM码仍不能直接用来显示语音音量。作为线性码的一种应用,我们用线性码驱动LED来显示实验电路板上第0路发送语音的音量,电路图如下图所示。

电路图

    上图的上半部分是上期里介绍过的电话广播电路,下边新增加的电路可用来显示0号用户在向其他用户广播时的发话音量。数字语音信号dx输入到s2p的移位端,由于fsx0的作用,只对0号时隙的信号才执行移位操作。0号发送的语音转换成并行数据,经latchl锁存后得到稳定的A律码,再经a21_t转换成线性码1[12..0]。因为实验电路板上的LED只有10段,所以把1[12..0]的低2位合去不用,最高位是符号位也不用,把1[11..2]输入到电路符号ledl_t。led1_t能根据输入码值的大小输出led[10..1]信号分别去点亮10段LED的各段,可用AHDL语言编写如下程序创建:

  SUBDESIGN led1_t

  (1[11..2]:INPUT;

  led[10..1]:OUTPUT;)

  BEGIN

  IF    1[11..2]>=B“1000000000”THEN

34

  把这个电路下载到实验电路板,当0号用户对其他用户广播时,10段LED的光柱就会随着0号发出语音的大小不同而起伏变化。

  四、用PLD进行音量比较

  对下图的电路稍作改变,就能做出比较音量大小并显示出比较结果的电路来。只要新创建1个led2_t电路符号取代图4中的ledl_t就可以实现此功能,改动部分如图5所示。图中led2_t用拨动开关的高4位s[7..4]输入来设置比较基准,并把除了符号位以外的线性码l[11..0]输入led2_t以进行各种方式的比较。比较结果用1个LED来显示。如用这个电路来监测噪声,那么当噪声超标时,指示灯就会亮。

34

  五、用PLD实现语音激活功能

  我们在以前的两对电话通话电路的基础上来设计语音激活电路,如下图所示。图中除增加了上面介绍过的一电路外,还有两个新电路符号,分别是8位比较器comparel、带计数控制端和清零端的4位计数器counter3,都是用我们已经熟悉的工具创建的。还有就是用D触发器和反相器构成的双稳态电路,每输入1个脉冲翻转1次.

56

  下图中以0号用户发出的(1号收到的)语音做激活源.语音信号dx经s2p转换成并行数据,由latchl锁存后.再经a2l_t转换成线性码l[12..0]。取线性码的8位l[11..4]输入到8位比较器comparel和拨动开关的设置数值做比较。拨动开关的s[7..0]可在256个数值中选择1个设置为激活门限值。当语音数值大于或等于门限值时,比较器输出高电平,使计数器counter3清零。conter3在没有激活信号时,计数到第8个q19脉冲时(约2S)计数器的输出端最高位cq3转为高电平,反相后使计数控制端为低电平,计数器停止继续计数。cq3维持高电平。一旦被清零,cq3变成低电平,反相后跳变成高电平,使D触发器翻转,点亮LED灯,同时计数控制端也变为高电平,允许计数。但只要激活语音没有结束,计数器仍处于清零状态,计数操作并不能执行。这样设计就避免了一次激活语音使D触发器来回多次翻转的现象。只有等激活语音结束后,counter3才脱离清零状态开始计数,约28后cq3变成高电平,电路恢复初始状态。这时如再发出一个激活语音,就使D触发器再次翻转,熄灭LED灯。所以两次激活语音之间的间隔应该在2s以上。改变counter3的计数位数或输入时钟脉冲的频率,可以改变这个间隔时间。

  以上全部电路的完整设计文件和视频教程见本期配刊光盘中的相关内容。




本文关键字:语音  DSP/FPGA技术单片机-工控设备 - DSP/FPGA技术