1、Hexagon DSP SDK开发环境搭建
Hexagon SDK 是高通提供的一个软件开发工具包,专为 Hexagon DSP(数字信号处理器)而设计,它提供了一组工具、库和API,可以用于创建和优化针对 Hexagon DSP 的软件。开发人员可以利用 Hexagon SDK 中的编程接口和资源,充分发挥 DSP 的处理能力,用于音频和视频处理、计算机视觉、机器学习以及其他信号处理应用。下载地址:Hexagon DSP SDK - Qualcomm Developer Network (根据实际芯片ADSP型号选择SDK)。
以下是基于Ubuntu 16.04.6 LTS进行操作,理论上同样适用于其他版本。
- 解压sdk包
unzip hexagon_sdk_lnx_3_5_installer_00006_1.zip
tar -xv Hexagon_SDK_LNX_3_5_Installer_00006_1.tar
- 赋予可执行权限并开始安装
chmod +x qualcomm_hexagon_sdk_3_5_4_eval.bin
执行 ./qualcomm_hexagon_sdk_3_5_4_eval.bin开始安装,根据提示输入信息,以便安装继续。
- 目录位置和文件列表
安装成功后的位置:~/Qualcomm/Hexagon_SDK/3.5.4
├── build
├── docs
├── examples
├── incs
├── Launch Hexagon IDE
├── libs
├── readme.txt
├── scripts
├── setup_sdk_env.source
├── test
├── tools
└── Uninstall_Hexagon_SDK
2. capi_v2_gain 算法模块编译和验证
capi_v2_gain是Hexagon SDK中预置的算法样例,它提供了一种简单的方法来对音频数据进行增益处理。该算法的原理十分简单,通过将增益值和使能开关作为参数传递给算法模块,可以轻松地控制增益处理的效果。通过调整增益值,可以改变音频信号的音量大小,而使能开关则用于启用或禁用增益处理功能。
capi_v2_gain$ tree
.
├── all.mak
├── data
│ ├── gain.cfg //配置文件,用于定义音频格式和设置校准参数
│ ├── input_wnoise_48k_stereo.raw //算法处理输入音频PCM raw文件
│ └── wnoise_48k_stereo_example_out.raw //算法处理后的输出音频PCM raw文件
├── eclipse //eclipse工程文件,当前基于Ubuntu环境编译,忽略
│ └── test_capi_v2_gain
│ ├── test_capi_v2_gain.launch
│ └── test_capi_v2_gain.qhut
├── hexagon_deps.min //makefile
├── hexagon.min //makefile
├── inc
│ └── capi_v2_gain.h //gain算法头文件
├── Makefile //makefile
└── src
├── capi_v2_gain.c //gain module 源码
└── capi_v2_gain_test.c //gain module测试单元源码
- 设置环境变量
~/Qualcomm/Hexagon_SDK/3.5.4 source setup_sdk_env.source
- 编译capi_v2_gain
cd examples/audio/capi_v2_gain
make tree V=hexagon_Debug_dynamic_toolv83_v66
- 测试capi_v2_gain算法
~/Qualcomm/Hexagon_SDK/3.5.4/tools/HEXAGON_Tools/8.3.07/Tools/bin/hexagon-sim -mv66g_1024 --simulated_returnval --usefs hexagon_Debug_dynamic_toolv83_v66 --pmu_statsfile hexagon_Debug_dynamic_toolv83_v66/pmu_stats.txt hexagon_Debug_dynamic_toolv83_v66/capi_v2_gain_q
ls 3.5.4/examples/audio/capi_v2_gain/data
gain.cfg input_wnoise_48k_stereo.raw wnoise_48k_stereo_example_out.raw
核心算法如下
void pcm_gain(int16_t* primary_mic_ptr,
int16_t* out_ptr,
uint32_t gain_val,
uint32_t num_samples)
{
uint32_t i;
uint32_t out;
for (i = 0; i < num_samples; i++) {
out = gain_val * primary_mic_ptr[i];
out_ptr[i] = (out >> 13);
}
}
static capi_v2_err_t capi_v2_gain_process(capi_v2_t* _pif,
capi_v2_stream_data_t* input[],
capi_v2_stream_data_t* output[])
{
...
pcm_gain(in_pcm_ch_ptr, out_pcm_ch_ptr, me->gain_val, (in_buf_ptr->actual_data_len) / sizeof(int16_t));
...
return result;
}