导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    【FAQ】全志V853芯片 tina+v853+audio+dvr如何实现多路mic采集和回声消除?

    V Series
    v853 audio mic faq 技术支持
    1
    1
    1115
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • q1215200171
      budbool LV 9 最后由 编辑

      1.主题

      tina+v853+audio+dvr多路mic采集和回声消除方案

      2.问题背景

      产品:
      硬件:主控 + audio +tp9930
      软件:tina + audio/ai
      其他:客户需要调试6路mic,其中2路为v853内部audio codec mic,四路为tp9930 外部i2s mic,且其中一路audio mic与lineout硬件相连,作为aec回声消除。

      3.复现步骤

      1.搭建客户硬件环境。
      2.配置tp9930音频输出,并用示波器查看bclk dout lrck波形。

      4.问题分析

      需要配置好底层音频i2s1,ai中间件声卡插件,并在app层拆分各个声道数据。

      5.解决办法

      需求分解:

      1.根据原理图配置i2s1板级配置;

      &daudio1_plat {
      tdm-num = <1>;
      tx-pin = <0>;
      rx-pin = <0>;
      pinctrl-used;
      pinctrl-names= “default”,“sleep”;
      pinctrl-0 = <&daudio1_pins_a>;
      pinctrl-1 = <&daudio1_pins_b>;
      tx-hub-en;
      rx-sync-en;
      status = “okay”; //打开i2s1声卡
      };
      
      &daudio1_mach {
      soundcard-mach,format = “i2s”; //根据tp9930的输出格式选择dsp模式或者i2s模式
      soundcard-mach,frame-master = <&daudio1_codec>;
      soundcard-mach,bitclock-master = <&daudio1_codec>;
      /* soundcard-mach,frame-inversion; /
      / soundcard-mach,bitclock-inversion; /
      soundcard-mach,slot-num = <16>; //tp9930默认配置16声道slot
      soundcard-mach,slot-width = <16>; //声道位深16bit
      status = “okay”;
      daudio1_cpu: soundcard-mach,cpu {
      sound-dai = <&daudio1_plat>; //作为从机配置配置为daudio1_plat,主机配置为daudio1_cpu
      soundcard-mach,pll-fs = <1>; / pll freq = 24.576M or 22.5792M * pll-fs /
      soundcard-mach,mclk-fs = <0>; / mclk freq = pcm rate * mclk-fs */ //不需要mclk时钟
      };
      daudio1_codec: soundcard-mach,codec { //mclk时钟源,做从机无需配置。
      };
      };
      

      2.tp9930驱动配置i2s输出, 16bit 16slot,由于是v853做从机所以无需新增codec驱动,直接在sensor驱动配置。

      static struct regval_list reg_audio_init[] = {
      {0x40, 0x40},
      
      // clear first
      {0x00, 0x00},
      {0x01, 0x00},
      {0x02, 0x00},
      {0x03, 0x00},
      
      {0x00, 0x01},
      {0x01, 0x02},
      {0x08, 0x03},
      {0x09, 0x04},
      
      {0x17, 0x00 | (DATA_BIT << 2)}, // 16bit
      {0x1B, 0x01 | (DATA_BIT << 6)},
      
      {0x18, 0x80 | (SAMPLE_RATE)},
      {0x19, 0x0F},
      
      {0x1A, 0x15},
      
      {0x37, 0x20},
      {0x38, 0x38},
      {0x3E, 0x00},
      
      {0x3d, 0x01}, // audio reset
      
      {0x40, 0x00},
      };
      
      static void tp9930_audio_dataSet(struct v4l2_subdev *sd)
      {
      sensor_write_array(sd, reg_audio_init, ARRAY_SIZE(reg_audio_init));
      }
      

      3.使用alsa原生工具测试,

      arecord -Dplug:Capture1Mic:8000 /tmp/1.wav -f S16_LE -c 16 -r 8000 -d 10 可以录到tp9930四路pcm数据

      使用sdk demo 发现无声音,经排查v853公版配置i2s1模式作为aec回录,自动打开回录功能,amixer cset numid=3 0 -c 1 修改控件后可以录到声音。

      因此需要关闭sdk config aec开关

      f3dfe6a361084de1a0fb9c288907a1e6.jfif

      4.声卡复合插件的配置
      在target/allwinner/v853-perf1/busybox-init-base-files/etc/asound.conf中配置复合插件如下

      复合声卡插件

      pcm.Capture1MicPlusAec {
      type route
      slave.pcm {
      type multi
      slaves {
      a {pcm Capture2MicHard channels 2} //主控两路声卡
      b {pcm CaptureI2SRX channels 4} //tp9930 4路
      }
      bindings {
      0 {slave a channel 0}
      1 {slave a channel 1}
      2 {slave b channel 0}
      3 {slave b channel 1}
      4 {slave b channel 2}
      5 {slave b channel 3}
      }
      }
      ttable.0.0 1
      ttable.1.1 1
      ttable.2.2 1
      ttable.3.3 1
      ttable.4.4 1
      ttable.5.5 1
      }
      
      tp9930四路mic
      pcm.CaptureI2SRX {
      type hooks
      slave.pcm "hw:snddaudio1,0"
      hooks.0 {
      type ctl_elems
      hook_args [
      {
      name "loopback debug"
      preserve true
      optional true
      value 0
      }
      ]
      }
      }
      
      //主控两路mic
      pcm.Capture2MicHard {
      type hooks
      slave.pcm "hw:0,0"
      hooks.0 {
      type ctl_elems
      hook_args [
      {
      name "MIC1 Switch"
      preserve true
      optional true
      value 1
      }
      {
      name "MIC2 Switch"
      preserve true
      optional true
      value 1
      }
      ]
      }
      }
      
      sampe ai conf修改如下
      
      [parameter]
      pcm_file_path = "/tmp/sample_ai_pcm.wav"
      pcm_sample_rate = 8000
      pcm_channel_cnt = 6
      pcm_bit_width = 16
      pcm_frame_size = 1024
      pcm_cap_duration = 10
      pcm_ai_gain = 100
      

      测试后可以录到6路音频

      5.aec应用层接口

      首先需要拆分audio codec mic0 的数据,位深16bit,交错模式下,一个声道两个字节,参考aec demo mic1作为近端数据,mic1为远端录音

      WebRtcAec_BufferFarend(aecmInst, far_frame, NN);//对参考声音(回声)的处理
      WebRtcAec_Process(aecmInst, near_frame, NULL, out_frame, NULL, NN,40,0);//回声消除
      

      最后可以录到out frame 回声消除后的pcm数据。

      6.aenc编码

      将拆分后的声道数据frame送到aenc chn编码输出为aac格式码流,可参考aenc_sample.c

      1 条回复 最后回复 回复 引用 分享 2
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策