首页 > 技术知识 > 正文

一. 先来一波音频相关的基本概念

1、采样率

采样就是把模拟信号数字化的过程,不仅仅是音频需要采样,所有的模拟信号都需要通过采样转换为可以用0101来表示的数字信号,根据奈奎斯特理论,采样频率只要不低于音频信号最高频率的两倍,就可以无损失地还原原始的声音。通常人耳能听到频率范围大约在20Hz~20kHz之间的声音,为了保证声音不失真,采样频率应在40kHz以上。常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。

2、量化精度(位宽)

这个数值的数据类型大小可以是:4bit、8bit、16bit、32bit等等,位数越多,表示得就越精细,声音质量自然就越好,当然,数据量也会成倍增大。常见的位宽是:8bit 或者 16bit。

3、声道数

单声道(Mono)和双声道(Stereo)比较常见,顾名思义,前者的声道数为1,后者为2

4、 音频帧

音频跟视频很不一样,视频每一帧就是一张图像,而从上面的正玄波可以看出,音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms~60ms为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的,我们可以计算一下一帧音频帧的大小:

假设某通道的音频信号是采样率为8kHz,位宽为16bit,20ms一帧,双通道,则一帧音频数据的大小为:

int size = 8000 x 16bit x 0.02s x 2 = 5120 bit = 640 byte

5、 编码方式

上面提到过,模拟的音频信号转换为数字信号需要经过采样和量化,量化的过程被称之为编码,根据不同的量化策略,产生了许多不同的编码方式,常见的编码方式有:PCM 和 ADPCM,这些数据代表着无损的原始数字音频信号,添加一些文件头信息,就可以存储为WAV文件了,它是一种由微软和IBM联合开发的用于音频数字存储的标准,可以很容易地被解析和播放。

二. hi3531a 的音频调试

本次调试使用的AD芯片是CS5354, 支持主从模式,板载3颗AD芯片,分别对应AIP0,AIP1,AIP2,同时海思的AIO也支持主从模式。

1、录音和播放的原理

原始音频信号以模拟信号的形式给出后,通过 Audio Codec,按一定采样率和采样精度转换为数字信号。Audio Codec 以 I2S 时序或 PCM 时序的方式,将数字信号传输给 AI设备。芯片利用 DMA 将 AI 设备中的音频数据搬移到内存中,完成录音操作。播放和录音是基于同样的原理。芯片利用 DMA 将内存中的数据传输到 AO 设备。AO设备通过 I2S 时序或 PCM 时序向 Audio Codec 发送数据。Audio Codec 完成数字信号到模拟信号的转换过程,并输出模拟信号。

Hi3531A 3路 I2S 音频调试

需要注意的是:Codec 的时序模式选择、同步时钟、采样位宽等配置必须与 AI 设备的配置保持一致,否则可能采集

不到正确的数据。

2、 以第3路AD为例

使用的模式是3531a做主,CS5354做从,3531a给AD提供MCLK时钟,AD的引脚如下:

Hi3531A 3路 I2S 音频调试1

3、sample代码修改:

Ai -> Aenc -> file //注掉 SAMPLE_COMM_AUDIO_CfgAcodec AUDIO_DEV AiDev = SAMPLE_AUDIO_AI_DEV //SAMPLE_AUDIO_AI_DEV 对应的是AI设备,第3路为: #define SAMPLE_AUDIO_AI_DEV 2 stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000; //采样率 stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16; //位宽 stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER; //主从模式 stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO; //mono:单声道,stereo:立体声 s32AencChnCnt = 1;//s32AiChnCnt; //编码方式选择pcm static PAYLOAD_TYPE_E gs_enPayloadType = PT_LPCM; //立体声stAioAttr.u32ChnCnt = 2;

4、调试信息

Ai(2,0) bind to AencChn:0 ok! open stream file:”audio_chn0.pcm” for aenc ok bind adec:0 to ao(0,0) ok ~ # cat /proc/umap/ai [AI] Version: [Hi3531A_MPP_V1.0.4.0 B030 Release], Build Time: [Jan 13 2017, 17:17:20] —–AI DEV ATTR——————————————————————————————————— AiDev WorkMod SampR BitWid ChnCnt ClkCnt ClkSel SoundMod PoiNum ExFlag FrmNum 2 i2s_mas 8kHZ 16bit 1 20 0 mono 320 1 30 —–AI DEV STATUS——————————————————————————————————- AiDev TranLen CBPhy CBSize ROffSet WOffSet 2 640 4ac4a000 1280 280 0 —–AI DEV EXTEND STATUS———————————————————————————————— AiDev enTrack bMute Volume 2 0 N 0 —–AI CHN STATUS—————————————————————————————————————- AiDev AiChn State Read Write BufFul UsrQueLost UsrFrmDepth u32Data0 u32Data1 UserGet UserRls 2 0 enable 0 0 0 0 0 fffffffe ffff0003 0 0 —–AI CHN RESAMPLE STATUS——————————————————————————————————- AiDev AiChn State bResmp PoiNum InSampR OutSampR 2 0 enable N 0 (null) (null) —–AI CHN VQE STATUS0———————————————————————————————————— AiDev AiChn State bVqe workmod RATE PoiNum GainVol bAnr bAgc bEq bHpf bAec bRnr bHdr bDrc bPeq WrFile 2 0 enable N comm (null) 0 0 N N N N N N N N N N

成功时,AI DEV STATUS的ROffSet数值,和AI CHN STATUS的u32Data0、u32Data1均有数据显示

ROffSet: DMA buffer 的读指针相对于起始地址的偏移量。

u32Data0: 通道 Buffer 中第一个 32 位数据。

u32Data1: 通道 Buffer 中第二个 32 位数据。

5、Adobe Audition 播放 pcm 编码音频

Hi3531A 3路 I2S 音频调试2 Hi3531A 3路 I2S 音频调试3

猜你喜欢