高通ADSP音频算法集成(一)开发环境搭建

目录

1. Hexagon DSP SDK开发环境搭建

2. capi_v2_gain 算法模块编译和验证

3. 模块核心算法


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中预置的算法样例,它提供了一种简单的方法来对音频数据进行增益处理。该算法的原理十分简单,通过将增益值和使能开关作为参数传递给算法模块,可以轻松地控制增益处理的效果。通过调整增益值,可以改变音频信号的音量大小,而使能开关则用于启用或禁用增益处理功能。

  • 设置环境变量

~/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  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 //输出文件

3. 模块核心算法

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;
}