<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[【FAQ】全志R329如何解决在Audiocodec使用S24_LE格式进行录音时产生的软件分析波形异常问题？]]></title><description><![CDATA[<p dir="auto"><strong>问题背景</strong></p>
<p dir="auto">硬件：R329<br />
软件：Tina<br />
内核:Linux-4.9</p>
<p dir="auto"><strong>问题描述</strong></p>
<p dir="auto">使用Audiocodec进行录音，格式S24_LE，录制的.wav波形在某些软件中异常</p>
<pre><code>arecord -D hw:audiocodec -f S24_LE -r 16000 -c 2 -d10 /tmp/test3_S24_LE.wav
</code></pre>
<p dir="auto"><img src="/assets/uploads/files/1637892209183-d65d357edb0842cb9d54148ed1c5e0b3.jpg" alt="d65d357edb0842cb9d54148ed1c5e0b3.jpg" class=" img-responsive img-markdown" width="1197" height="293" /><br />
需要放大很多倍才能看到声音波形</p>
<p dir="auto"><img src="/assets/uploads/files/1637892219969-3cddc50a8f214d7380305433df378993.jfif" alt="3cddc50a8f214d7380305433df378993.jfif" class=" img-responsive img-markdown" width="undefined" height="undefined" /></p>
<p dir="auto"><strong>问题分析</strong></p>
<p dir="auto">1.R329的Audiocodec用于录音的ADC只支持16bit和20bit的采样精度。采样后的数字信号会存放到RX_FIFO中，RX_FIFO的大小为256*20-bit，其他平台可以在User Manual确认支持的采样精度，从而判断是否会有这个问题产生</p>
<p dir="auto"><img src="/assets/uploads/files/1637892238033-4570bdb36f594591b6ec4c71310e5fe7.jfif" alt="4570bdb36f594591b6ec4c71310e5fe7.jfif" class=" img-responsive img-markdown" width="undefined" height="undefined" /></p>
<p dir="auto">2.RX_DATA是一个32位的寄存器，保存的是从RX_FIFO获取的一个channel的样本数据，当使用arecord进行录音时，RX_DATA中的值会经DMA搬至内存，最后保存到.wav中</p>
<p dir="auto"><img src="/assets/uploads/files/1637892270141-5c2c17d228f944fd8a4a6e8d1924e778.jfif" alt="5c2c17d228f944fd8a4a6e8d1924e778.jfif" class=" img-responsive img-markdown" width="undefined" height="undefined" /></p>
<p dir="auto">其中RX_DATA有四种模式去获取RX_FIFO的数据，S24_LE和S32_LE均采用20-bit mode0</p>
<p dir="auto"><img src="/assets/uploads/files/1637892282238-6972b81f741b4bf9829ecb814f5dbb7a.jfif" alt="6972b81f741b4bf9829ecb814f5dbb7a.jfif" class=" img-responsive img-markdown" width="undefined" height="undefined" /></p>
<p dir="auto">当设置了20bit采样精度时，对应的两种模式如下图所示：</p>
<p dir="auto"><img src="/assets/uploads/files/1637892294133-8b502f06666046368fafccf0d13eee46.jfif" alt="8b502f06666046368fafccf0d13eee46.jfif" class=" img-responsive img-markdown" width="undefined" height="undefined" /></p>
<p dir="auto">3.先说明一下S24_LE和S32_LE这两种格式的区别</p>
<p dir="auto">S24_LE指有符号整型，范围是-2^23 ~ ((2^23) - 1)，有效数据在低24位<br />
S32_LE指有符号整型，范围是-2^31 ~ ((2^31) - 1)，有效数据在高24位</p>
<pre><code>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
</code></pre>
<p dir="auto">4.在驱动程序中，S24_LE和S32_LE虽然都支持，但他们两者都是使用20-bit的mode0，这导致这两种格式保存到文件中的数据排布是一致的，但生成的wav头信息中的采样位数则不一样，从下图可以看出两者的差异</p>
<p dir="auto">S32_LE的wav文件信息:</p>
<p dir="auto"><img src="/assets/uploads/files/1637892344764-b782fd998a1a42bfafb6a46a3362d79b.jfif" alt="b782fd998a1a42bfafb6a46a3362d79b.jfif" class=" img-responsive img-markdown" width="undefined" height="undefined" /></p>
<p dir="auto">若软件以S32_LE进行解析，以上红框的数据变为0x0f80f0，依然可以保留全部有效数据</p>
<p dir="auto"><img src="/assets/uploads/files/1637892355083-5de38b0c26a346a2bd0cc517b1cb6485.jfif" alt="5de38b0c26a346a2bd0cc517b1cb6485.jfif" class=" img-responsive img-markdown" width="undefined" height="undefined" /></p>
<p dir="auto">S24_LE的wav文件信息:</p>
<p dir="auto"><img src="/assets/uploads/files/1637892373102-561fc954670c4a7e8f5c122acd788689.jfif" alt="561fc954670c4a7e8f5c122acd788689.jfif" class=" img-responsive img-markdown" width="undefined" height="undefined" /></p>
<p dir="auto">若软件以S24_LE进行解析，以上红框的数据变为0x55f000，便会丢失一部分数据</p>
<p dir="auto"><img src="/assets/uploads/files/1637892378241-a185f006bee4483ebb53b3835c4053dc.jfif" alt="a185f006bee4483ebb53b3835c4053dc.jfif" class=" img-responsive img-markdown" width="undefined" height="undefined" /></p>
<p dir="auto"><strong>解决方案</strong></p>
<p dir="auto">总结原因就是audiocodec的采样精度只支持16和20bit，因此PCM格式中S24_LE虽然也支持，但硬件的特性使驱动并不能做到很好的适配，若软件以标准S24_LE格式进行分析，则会丢失高位的有效数据，这取决于软件如何对数据进行分析，解决方法有以下三种</p>
<ul>
<li>使用audiocodec时，使用-f S32_LE，修改wav头信息中的采样位数位32，这对大部分软件都有效</li>
</ul>
<pre><code>arecord -D hw:-f S32_LE -r 16000 -c 2 -d10 /tmp/test32.wav
</code></pre>
<ul>
<li>如果必须使用S24_LE格式进行录音，可以选择其他支持24bit采样的音频接口，如I2S等</li>
<li>假如必须使用audiocodec声卡，S24_LE格式进行录音，可以自行调整RX_DATA寄存器的模式，结合RX_DATA寄存器中实际的有效数据分布，自己开发软件进行数据分析<br />
如果有分析和处理音频数据的需求，可以参考以上思路，结合RX_DATA寄存器去调整</li>
</ul>
]]></description><link>https://bbs.aw-ol.com/topic/645/faq-全志r329如何解决在audiocodec使用s24_le格式进行录音时产生的软件分析波形异常问题</link><generator>RSS for Node</generator><lastBuildDate>Mon, 11 May 2026 05:31:00 GMT</lastBuildDate><atom:link href="https://bbs.aw-ol.com/topic/645.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 26 Nov 2021 02:07:38 GMT</pubDate><ttl>60</ttl></channel></rss>