找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

[嵌入式/ARM] 嵌入式Ad-Hoc网络下的实时语音通信

[复制链接]
admin 发表于 2013-3-24 15:37:38 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
摘  要: 综合Ad-Hoc网络技术、多媒体开发技术、嵌入式技术和RTP实时传输技术,设计实现了一套在嵌入式Ad-Hoc网络环境下的全双工实时语音通信系统。语音编码、抖动处理、静音检测有效地提高了系统的语音传输质量。实验表明,该系统性能稳定,适应性强,有较广泛的应用。
关键词: 嵌入式;Ad-Hoc;语音通信;RTP
    无线自组织网络(Ad-Hoc)最早起源于20世纪70年代美国国防部高级研究署(DARPA)资助的分组无线网络PRNET(Packet Radio Network),其最初的动机之一是满足战场生存的军事需求。Ad-Hoc是一种无中心、自组织、对等式、节点可移动和多跳路由的移动通信网络,这种网络结构不需要中心节点,具有良好的自组织能力、抗毁性能、机动性和鲁棒性[1-2]。无线自组织网络主要应用在军事、民用、治安、救灾等复杂而环境恶劣的场所中。在这些恶劣环境中,没有铺设通信基础设施或者通信设施遭到了破坏,迫切需求Ad-Hoc网络的投产使用。而实时语音通信作为人与人之间一种最直接的沟通手段,应用在军事、治安、救灾等领域是必然的需求。本文正是基于这种需求,设计并实现了一套在嵌入式Ad-Hoc网络环境下的实时语音通信系统。本设计涉及Ad-Hoc网络、Linux无线网卡驱动、实时流媒体传输等技术。首先,Ad-Hoc网络采用了按需路由中的AODV协议[3-4]来搭建实验的网络环境,在嵌入式平台(MagicARM2410)上进行了USB无线网卡驱动RT73的移植,对网络节点的分布做了合理的布局和连通性测试;其次,结合多媒体编程技术和流媒体实时传输技术[5],实现了语音采集和实时通信,对语音通信质量做了分析和改善。与传统的语音通信比较,本系统具有独特的优势:不需要铺设基础通信设施,无中心,自组织,可移动,多跳全双工语音通信,可以应用在治安、矿井、救灾等领域。
1 整体方案设计
 本语音通信系统的移动终端是由广州致远电子有限公司开发的教学实验开发平台MagicARM2410,该实验平台采用ARM920T内核的S3C2410A微处理器,工作频率高达203 MHz,扩展有充足的存储资源,具有I2S数字音频接口和8英寸真彩TFT液晶屏,满足系统的需求。网卡选用的是华硕的USB无线网卡WL-167g,该网卡的芯片是RT73芯片,拥有官网开发的Linux驱动,还有开源社区提供的驱动,有较多的文档资料可供查询。开发平台的操作系统是Linux-2.6.14.1,在该操作系统下对AODV路由协议、UDA1341TS声卡驱动、USB驱动、RT73无线网卡驱动进行移植。
 语音通信系统终端主要分为音频采集、音频编码、传输、接收、音频解码、音频播放6个模块,如图1所示。系统采用多线程技术,分为音频采集、编码传输、接收解码和音频播放4个线程,收发缓冲使用环形缓冲区,其作为临界资源,采集与编码传输竞争一个环形缓冲区,播放与接收解码竞争一个环形缓冲区[6],如图2所示。
   
   
2 系统实现
2.1 搭建Ad-Hoc网络环境

 本系统使用的路由协议源码是aodv-uu-0.9.5,这是一款成熟的Linux平台下的AODV路由协议实现,移植到本系统只需要针对操作系统内核做一些相应的修改和参数设置。使用交叉编译工具arm-linux-gcc3.4.1对AODV源码进行交叉编译,得到适合Linux-2.6.14.1内核的路由协议内核态模块kaodv和用户态模块aodv。为了对网络节点进行合理的拓扑分布,在室内使用了屏蔽的方案,如图3所示,进行4个节点的路由线路全双工语音通信时,Node1分别与Node3、Node4互相设置MAC地址屏蔽,Node2与Node4互相设置MAC地址屏蔽,这样就能保证按照本文设计的路由线路方式进行语音传输。
    20121107050757846954248.gif
   2.2 音频参数设置
 音频信号是一种连续变化的模拟信号,计算机只能记录和处理二进制的数据,自然音源的模拟音频信号必须经过量化成为数字音频信号之后,才能被计算机进一步处理。采样和量化是音频编程程序员理解声音数字化的两个关键步骤,进行音频编程时经常用到的技术指标有采用频率、量化位数和声道数。常用的采样频率有8 kHz、16 kHz、44.1 kHz、48 kHz等;常用的量化位数有8 bit、12 bit、16 bit;声道有单声道和双声道。本系统使用的是8 kHz、16 bit、单声道。
//设置采样频率
Arg=采样频率;
Status=ioctl(dsp_fd,SOUND_PCM_WRITE_RATE,&Arg);
//设置量化位数
Arg=量化位数;
Status=ioctl(dsp_fd,SOUND_PCM_WRITE_BITS,&Arg);
//设置声道数
Arg=声道数
Status=ioctl(dsp_fd,SOUND_PCM_WRITE_CHANNELS,&Arg);
2.3 音频采集
 系统使用read()函数来从声卡读取数据,其函数原型为:int read(int fd, char*buf, size_t count)。其中,fd是音频设备文件的标识符,buf是存储音频数据的缓冲区,count是要采集的音频数据字节数。单次采集所用时间为:(采样字节数count×8×1000)/(采样频率rate×量化位数bits×声道数channels) ms。因此,count不能设置太大,会增加系统的时延,影响语音的实时性,本系统单次采样128 B,采样时间为8 ms。程序伪代码为:
while(conditions)
{
//访问临界资源环形缓冲区
     Pthread_mutex_lock();   
     采集音频数据;
     写入环形缓冲区;
     //增加信号量值
     Sem_Post();
     //退出临界区
     Pthread_mutex_unlock();
}
2.4 编码传输
Ad-Hoc网络的带宽是有限的,大量的数据传输会增加网络的负荷,影响通信质量,对语音进行适当的编码是很有必要的,这可以有效地减轻网络的负担,更利于语音通信。复杂的语音编码算法拥有高效的压缩比,但由于计算量大,会增加语音传输的延迟。本系统选用了着名的波形编码算法G711编码,G711编码算法比较简单,计算量小,可减少一半的网络语音数据负荷[7]。语音传输使用了RTP实时传输协议,RTP协议常用于流媒体系统,可有效监控语音传输质量,这使它成为IP电话产业的技术基础。程序伪代码为:
  while(conditions)
  {
     //等待信号量唤醒
     Sem_wait();
     //访问临界资源环形缓冲区
     Pthread_mutex_lock();
     从环形缓冲区提取音频数据;
     G711编码语音数据;
     发送RTP语音数据包;
     //退出临界区
     Pthread_mutex_unlock();
  }
2.5 接收解码
 系统终端接收到语音数据包时,提取payload语音数据,并解码出PCM音频码,存放在环形缓冲区。程序伪代码为:
  while(conditions)
  {
      //访问临界资源环形缓冲区
      提取RTP语音数据包;
      解码语音数据;
      将语音数据放入环形缓冲区;
      //增加信号量值
      Sem_post();
      //退出临界区
      Pthread_mutex_unlock();
  }
2.6 音频播放
 播放线程与接收解码线程竞争同一个环形缓冲区,从环形缓冲区提取音频数据,并写入声卡。程序伪代码为:
      While(conditions)
      {
          //等待信号量唤醒
          Sem_wait();
          //访问临界资源环形缓冲区
          Pthread_mutex_lock();
          从环形缓冲区提取音频数据;
          播放音频数据;
          //退出临界区
          Pthread_mutex_unlock();
      }
3 改善语音通信质量
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-26 01:42 , Processed in 0.055253 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表