跳到主要内容

音频压缩模块音频数据压缩 (PCA, OPUS)

为了在有限的BLE带宽下传输音频数据,我们需要对音频压缩后再进行传输。压缩方法分为PCA和OPUS两种。

PCA压缩

该方法的主要接口实现在 cpu\br28\fft_and_pca.ccpu\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.ccpu\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转录功能。