音频压缩模块音频数据压缩 (PCA, OPUS)
为了在有限的BLE带宽下传输音频数据,我们需要对音频压缩后再进行传输。压缩方法分为PCA和OPUS两种。
PCA压缩
该方法的主要接口实现在 cpu\br28\fft_and_pca.c
和 cpu\br28\fft_and_pca.h
中。其中需要关注的函数:
hw_fft_init()
:是PCA压缩算法中FFT计算模块的初始化函数。需要先执行这个函数后才可以正常进行FFT计算。pca_task()
:开启一个任务用于执行PCA压缩。其中调用了以下方法:mic_and_spk_data_pop_and_pre_emphasis(s16* emphasized_mic_and_spk_data, int spk_data_count, float sampling_ratio)
:将麦克风和扬声器(仅限通话中)中获取的音频数据做预处理(例如预增强)。dct_transform(s16* input, s16* output)
:对数据进行DCT转换,从时域转换为频域信息,其中用到了FFT模块。split_sign(s16* input, u8* sign)
:将带相位信息的频域信息分离为不带正负号的振幅和0/1二进制表示的相位信息。compress_and_add_send_block(s16* spectrum, s8* sign)
:对振幅信息进行PCA压缩后,与符号信息进行拼接,并输入到BLE发送队列。
pca_open()
:执行上述两个操作,开启PCA任务。transcription_open()
和transcription_close()
:开启/关闭耳机的转录状态。转录状态开启时,可以避免开启通话时重复打开麦克风以及关闭通话时关闭麦克风。
OPUS压缩
该方法的主要接口实现在 cpu\br28\audio_common\audio_mic_codec.c
和 cpu\br28\audio_common\audio_dec_codec.c
中,分别是用于压缩麦克风和扬声器(仅限通话中)的音频数据。其中需要关注的函数:
audio_mic_enc_open(int (*mic_output)(void *priv, void *buf, int len), u32 code_type, u8 ai_type)
和audio_dec_enc_open(int (*dec_output)(void *priv, void *buf, int len), u32 code_type, u8 ai_type)
:开启麦克风/扬声器音频的OPUS转录功能。具体用法参考apps\common\third_party_profile\jieli\JL_rcsp\bt_trans_data\le_rcsp_adv_module.c
。audio_mic_enc_close()
和audio_dec_enc_close()
:关闭麦克风/扬声器音频的OPUS转录功能。