Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    【FAQ】全志D1芯片 如何解决Audiocodec使用S24_LE格式进行录音,软件分析波形异常的问题?

    其它全志芯片讨论区
    d1 f133 faq 技术支持
    1
    1
    1642
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • q1215200171
      budbool LV 9 last edited by

      问题背景

      硬件:R329
      软件:Tina
      内核:Linux-4.9

      问题描述

      使用Audiocodec进行录音,格式S24_LE,录制的.wav波形在某些软件中异常

      arecord -D hw:audiocodec -f S24_LE -r 16000 -c 2 -d10 /tmp/test3_S24_LE.wav
      

      d65d357edb0842cb9d54148ed1c5e0b3.jpg
      需要放大很多倍才能看到声音波形

      3cddc50a8f214d7380305433df378993.jfif

      问题分析

      1.R329的Audiocodec用于录音的ADC只支持16bit和20bit的采样精度。采样后的数字信号会存放到RX_FIFO中,RX_FIFO的大小为256*20-bit,其他平台可以在User Manual确认支持的采样精度,从而判断是否会有这个问题产生

      4570bdb36f594591b6ec4c71310e5fe7.jfif

      2.RX_DATA是一个32位的寄存器,保存的是从RX_FIFO获取的一个channel的样本数据,当使用arecord进行录音时,RX_DATA中的值会经DMA搬至内存,最后保存到.wav中

      5c2c17d228f944fd8a4a6e8d1924e778.jfif

      其中RX_DATA有四种模式去获取RX_FIFO的数据,S24_LE和S32_LE均采用20-bit mode0

      6972b81f741b4bf9829ecb814f5dbb7a.jfif

      当设置了20bit采样精度时,对应的两种模式如下图所示:

      8b502f06666046368fafccf0d13eee46.jfif

      3.先说明一下S24_LE和S32_LE这两种格式的区别

      S24_LE指有符号整型,范围是-2^23 ~ ((2^23) - 1),有效数据在低24位
      S32_LE指有符号整型,范围是-2^31 ~ ((2^31) - 1),有效数据在高24位

      LSB                           MSB
               1st byte  2nd byte  3rd byte  4th byte   alignment
      S32_LE:   00000000  xxxxxxxx  xxxxxxxx  xxxxxxxx   32 bits
      S24_LE:   xxxxxxxx  xxxxxxxx  xxxxxxxx  00000000   32 bits
      S24_3LE:  xxxxxxxx  xxxxxxxx  xxxxxxxx             24 bits
      

      4.在驱动程序中,S24_LE和S32_LE虽然都支持,但他们两者都是使用20-bit的mode0,这导致这两种格式保存到文件中的数据排布是一致的,但生成的wav头信息中的采样位数则不一样,从下图可以看出两者的差异

      S32_LE的wav文件信息:

      b782fd998a1a42bfafb6a46a3362d79b.jfif

      若软件以S32_LE进行解析,以上红框的数据变为0x0f80f0,依然可以保留全部有效数据

      5de38b0c26a346a2bd0cc517b1cb6485.jfif

      S24_LE的wav文件信息:

      561fc954670c4a7e8f5c122acd788689.jfif

      若软件以S24_LE进行解析,以上红框的数据变为0x55f000,便会丢失一部分数据

      a185f006bee4483ebb53b3835c4053dc.jfif

      解决方案

      总结原因就是audiocodec的采样精度只支持16和20bit,因此PCM格式中S24_LE虽然也支持,但硬件的特性使驱动并不能做到很好的适配,若软件以标准S24_LE格式进行分析,则会丢失高位的有效数据,这取决于软件如何对数据进行分析,解决方法有以下三种

      • 使用audiocodec时,使用-f S32_LE,修改wav头信息中的采样位数位32,这对大部分软件都有效
      arecord -D hw:-f S32_LE -r 16000 -c 2 -d10 /tmp/test32.wav
      
      • 如果必须使用S24_LE格式进行录音,可以选择其他支持24bit采样的音频接口,如I2S等
      • 假如必须使用audiocodec声卡,S24_LE格式进行录音,可以自行调整RX_DATA寄存器的模式,结合RX_DATA寄存器中实际的有效数据分布,自己开发软件进行数据分析
        如果有分析和处理音频数据的需求,可以参考以上思路,结合RX_DATA寄存器去调整
      1 Reply Last reply Reply Quote Share 1
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • 1 / 1
      • First post
        Last post

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

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