⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.txt

📁 有关于使用ISD1700芯片在单片机环境下的语音系统
💻 TXT
📖 第 1 页 / 共 2 页
字号:
    DWORD dwRiffSize;

    char szRiffFormat[4];    /*  'W',  'A',  'V',  'E'  */

};

4.2.2 Format Chunk
Foramt Chunk中包含了WAV波形的通道数、采样率、采样位数等的格式信息,其结构可用如下结构体表示:

struct WAVE_FORMAT

{

    char  szFmtID[4];        /*  ' f ',  ' m ',  ' t ',  '  '  */

    DWORD  dwFmtSize;

    WAVE_FORMAT wavFormat;

    WORD wFormatTag;

    WORD wChannels;

    DWORD dwSamplesPerSec;

    DWORD dwAvgBytesPerSec;

    WORD wBlockAlign;

    WORD wBitsPerSample;

};

4.2.3 Fact Chunk
Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk。该块结构可用如下结构体表示:

struct FACT_BLOCK

{

    char  szFactID[4];   /*  ' f ',  ' a ',  ' c ',  ' t '  */

    DWORD  dwFactSize;

};

4.2.4 Data Chunk
Data Chunk是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数,wav数据的bit位置可以分成以下几种形式:

表3 wav数据bit位置安排方式

单声道

8位量化
 取样1
 取样2
 取样3
 取样4
 
声道0
 声道0
 声道0
 声道0
 
双声道

8位量化
 取样1
 取样2
 
声道0
 声道1
 声道0
 声道1
 
单声道

16位量化
 取样1
 取样2
 
声道0(低字节)
 声道0(高字节)
 声道0(低字节)
 声道0(高字节)
 
双声道

16位量化
 取样1
 
声道0(低字节)
 声道0(高字节)
 声道1(低字节)
 声道1(高字节)
 

 

Data Chunk 结构可用如下结构体表示:

struct DATA_BLOCK

{

char szDataID[4];   /*  ' d ',  ' a ',  ' t ',  ' a '  */

DWORD dwDataSize;

}

 

 

 

5 系统硬件设计
5.1 系统框图
在PC机上通过提取出WAV文件中的PCM数据,并通过ADPCM语音压缩软件对这些数据进行编码、压缩,产生可供单片机C编译器直接调用的C语言代码。再通过ISP下载器或者USART将代码下载到单片机内部FLASH存储器中。

单片机对FLASH存储器中的ADPCM编码数据进行解码,在采样时钟频率下,送到内部集成的脉冲宽度调制器调制PWM波形。在PWM输出端,通过低通波器将声音波形还原。

 


图2 系统组成框图

5.2 系统电路图
系统硬件电路设计简单,这也是本系统的优点之一,极大程序地节约了设计成本。

PWM 输出后须通过低通滤波器滤波,才能还原成人耳能识别的声音。低通滤波器的类型和参数取决于声音的采样频率和价格预算。最简单的要数RC滤波器。这种滤波器的优点是仅需要两个元件,另一种是有源滤波器,滤波效果好,但相对复杂。在某些场合中,即使用参数不非常明确的元件也能获得很好的声音输出,这时RC滤波器将是最好的选择。如有必要可再加一功率放大电路。


图4 功率放大电路
 
 

 

 
 
     图3 系统电路图                         图5 滤波器的简易连接 

6 系统软件设计 
6.1 PC机中压缩软件的设计
PC机上的ADPCM语音编码、压缩软件是在Visual C++ 6.0环境下编写的。其界面图6所示:

 

  

   图6 ADPCM编码压缩软件界面              

 

该软件可以产生几种的文件:

◆ 以wav_为前缀的*.h文件:从WAV波形文件中提取出的PCM编码数据。

◆ 以adpcm_为前缀的*.h文件:可供单片机直接调用的ADPCM编码数据。

◆ 以pcm_为前缀的*.h文件:ADPCM编码后再解码的PCM数据。

◆ 以wav_为前缀的*.m文件:从WAV波形文件中提取出的PCM编码数据,用于在matlab中观察波形。

◆ 以pcm_为前缀的*.m文件:ADPCM编码后再解码的PCM数据,用于在matlab中观察波形。

◆ *.out文件:用于试听ADPCM编码再解码后的WAV格式文件。

该软件支持两种压缩比的编码方式:

● 8:4  在这种压缩比下,再现的语音音质与原始语音音质相比失真非常小,适合于对语音音质要求较高的场合。

● 8:2  这种压缩比较大,失真较大,音质较差,但是存储占用少,适合于存储器紧张时使用。

 

6.1.1 WAV波形数据提取
语音波形数据是从PC机中WAV文件中提取出来的,PC机中的WAV文件的音质比一般的录音电路所得的声音要好。其流程如图所示。


 
图7 WAV波形数据提取

 
 

 

图8 4位ADPCM编码流程图                 图9 2位ADPCM编码流程图

6.1.2 ADPCM编码
系统设计了4位和2位的ADPCM编码,当使用4-bit编码时,其产生的音质较好,几乎接近原声。当要对语音音质较高时,可以采用4-bit编码。而2-bit编码的的语音质量稍差,由于其压缩比较前者大,达到4:1。适合于在存储器较少的单片机中或者存储器紧张时应用。

在编码中有2张非常重要的表,分别为stepTable和indexTable。stepTable存储的为自适应的步长表,indexTable为step调节索引修正表。

当采用4-bit编码时,这两张表定义如下:

signedchar stepTable[22]=

{2,3,4,6,8,10,13,16,19,23,27,32,37,43,50,58,67,77,88,100,113,127}; 

signed char indexTable[8] = {-1, -1, -1, -1, 2, 4, 6, 8};

当采用2-bit编码时,这两张表为:

signedchar stepTable[22]=

{2,3,4,6,8,10,13,16,19,23,27,32,37,43,50,58,67,77,88,100,113,127} 

signed char indexTable[4] = {-1, -1, 2, 4};

ADPCM编码流程图如图8和图9所示。

6.1.3 ADPCM解码
解码实际是编码的一个逆过程,要注意的是,要使用与编码使用的同一张表。

     

图10 4位ADPCM解码流程图图          图11 2位ADPCM解码流程图

6.2 单片机语音播放程序设计
6.2.1 语音数据解码有关变量的定义
1.要想使用压缩过的语音数据,须在程序中加入由压缩软件产生的ADPCM编码数据文件。例如:

#include”adpcm_0.h”

2.定义数据段地址的指针数组。这张表是一个指针数组,其中存放的是各段语音资源的首地址。当程序中使用了多段语音数据时,这个表使得调用语音资源更为方便。其定义如下:

flash unsigned char *pTab[]={adpcm_0, adpcm_1, adpcm_2};

表中的adpcm_0,adpcm_1...在adpcm_*.h文件中定义的数组的首地址(在C语言中即为数组名)。

3.定义语音资源大小的数组。这张表中存放对应段的数据大小。

unsigned int SizeTab[]={size_adpcm_0, size_adpcm_1, size_adpcm_2};

表中的size_adpcm_0,size_adpcm_1...在adpcm_*.h中已以宏定义的方式定义了,它们是语音资源的大小,由压缩软件直接产生。

6.2.2 语音播放初始化  


图12 语音播放初始化
 
语音播放初始化主要是于语音播放中要用到的两个定时器进行初始化。一个定时器用来产生8KHz的采样频率,使用8位定时/计数器2,工作在TCT模式下,预分频系数为8,定时125us,并使能其比较匹配中断;另一个用来产生PWM波形,使用8位定时/计数器0,工作在快速PWM模式下,不分频,OCR0根据采样值的大小而改变。值得注意的是OCR0的初值要为0x7F(127),这个值作为声音的0参考值。
 

6.2.2 播放一段语音
在播放每段语音前都要载入所要播放的语音的地址,载入该段语音的预测值的初值,打开中断播放语音。然后等待播放结束。播放结束后要关中断,OCR0同样要赋值为0x7F,否则的话会产生比较大的噪声(相当于一个阶跃响应)。

                

    图13 播放语音子程序                  图14 定时器2比较匹配中断服务程序

6.2.3 定时器2比较匹配中断服务子程序
该中断服务子程序每125us进入一次中断,进入中断后,调用解码子程序,然后准备下一个数据,同时判断该段语音有没有播放完毕,发果播放完毕则置位标志位。

6.2.4 ADPCM解码
在单片机的的ADPCM解码与压缩软件中的解码过程大致相同,只是在单片机中一般不会同时使用4-bit和2-bit的解码方式。因此为了在兼容两种方式同时还节省代码空间,解码的两张表是用宏定义的方式定义。其代码如下:

#define ADPCM_2_BIT      //选择2-bit解码

#ifndef ADPCM_2_BIT

signed char stepTable[22]=

{

2,3,4,6,8,10,13,16,19,23,27,32,37,43,50,58,67,77,88,100,113,127

};//step表

signed char indexTable[8] = {-1, -1, -1, -1, 2, 4, 6, 8};

#else      

signed char stepTable[22]=

{

2,3,4,6,8,10,13,16,19,23,27,32,37,43,50,58,67,77,88,100,113,127

};//step表

signed char indexTable[2] = {-1, 4};

#endif    

 

 

 

 

 

 

 

7 结束语
随着语音合成集成电路的使用越来越广泛。对语音合成集成电路的设计要求也越来越高,很多的电子消费品要求语音合成集成电路电路简单,成本低廉,单片机内自带的PWM可以很好地解决这个问题。传统语音合成电路需外部辅以较多的电子元件,而PWM方式进行D/A转换输出电压信号,可以直接驱动喇叭。并且,数字脉冲宽度调制器避免了复杂的模拟电路的设计,降低了设计和生产的难度。所以,PWM方式作为语音合成的输出具有极大的推广应用前景。

使用ADPCM可以大大节约存储器的使用容量。使用4bit编码压缩时,解压后的数据误差较小,还原出来的声音与原声音质几乎相同。而使用2bit编码时,虽有一定的失真,但其音质也不错。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -