为了让CSR867x的开发更容易,现与思度科技联合推出CSR867x学习板【淘宝链接:思度科技CSR开发板】。
技术交流QQ群号:743434463
开发板会员QQ群号:725398389(凭订单号入群,赠PPT、项目源码、视频教程)
——————————正文分割线———————————–
#1. 引言
本文简述了CSR8675的DSP工程a2dp_sink的matlab仿真方法。
#2. 基础的音频处理框架
a2dp_sink工程对应的是CSR8675的A2DP音频播放功能。
工程的音频流处理框架如下:
大致的音频处理流程是:
- 接收音频数据并解码。在TWS enable时,音频数据不解码,直接relay给slave device。如果是I2S、analog等PCM数据源,也无需解码。
- 音效后处理。包括限幅、用户EQ、ANC EQ、低音增强、扬声器EQ、立体声增强、分频。隐含的处理包括输入端和输出端的采样率转换。
- 音量控制。包括模拟输出、数字输出、无线SUB输出。
- SUB音效处理。包括SUB EQ、SUB限幅。
#3. 修改音频处理框架
如果开发者需要在此音频流的基础上增删音频处理功能,通常的做法是修改DSP工程。在完成修改后,需要搭建一个基本的验证平台以验证改动。最基本的验证平台包括如下部分:
- PC机
- 音频信号输出端
- CSR8675硬件平台
- 音频信号输入端
- 信号分析软件
对于大多数的算法开发人员来说,除了CSR8675硬件平台以外,其他部分都或多或少存在于其现有的知识领域。而掌握某一特定的硬件平台需要阅读大量相关文档和代码,熟悉此平台的各种接口,熟练使用此平台的烧录编译、调试方法,才能摸清这个平台的优劣和能力,此工作一般由软件开发人员完成。
对于CSR8675平台来说,MCU和DSP运行在同一个芯片内,算法开发人员和软件开发人员在同一套软件和硬件平台上开发。实际项目中,算法和软硬件的开发是有依赖关系的,这就使得算法人员需要等到软硬件开发基本完成后才能开始算法的实现。此开发方式使得算法实现的风险在项目后期才会暴露出来。
实际开发过程中,算法开发人员和软件开发人员的工作有很多交集,因此往往会产生责任区分不明确,技术难点边界不清晰的问题。此类问题,如果解决得好,产品问题少,项目跑得顺,团队关系融洽;解决得不好,产品问题多,项目容易受阻,团队矛盾重重。因此,加强两者的工作的相互独立性,是解决此问题的有效方法。
matlab仿真工具能够使算法开发人员仅需一台笔记本即可开发和评估运行在CSR8675的DSP内的算法,使算法开发人员无需依赖真实的硬件平台。当算法开发人员的工作完成后,只需要向软件开发人员释放DSP工程,由软件开发人员二次集成即可。
#4. 修改源码
a2dp_sink工程源码不能直接用来仿真,原因是DSP在开始运行不能收到MCU发来的配置消息,使得DSP进入不正确的工作状态。
为了让工程源码能够直接仿真并输出结果,需要修改几处源码。
##4.1. codec_decoder.asm
选择analog作为输入源:
// Plugin type set from VM at run-time
.MODULE $app_config;
.DATASEGMENT DM;
.VAR io = $ANALOGUE_IO;
.ENDMODULE;
设置采样率:
// Variables to receive dac and codec sampling rates from the vm
.VAR $current_dac_sampling_rate = 4800; // Dac sample rate, set by message from VM
.VAR $set_dac_rate_from_vm_message_struc[$message.STRUC_SIZE]; // Message structure for VM_SET_DAC_RATE_MESSAGE_ID message
.VAR $current_codec_sampling_rate = 4800; // codec data sample rate, set by vm
.VAR $set_codec_rate_from_vm_message_struc[$message.STRUC_SIZE]; // Message structure for VM_SET_CODEC_RATE_MESSAGE_ID message
设置codec类型:
// This is the codec type being used
.VAR $codec_type = $music_example.ANALOGUE_CODEC_TYPE;
// This is the codec config being used
.VAR $codec_config = $music_example.ANALOGUE_CODEC_CONFIG;
##4.2. music_e