对音频数据进行处理时经常会对mic阵列的选择有很多特殊要求,当原始录取的音频阵列排布有问题时,会进行一些软件的处理,使阵列排布达到一定的要求。

1.回声消除对麦克阵列的特殊要求

2.原始音频MIC阵列排布处理

对于4ch音频数据而言,麦克阵列排列要求为mic1、mic2、ref1、ref2,但是通过tinycap采集的原始音频数据的阵列排布为ref1、null、mic1、mic2,俩路mic分别对应左右mic的音频摄入,需要对mic阵列进行一定处理。

check相关原始音频pcm文件,ref通道摄入的是喇叭对应的音频,收集到的是设备播放音乐的声音,同时mic通道也会摄入设备播放的音乐声音,需要通过回声消除处理对设备音进行一定的处理。

针对麦克阵列排布不符合规定的代码端处理,调整排列架构符合要求。

struct pcm *pcm_open(unsigned int card, unsigned int device,unsigned int flags, struct pcm_config *config)
{struct pcm *pcm;struct snd_pcm_info info;struct snd_pcm_hw_params params;struct snd_pcm_sw_params sparams;char fn[256];int rc;LOG("pcm_open card %d device %d channel %d period_size %d period_count %d format %d\n", card, device ,config->channels, config->period_size, config->period_count, config->format);......if(card == 0 && device == 2 && config->rate == 64000){char *buffer;unsigned int ch1_first = 0, ch3_first = 0, i = 0;buffer = malloc(sizeof(char)*8);for(i = 0; i < 10 && ch1_first < 2 && ch3_first < 2; i++){pcm_mmap_read(pcm, buffer, 8);/* LOG("buffer[2] = 0x%x. buffer[3] = 0x%x buffer[6] = 0x%x. buffer[7] = 0x%x",*(buffer+2), *(buffer+i+3), *(buffer+6), *(buffer+7)); */if((*(buffer+2) == 0x00)&&(*(buffer+3) == 0x00))ch3_first++;if((*(buffer+6) == 0x00)&&(*(buffer+7) == 0x00))ch1_first++;}if(ch3_first > ch1_first){LOG("start channel ch3/4, do the conversion\n");printf("start channel ch3/4, do the conversion\n");pcm_mmap_read(pcm, buffer, 4);} else {LOG("start channel ch1/2 \n");}free(buffer);}LOG("pcm_open done pcm->fd = %d\n", pcm->fd);return pcm;
}

相关代码执行log

调整后的音频pcm文件

3.音频数据采样精度、回采通道复用处理

原始录取出来的音频数据采样精度为16bit,采样频率为16khz,且ref2因为硬件设计为null。为满足麦克阵列的要求需对这样的音频数据进行应用层的处理,采样精度:16bit -> 32bit,第二路回采信号复用第一路回采信号。

处理代码如下:

//2mic: 4c 16k 16bit -> 4c 16k 32bit(copy 3ch -> 4ch)public static byte[] addCnFor2MicN4(byte[] data) {byte[] cpy=new byte[data.length*2];int j=0;//mic1 mic2 ref refwhile(j<data.length/8) {cpy[16*j]=00;cpy[16*j+1]=  00;cpy[16 * j + 2] = data[8 * j +0];cpy[16* j + 3] = data[8 * j +1];cpy[16*j+4]=00;cpy[16*j+5]=  00;cpy[16 * j + 6] = data[8 * j +2];cpy[16* j + 7] = data[8 * j +3];cpy[16*j+8]=00;cpy[16*j+9]=  00;cpy[16 * j + 10] = data[8 * j +4];cpy[16* j + 11] = data[8 * j +5];cpy[16*j+12]=00;cpy[16*j+13]=  00;cpy[16 * j + 14] = data[8 * j +4];cpy[16* j + 15] = data[8 * j +5];j++;}return cpy;}

以下是一些项目中用到的对音频数据进行处理的方法:

    //6mic 8ch 32bitsprivate byte[] addCnForMutiMic(byte[] data) {int datasize=data.length;byte[] newdata=new byte[datasize*2];//double to 16bit -> 32bitint j=0;int k=0;int index= 0;int step = datasize/2;while(j<step) {for (int i=1; i<9;i++) {k = 4*j;index= 2*j;newdata[k]=00;newdata[k+1]=00;newdata[k+2]=data[index];newdata[k+3]=data[index+1];j++;}}data = null;return newdata;}//4mic 8ch->6chprivate byte[] adapeter4Mic(byte[] data) {//  int size = ((data.length/8)*2)*6;int size = (data.length/8)*6;byte[] cpy=new byte[size];int j=0;while(j<data.length/16) {cpy[12 * j + 0] = data[16 * j +0];cpy[12* j + 1] = data[16 * j +1];cpy[12 * j + 2] = data[16 * j +2];cpy[12* j + 3] = data[16 * j +3];cpy[12 * j + 4] = data[16 * j +4];cpy[12* j + 5] = data[16 * j +5];cpy[12 * j + 6] = data[16 * j +6];cpy[12* j + 7] = data[16 * j +7];cpy[12 * j + 8] = data[16 * j +12];cpy[12* j + 9] = data[16 * j +13];cpy[12 * j + 10] = data[16 * j +14];cpy[12* j + 11] = data[16 * j +15];j++;}return cpy;}//4mic:8ch -> 6chprivate byte[] adapeter4Mic32bit(byte[] data) {//  int size = ((data.length/8)*2)*6;int size = (data.length/8)*6*2;byte[] cpy=new byte[size];int j=0;while(j<data.length/16) {cpy[24 * j + 0] = 0x00;cpy[24* j + 1] = 0x01;cpy[24 * j + 2] = data[16 * j +0];cpy[24* j + 3] = data[16 * j +1];cpy[24 * j + 4] = 0x00;cpy[24* j + 5] = 0x02;cpy[24 * j + 6] = data[16 * j +2];cpy[24* j + 7] = data[16 * j +3];cpy[24 * j + 8] = 0x00;cpy[24* j + 9] = 0x03;cpy[24 * j + 10] = data[16 * j +4];cpy[24* j + 11] = data[16 * j +5];cpy[24 * j + 12] = 0x00;cpy[24* j + 13] = 0x04;cpy[24 * j + 14] = data[16 * j +6];cpy[24* j + 15] = data[16 * j +7];cpy[24 * j + 16] = 0x00;cpy[24* j + 17] = 0x05;cpy[24 * j + 18] = data[16 * j +12];cpy[24* j + 19] = data[16 * j +13];cpy[24 * j + 20] = 0x00;cpy[24* j + 21] = 0x06;cpy[24 * j + 22] = data[16 * j +14];cpy[24* j + 23] = data[16 * j +15];j++;}return cpy;}//6mic 16bit-> 2mic 32bitprivate byte[] addCnFor2Mic(byte[] data) {byte[] cpy=new byte[data.length];int j=0;//mic1 mic2 ref refwhile(j<data.length/16) {cpy[16 * j] = 00;cpy[16 * j + 1] = (byte) 1;cpy[16 * j + 2] = data[16 * j + 0];cpy[16 * j + 3] = data[16 * j + 1];cpy[16 * j + 4] = 00;cpy[16 * j + 5] = (byte) 2;cpy[16 * j + 6] = data[16 * j + 2];cpy[16 * j + 7] = data[16 * j + 3];cpy[16 * j + 8] = 00;cpy[16 * j + 9] = (byte) 3;cpy[16 * j + 10] = data[16 * j + 12];cpy[16 * j + 11] = data[16 * j + 13];cpy[16 * j + 12] = 00;cpy[16 * j + 13] = (byte) 4;cpy[16 * j + 14] = data[16 * j + 14];cpy[16 * j + 15] = data[16 * j + 15];j++;}return cpy;}

4.回声消除效果

经过回声消除之后输出的音频数据是16k、16bit、单声道数据,经过与之前的pcm文件对比可以看出数据的音乐声音被消除,基本只留下了之前mic声道里面说话的声音。

总结

回声消除和噪声抑制都是音频处理中必须要进行的一些过程,这篇只是对这些处理之前的音频数据进行转化的内容进行一下说明,回声消除与噪声抑制的具体处理涉及到算法的优化与解决,很难搞!

Audio-音频降噪、回声消除处理相关推荐

  1. 苹果ios音频的回声消除处理

    iOS设备上回声消除的例子 工业上的声音处理中,回声消除是一个重要的话题,重要性不亚于噪声消除.人声放大.自动增益等,尤其是在VoIP功能上,回声消除是每一个做VoIP功能团队的必修课.QQ.Skyp ...

  2. 可视监控对讲、楼宇对讲等领域中的回声消除、音频降噪

    在实际生活中,对讲是比较常用的功能,如小区单元的视频对讲.监控场所的实时对讲,还有现在很火的智能门铃中的视频对讲,对讲这个功能确实方便了双方的沟通,但这功能的实现并不是那么容易,因为有个技术是较难实现 ...

  3. 音频应用(如sip与Voip),编解码API(Ringtone,SoundPool,MediaPlayer),回声消除等(Lame Speex等),OpenSL ES

    3套音频播放API:MediaPlayer,SoundPool,AudioTrack. android录音项目,用单例模式集成了record,并实时转码mp3- https://github.com/ ...

  4. 详解低延时高音质:回声消除与降噪篇

    在实时音频互动场景中,除了我们上一篇讲到的编解码会影响音质与体验,在端上,降噪.回声消除.自动增益模块同样起着重要作用.在本篇内容中我们将主要围绕回声消除和降噪模块,讲讲实时互动场景下的技术挑战,以及 ...

  5. Android 音频降噪 webrtc 去回声

    Android 音频降噪 webrtc 去回声 集成AECM模块 集成NS模块 需要源码请留言 集成AECM模块 1.通过 webrtc官网下载需要模块\modules\audio_processin ...

  6. python回声程序echo 一行代码_echo speex中的回声消除程序,可以直接在vs下运 效果还 有测试语料 Audio program 238万源代码下载- www.pudn.com...

    文件名称: echo下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Visual C++ 文件大小: 5481 KB 上传时间: 2014-08-07 下载次数: 10 提 供 者: ...

  7. 深入浅出,聊聊实时音视频中的回声消除与降噪

    在实时音频互动场景中,回声消除.降噪.自动增益(即 3A 算法)是直接影响音质和体验的重要环节之一.如何降低计算量,提升处理效率,如何兼容更多的设备.环境等,让3A 算法可以适应更多场景等一系列问题是 ...

  8. 微处理器(STM32 wifi芯片)实现音频回声消除

    一.什么是回声消除(AEC) 在回答回声消除之前,我们看这幅图片,如下图所示: 当远端Far-end有说话者讲话时,声音会传到近端(Near-end)的扬声器,然后声音通过空间延时和传输延时重新回到了 ...

  9. 音频前处理:回声消除、噪声抑制等(音视频SDK高级功能六)

    音频前处理技术一般用于去除语音中的干扰.本篇文章介绍即构科技音视频SDK高级功能第六篇,ZegoLiveRoom SDK 为开发者提供了音频前处理的功能,还是以iOS环境为例. 关于如何使用SDK,请 ...

最新文章

  1. 深度学习必懂的13种概率分布
  2. zentao这php,ZenTaoPHP后面计划
  3. AttributeError: 'NoneType' object has no attribute '__array_interface__'
  4. STM32CubeMx配置H7时钟: Frequency searched for is out of range for this vos range
  5. ais信号接收设备_基于USRP的AIS接收机实现
  6. 关键路径例题图解_图解!九大常见数据结构被24张图给安排的明明白白
  7. win10系统无法自动修复启动解决方案
  8. c++ 开源grid控件
  9. 机器人学——3.2-正运动学
  10. MCP3421高精度ADC转换器
  11. 【SOT】SiamRPN代码笔记
  12. python数据分布统计_Python 数据可视化:数据分布统计图和热图
  13. 非对称算法之RSA的签名剖析
  14. 如何在表格里做计算机统计表,如何运用Excel编制统计表并做一般数据分析?-excel统计怎么做,最简单的统计表格怎么做...
  15. angularjs-大漠穷秋
  16. 云计算对传统软件工程的影响
  17. 基于TensorFlow深度学习框架,运用python搭建LeNet-5卷积神经网络模型和mnist手写数字识别数据集,设计一个手写数字识别软件。
  18. a烟台计算机哪个学校好,烟台多所学校有新消息,家长速看!
  19. Bitmap 贴图加工成 PBR 贴图
  20. 输入框上的Magnifier

热门文章

  1. ProE拉伸特征总结
  2. MATLAB缺陷检测设计系统
  3. 【ppt入门教程】如何在ppt幻灯片中插入GIF格式动态图片
  4. 如何在ppt中生成柱状图_PPT中怎么制作动态柱状图表?绘制方法全在这里!
  5. 机器人视觉成像主要工作过程
  6. Google Earth Engine(GEE)—— VCT 算法案例
  7. 用Python分析许嵩的歌
  8. 关于C#中的隐藏方法的使用
  9. seo百度优化体系-全智能程序化优化网站排名(白狐公羊seo)
  10. DeepDive 简介