当前位置:文档之家› 无线语音传输系统

无线语音传输系统

无线语音传输系统 Jenny was compiled in January 2021无线语音传输系统研究现状及目的今天,随着通讯技术和信息技术的发展,人们对通信设备的要求越来越高。

人们越来越多的使用体积小巧、携带方便、功能强大的通信设备,无线传输方式与有线传输相比有着诸多优点:无需架设电线,且覆盖范围广,不受地理环境限制;语音信号的质量很高,误码率很低;在出现故障时能快速找出原因,恢复正常运行;安全保密性能好。

首先,本设计介绍了两种语音数据压缩编码类型波形编码和参数编码,并对它们分别介绍,通过比较选择出G.729作为本项目的语音压缩算法。

其次,本设计阐述了无线传输技术的发展历程;简单介绍了语音压缩编码的发展历史、研究现状和常用的压缩编码算法,并分析了语音编码算法的一般原理、分类及其不同的实现方法。

本文给出了一种无线语音传输系统的设计思路及实现方案、描述了项目背景和应用价值,同时根据项目的需求选择出使用的芯片:在种类众多的单片机中选出MSP430F1491系列超低功耗单片机;选出了具有高度可编程性、高性能、低功耗、较少的外围器件、成为当前语音处理的主流产品的音频处理芯片TLV320AIC10;以及专为在433MHzISM(工业、科研和医疗)频段工作而设计的nRF401收发芯片。

根据这些芯片资料绘制出原理图与PCB图。

最后,描述了本文的软件平台IAREmbeddedWorkbench,它是由IAR公司提供的软件开发调试环境。

并在IAREmbeddedWorkbench上进行各个功能模块的软件调试。

需求分析随着数字集群通信在我国不断地发展,数字集群终端的需求量将会逐步增大。

目前,国外厂商生产的终端价格都比较昂贵,超出了一般用户可以承受的范围,因此,对于一线指挥调度工作的企事业单位,如何结合实际情况,在现有成熟的移动通信产品和技术研究基础之上,推陈出新,优化技术体制,做出多功能、价格适中的通信终端系统,具有很重要的意义。

在无线通信中,我们经常受到多方面的限制。

比如:无线传输中带宽的限制及距离方面的要求。

特别是在无线语音传输中,为了满足带宽的限制及距离方面的要求,我们必须对语音的数据信息进行压缩,即对语音数据进行编码。

本项目根据TDD双工模式的原理,设计并实现了一种基于TDD模式的无线语音传输终端系统。

文中首先描述了TDD的帧结构、TDD的帧周期以及TDD的实现方式等关键技术。

接着,简要介绍了系统的硬件电路。

然后,对系统的软件实现进行了详细设计:即采用模块化的设计思想,对各个功能模块的特点及功能进行详细叙述,并着重说明各个功能模块软件实现的方法。

最后,分别对系统的硬件和软件部分进行了调试,指出了在调试过程中须要注意的关键点。

文中除了对语音系统做了研究外,还在现有集群通信终端所具备的短消息数据业务功能的基础上做了改进,增加了短信自动回复功能,为将来在本系统上实现该功能进行了前期研究。

试验结果表明,该数字对讲语音终端系统达到了预期目标,实现了一对一单呼、一对多群组呼叫功能。

研究目标本系统采用msp430系列单片机作为主控制器,利用DSP压缩,解压语音信号。

通过无线收发模块收发数据,实现语音的采集——传输——播放。

系统总体方案介绍整个系统的结构如图所示,系统由两套msp430单片机板和nRF无线模块构成,为便于描述,命名为A套和B套。

两套的硬件结构和软件设计是完全一致的。

硬件部分:采用msp430单片机自带的ADC,通过其MIC通道将语音转换为数字量;按照一定的格式编码后通过nRF无线模块将编码数据发送出去;另一端通过无线模块接收到来自发射端的编码数据,并对之进行解码,解码后的数据通过msp430单片机自带的DAC输出,实现声音的还原。

图1系统整体框图软件部分:为了便于分析,将系统分为3种工作状态:等待状态、录音状态、放音状态。

程序运行后,A套和B套均处于等待状态,在等待状态下可以通过按键进入录音状态;进入录音状态后进行录音并将压缩后的数据发送;另一端在接收到数据后进入放音状态,接收数据并进行解码。

通过改变按键的状态可退出录音状态,停止录音和数据发送;另一端在一定时间内接收不到数据即退出放音状态。

3种状态间的切换关系如下:图2系统状态切换图由于两套系统的硬件和软件一致,下面仅介绍其中一套的硬件和软件。

(1)系统硬件设计系统的硬件分为两大部分,msp430板和无线收发模块部分,下面重点介绍这两个模块:图3系统硬件框图无线收发电路包括主芯片nRF2401A及其外围电路、接口电路、指示电路,如图4所示:图4无线收发模块电路nRF2401A及其外围电路如图4,包括nRF2401A芯片、稳压部分、晶振部分、天线部分。

电压VDD经电容C1、C2、C3处理后为芯片提供工作电压;晶振部分包括Y1、C9、C10,晶振Y1允许值为:4MHz、8MHz、12MHz、16MHz,如果需要1Mbps的通信速率,则必须选择16MHz晶振。

天线部分包括电感L1、L2,用来将nRF2401A芯片ANT1、ANT2管脚产生的 2.4G电平信号转换为电磁波信号,或者将电磁波信号转换为电平信号输入芯片的ANT1、ANT2管脚。

为方便与msp340板的连接,模组提供了两个接口J1、J2,其中J1为nRF2401A的控制端口和通道1的收发通道,J2为预留端口,是通道2的接收通道。

J1接口为10Pin的插孔,其布局和msp430板的I/O端口布局一致,可以直接插接到msp430板的I/O端口使用。

J2预留,如果需要采用双通道接收时,可以将J2对应的3根信号线引出,接到单片机的I/O上即可。

同时,在板上添加了工作指示,系统上电后D1将会被点亮。

无线收发模块的工作电压VDD为3.3V,须将msp430板J5的I/O电平选择跳线跳至3V 端。

(2)系统软件设计程序的思想:系统运行后处于等待状态,在等待状态下不断扫描按键并判断是否接收到数据。

如果检测到按键按下则进入录音状态,进行录音并将压缩后的数据发送;另一端在接收到数据后进入放音状态,接收数据并进行解码。

如果想要停止录放音,可以通过释放按键退出录音状态,停止录音和数据发送;另一端在一定的时间内接收不到数据即退出放音状态。

①主程序流程:系统首先初始化nRF2401A为接收状态,之后进入主循环,在主循环中扫描KEY1键和播放允许标志PlayFlag,如果检测到KEY1键按下则进入录音装态,如果检测到PlayFlag=0xFF则进入放音状态。

如果KEY1键释放则退出录音状态,如果检测到PlayFlag=0x00则退出放音状态。

图5系统主程序流程图②中断服务程序:中断服务包括IRQ4_1KHz中断和FIQ_TMA中断。

IRQ4_1KHz中断用来接收数据,每次进入中断,判断无线模块是否有数据请求(接收到数据),如果有数据请求,则从nRF2401A中读出数据,同时置位语音播放允许标志PlayFlag,如果连续一段时间内(0.1S)没有接收到数据,则清除语音播放允许标志PlayFlag。

程序流程如图6所示。

图6中断服务子程序FIQ_TMA中断用来录放音。

在录音或者放音时,每次进入中断则调用DVR1600的中断服务函数。

程序流程如所示。

图7TimerA中断服务子程序③录音子程序在检测到KEY1键按下后进入录音子程序。

进入程序后首先禁止1KHz中断,屏蔽来自nRF2401A的数据请求,并切换nRF2401A工作方式为接收;之后作初始化初始化工作,初始化编码队列,设置编码格式等;如果按键KEY1一致处于闭合状态,程序将会不断地进行编码操作,每产生一桢编码数据后将数据写入nRF2401A,进行无线发送。

一旦KEY1键释放,停止录音,并切换nRF2401A工作方式为接收,同时允许1KHz中断。

程序流程如图8所示:图8录音子程序④放音子程序在检测到语音播放允许标志PlayFlag值变为0xFF后,进入放音子程序。

初始化编码队列并开始语音播放;如果PlayFlag的值一直为0xFF,程序将会一直进行DVR解码操作。

一旦PlayFlag的值不为0xFF,停止放音。

程序流程如图9所示:图9放音子程序⑤语音压缩程序附录:1.无线发射主程序:高位开始,先输出DATA,然后CLK_Up,再CLK_DnSET(DDRC,DATA);//置DATA输出temp=val;for(i=0;i<8;i++){if((temp&0x80)>0)SET(PORTC,DATA);elseCLR(PORTC,DATA) ;NOP();SET(PORTC,CLK1);NOP();NOP();NOP();NOP();CLR(PORTC,CLK1);temp=temp<<1;}}//读1Byteucharnrf2401A_RD(){uchartemp=0,i;//MSBfirst高位开始,先读入DATA,然后CLK_Up,再CLK_DnCLR(DDRC,DATA);//置DATA输入temp=0;for(i=0;i<8;i++){temp=temp<<1;if((PINC&(1<<DATA)))temp=temp|0x01;elsete mp=temp&0xfe;SET(PORTC,CLK1);NOP();NOP();NOP();CLR(PORTC,CLK1);}returntemp;}//PwrDown->StandByvoidnrf2401A_StandBy(){SET(PORTB,PWR);CLR(PORTD,CE);CLR(PORTB,CS);}//->PwrDownvoidnrf2401A_Off(){CLR(PORTB,PWR);CLR(PORTD,CE);CLR(PORTB,CS);}//配置模式voidnrf2401A_RwOn(){SET(PORTB,PWR);CLR(PORTD,CE);SET(PORTB,CS);}//工作模式voidnrf2401A_Run(){SET(PORTC,PWR);CLR(PORTB,CS);//firstSET(PORTD,CE);}voidnrf2 401A_Config(void){nrf2401A_RwOn();//配置状态//nrf2401A_WR(0x8e);//nrf2401A_WR(0x08);//nrf2401A_WR(0x1c);nrf2401A_WR(DATA2_ W);//200+16+32+8nrf2401A_WR(DATA1_W);//200nrf2401A_WR(RX_ADDRESS2);nrf2401A_WR (RX_ADDRESS2);nrf2401A_WR(RX_ADDRESS2);nrf2401A_WR(RX_ADDRESS2);nrf2401A_WR(RX _ADDRESS2);nrf2401A_WR(RX_ADDRESS_4);nrf2401A_WR(RX_ADDRESS_3);nrf2401A_WR(RX_ ADDRESS_2);nrf2401A_WR(RX_ADDRESS_1);nrf2401A_WR(RX_ADDRESS_0);nrf2401A_WR(CRC 16_EN|ADDR_W);//CRC16,AddrWidthnrf2401A_WR(PA_PWR_3|XOF_16MHz|CM_SHOCK);//nrf2 401A_WR(PA_PWR_3|XOF_16MHz|RFDR_1M|CM_SHOCK);nrf2401A_WR(CH_NO_FREQ|RX_EN);//R xMode,Chan//nrf2401A_StandBy();//执行配置}/*//配置nRF2401Avoidnrf2401A_Config(void){nrf2401A_RwOn();//配置状态nrf2401A_WR(DATA2_W);nrf2401A_WR(DATA1_W);nrf2401A_WR(RX_ADDRESS2);nrf2401A_WR (RX_ADDRESS2);nrf2401A_WR(RX_ADDRESS2);nrf2401A_WR(RX_ADDRESS2);nrf2401A_WR(RX_ADDRESS2);nrf2401A_WR(RX_ADDRESS_4);nrf2401A_WR(RX_ADDRESS_3);nrf2401A_WR(RX_ ADDRESS_2);nrf2401A_WR(RX_ADDRESS_1);nrf2401A_WR(RX_ADDRESS_0);nrf2401A_WR(CRC 16_EN|ADDR_W);//CRC16,AddrWidthnrf2401A_WR(PA_PWR_3|XOF_16MHz|RFDR_1M|CM_SHOCK );//#ifdefBPS_1M//nrf2401A_WR(PA_PWR_3|XOF_16MHz|RFDR_1M|CM_SHOCK);//0dbm,16M, 1Mbps,ShockBurst//#else//nrf2401A_WR(PA_PWR_3|XOF_16MHz|CM_SHOCK);//0dbm,16M,2 50Kbps,ShockBurst//#endif//nrf2401A_WR(CH_NO_FREQ|RX_EN);//RxMode,Channrf2401A _StandBy();//执行配置}*///接收模式voidnrf2401A_RxOn(){nrf2401A_RwOn();nrf2401A_WR(CH_NO_FREQ|RX_EN);//RxMode,Cha nnrf2401A_Run();}//发送模式voidnrf2401A_TxOn(){nrf2401A_RwOn();nrf2401A_WR(CH_NO_FREQ);//TxMode,Channrf24 01A_Run();}//初始化nrf2401Avoidnrf2401A_Init(){uchari;CLR(PORTC,CLK1);//nrf2401A_StandBy();//Dela yMs(10);//must>3msfor(i=1;i<5;i++)delay(1000);nrf2401A_Config();nrf2401A_Rx On();//接收状态}//写Tx地址voidnrf2401A_SetTxAddr(){nrf2401A_WR(TX_ADDRESS_3);nrf2401A_WR(TX_ADDRESS_2);n rf2401A_WR(TX_ADDRESS_1);nrf2401A_WR(TX_ADDRESS_0);}//写Tx数据voidnrf2401A_SetData(){uchari;for(i=0;i<SIZE;i++)nrf2401A_WR(TxBuf);}//发送TxBuf中的数据voidnrf2401A_SendData(){nrf2401A_TxOn();SET(PORTD,CE);nrf2401A_SetTxAddr();//写发送地址nrf2401A_SetData();//写数据CLR(PORTD,CE);//启动发送//发送完毕后进入StandBy}//读出接收到的数据voidnrf2401A_ReadData(){uchari;for(i=0;i<SIZE;i++){RxBuf=nrf2401A_RD();}}voidR fRecvProc(){uchari;if((PINC&(1<<DR1))==0)return;//DR=1时表示数据接收对而且Crc 正确//已经接收到数据nrf2401A_ReadData();//读出...}2.语音压缩主程序:voidmain(){if(brd_init(100))return;led(2);//闪灯两次initcodec();//初始化codecflashenable();//选择片外FLASH为片外存储器/*delay(100);brd_led_toggle(BRD_LED0);for(i=0x9000;i<0xefff;i++){REG_WRITE(i,*(volatileu16*)DRR1_ADDR(HANDSET_CODEC)); delay(20);}brd_led_toggle(BRD_LED1);delay(200);for(i=0x9000;i<0xefff;i++){*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=REG_READ(i); delay(20);}brd_led_toggle(BRD_LED2);*/while(1){while(!MCBSP_RRDY(HANDSET_CODEC)){};//等待接收handset处的采样brd_led_toggle(BRD_LED0);data=*(volatileu16*)DRR1_ADDR(HANDSET_CODEC);//从handset处读取采样temp1=data2alaw(data);//对采样进行a律压缩/*把低地址数据放在高八位高地址数据放在低八位*/i=i+1;if(i%2==1){buffer[j]=(temp1<<=8);/*奇数数据左移8位temp1=abcdefgh00000000buffer[j]=temp1*/}else{buffer[j]=(buffer[j]|temp1);/*偶数数据与temp1取或组成新的数据buffer[j]=abcdefghiabcdefghi*/j++;//j加1}if(i>=40000){i=0;}if(j>=20000){j=0;brd_led_disable(BRD_LED0);brd_led_toggle(BRD_LED1);//点亮二极管1表示放音开始/*放音部分*/for(k=0;k<40000;k++){if(k%2==0){temp2=(buffer[l]>>8)&0x0ff;}else{temp2=buffer[l]&0x0ff;l++;}if(l>=20000)l=0;data1=alaw2data(temp2);//a律解压while(!MCBSP_XRDY(HANDSET_CODEC)){};*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=data1;//将数据写入D/A转换器}/*放音结束*/brd_led_toggle(BRD_LED0); brd_led_toggle(BRD_LED1);}}}//主程序结束。

相关主题