总结

自己定义算法要添加在hifi工程里
hifi工程在wiki上可以下载,名字叫做project
在main.c里添加了自己的算法,算法的执行涉及到通道与effect_id
编译hifi项目需要安装 XtensaTool 与hifi4 configuration file
编译成功后移植bin文件
通过hifi4_effect_audio_process调用hifi里的算法.

hifi工程总结

hifi与riscv的数据通信是通过共享内存与软中断tx.
RISCV 将准备好的数据-> HFMEM->软中断->HIFI4 读取 RISCV 放的数据进行处理->软中断-> RISCV 程序拿回处理之后的数据。
895x 中编解码,混响降噪等音效函数都是通过hifi算法处理
hifi4_effect_audio_process是app用来向hifi传输数据的,参数cpu1t0_idx 代表通道数x,
例如cpu1t0_idx =0 , 通道0处理 ,即cpu1_sw0_process中处理

下载hifi工程原包project

原包在BT895X 领夹麦/无线话筒SDK

hifi4编译环境搭建

参考BT895X HIFI4开发指南
主要是下面三步

安装 xtensa

需要去找蓝讯申请激活码

Configuration Package 安装

在参考链接BT895X HIFI4开发指南下载HIFI4_win32_redist-ID636799.tgz

设置Code Blocks的 HIFI4 Compiler 配置

在这里插入图片描述

hifi4编译环境配置好之后,就可以打开hifi工程,修改代码编译

添加自定义算法在hifi工程里

添加增益算法的效果是对音频效果添加gain

  • 在project原包的main.c中添加增益算法xt_music_effects_process,
    xt_music_effects_process设置增益值,判断样点是否是24位,如果是16位调用pcm_soft_vol_process对音频流增益.
//参数: ptr:指向16位有符号整数音频数据的指针 gain:Q15格式的增益值  samples:需要处理的采样点数
void pcm_soft_vol_process(s16 *ptr, int gain, int samples)//16位音频音量调节
{my_printf("soft_vol_16bits\n");int i, val;ae_int32x2 d0, d2, d3;//32位×2的SIMD寄存器ae_int16x4 d1;			//16位×4的SIMD寄存器(核心优化单元)ae_int64 fa0, fa1, fa2, fa3;//64位扩展精度寄存器ae_int16x4 * restrict p_x = (ae_int16x4 *)ptr;//将输入指针转换为AE SIMD访问指针ae_int16x4 * restrict p_y = (ae_int16x4 *)ptr;//restrict关键字:向编译器保证指针不重叠,每次处理4个16位采样点(SIMD宽度)int shift = 32 - 15;//32位中间精度 - 15位增益精度 = 17位右移量d0 = AE_MOVDA32(gain);//将标量增益值加载到SIMD寄存器,增益值被广播到所有通道for (i = 0; i < samples / 4; i++) {AE_L16X4_IP(d1, p_x, sizeof(ae_int16x4));//从内存加载4个16位值到d1fa0 = AE_MUL32X16_L0(d0, d1);//d0低32位 × d1第0通道(16位)fa1 = AE_MUL32X16_L1(d0, d1);//d0低32位 × d1第1通道fa2 = AE_MUL32X16_H2(d0, d1);//d0高32位 × d1第2通道fa3 = AE_MUL32X16_H3(d0, d1);//d0高32位 × d1第3通道,//结果存储在64位寄存器(防止溢出)d2 = AE_TRUNCA32X2F64S(fa1, fa0, shift);//将两个64位结果截断为32位d3 = AE_TRUNCA32X2F64S(fa3, fa2, shift);//应用17位右移(32-15=17),组合为ae_int32x2寄存器(d2和d3)d1 = AE_SAT16X4(d3, d2);//将两个32位×2寄存器饱和到16位范围,确保结果在-32768到32767之间,组合为ae_int16x4寄存器(d1)AE_S16X4_IP(d1, p_y, sizeof(ae_int16x4));//将处理结果存储回内存,}
}void xt_music_effects_process(xt_ipc_cb_t *pcm)
{u32 in_nch = pcm->nchannel;//音频通道数u32 samples = pcm->samples;//每个通道采样点数u32 is_24bit = pcm->in_24bits;//24位标志int gain = 0x7800;//Q15格式增益值(0x7800 约等于 0.9375)if (is_24bit) {my_printf("soft_vol_24bits\n");} else {pcm_soft_vol_process((s16 *)pcm->buf, gain, samples * in_nch);}// alg_user_process((u8*)pcm->buf, pcm->samples, pcm->nchannel, pcm->in_24bits);       //鐢ㄦ埛绠楁硶process//调用用户定义的音频处理函数,传递 PCM 缓冲区、采样信息等参数,在音量调整后应用用户算法 (如均衡器、混响等)
}
  • 设置算法调用条件
    app层想调用hifi算法,需要通过通道数与effect_id,类似于通过通道数与effect_id给hifi编号,然后app层根据编号调用
    例如设置通道1且effect_id=21时调用xt_music_effects_process
//通道1处理
AT(.text.isr) OPTIMIZE_SIZE
void cpu1_sw1_process(void)
{...} else if (ipc_pcm->effect_id == 21) {xt_music_effects_process(ipc_pcm);} else {
...
}

写好代码后,编译项目,把编译结果移到app层

编译成功后移植bin文件

工程文件会在编译后自动运行 postbuild.bat,生成iram.bin、dram.bin、sram.bin三个文件。HIFI4 编译完成之后,复制 3 个 HIFI4 的 bin 文件到app\projects\earphone\Output\bin\res\hifi4 目录下.app层就能调用hifi4中的算法了.

app层调用hifi4算法

app层通过hifi4_effect_audio_process函数调用hifi算法,hifi4_effect_audio_process的参数cpu1t0_idx为通道数,参数effect_id为ipc_pcm->effect_id

#define hifi_xt_music_process(ibuf, samples, pcm_info, obuf)                 hifi4_effect_audio_process(CPU0T1_DEC_IDX, 21, ibuf, samples, pcm_info, obuf);
hifi_xt_music_process与hifi的通道1 effect_id=21的hifi算法绑定.

定义在音频流中运行的函数,在该函数内调用hifi4_effect_audio_process

hifi_echo_mic_cfg_t hifi_echo_mic_cfg AT(.buf.hifi_echo);
void hifi_echo_mic_audio_input1(u8 *ptr, u32 samples, int ch_mode, void *params)
{u32 pcm_info =  (0<<28) | ((0&0x0f)<<24) | (0<<16) | ch_mode;hifi_xt_music_process((u8*)ptr, samples, pcm_info,(u8*)ptr);//输出到下一级if (hifi_echo_mic_cfg.callback) {hifi_echo_mic_cfg.callback((void *)ptr, samples, ch_mode, params);}
}AT(.text.hifi_echo_set)WEAK
void hifi_echo_mic_output_callback_set1(audio_callback_t callback)
{hifi_echo_mic_cfg.callback = callback;
}AT(.text.hifi_echo_init)WEAK
void hifi_echo_mic_init1(u8 sample_rate, u16 samples, u8 channel)
{// memset(&echo_cfg,0,sizeof(echo_cfg));
}

在音频流中添加hifi_echo_mic_audio_input1

static ws_link_list_t adapter_mic_rx_cfg_tbl[] = {
/*  模块类型,                 使能,            初始化,                  输入接口,                   设置输出*/{DECODER_PRIO_TRANS_TYPE,  1,                decoder_prio_trans_init,  NULL,                        decoder_prio_trans_audio_output_callback_set},{HIFI_ECHO_TYPE,           1,                hifi_echo_mic_init1,       hifi_echo_mic_audio_input1,   hifi_echo_mic_output_callback_set1},             //ECHO#if ADAPTER_DAC_OUTPUT_EN{DAC0_OUT_TYPE,            1,                dac0_out_init,            dac0_out_audio_input,        dac0_out_audio_output_callback_set},            //DAC输出
#endif};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92144.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92144.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92144.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软考中级网络工程师】知识点之 STP 协议,网络的 “交通协管员”

目录一、STP 协议初相识二、STP 协议登场&#xff0c;网络环路难题迎刃而解2.1 网络环路困境2.2 STP 协议闪亮登场三、STP 协议核心探秘&#xff1a;生成树算法3.1 选举根网桥3.2 确定根端口3.3 选定指定端口四、STP 协议端口状态解析4.1 阻塞状态4.2 监听状态4.3 学习状态4.4 …

分布式网关技术 + BGP EVPN,解锁真正的无缝漫游

无线漫游的核心挑战与标准化协议支持在构建高性能无线网络时&#xff0c;实现用户终端&#xff08;STA&#xff09;在不同接入点&#xff08;AP&#xff09;之间平滑、快速的漫游是核心目标之一。我们的无线AP产品原生支持业界标准的802.11k/v/r协议&#xff08;常称为“快速漫…

广东省省考备考(第六十七天8.5)——资料分析、数量(强化训练)

资料分析 错题解析解析今日题目正确率&#xff1a;87% 数量&#xff1a;数学运算 错题解析解析解析解析标记题解析解析今日题目正确率&#xff1a;73%

FLAN-T5:大规模指令微调的统一语言模型框架

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 一、核心定义与原始论文 FLAN-T5是Google于2022年提出的指令微调&…

jenkins插件Active Choices的使用通过参数动态控制多选参数的选项

title: jenkins插件Active Choices的使用通过参数动态控制多选参数的选项 tags: - jenkins categories: - 学习语录Jenkins Active Choices 插件&#xff1a;通过参数动态控制多选参数选项一、插件介绍Active Choices 插件&#xff08;以前称为 Uno Choice 插件&#xff09;是…

Matplotlib(六)- 坐标轴定制

文章目录一、坐标轴概述1. 坐标轴介绍2. 坐标轴相关属性二、坐标轴1. axes() 方法介绍2. 示例&#xff1a;添加多个绘图区域三、坐标轴的刻度1. 坐标轴的刻度介绍2. 刻度定位器和格式器2.1 刻度定位器2.2 刻度格式器2.3 示例&#xff1a;刻度定位和格式3. 刻度样式3.1 tick_par…

【物联网】基于树莓派的物联网开发【22】——树莓派获取传感器数据实时存储实战

场景介绍 今天程序猫带领大家如何实时获取树莓派传感器温湿度数据&#xff0c;并自动存储到数据库中。确保数据的持续性。 实现过程 硬件连接 树莓派4b连接GPIO引脚与DHT11传感器; 硬件只涉及树莓派、DHT11传感器。 DHT11的信号引脚连接树莓派的GPIO17&#xff0c; DHT11的Vdd&…

Linux DNS缓存与Nginx DNS缓存运维文档

一、Linux DNS缓存机制与配置 1. Linux DNS缓存原理 Linux系统中的DNS缓存主要通过以下几种方式实现&#xff1a; ​** nscd(Name Service Caching Daemon)**​&#xff1a;系统级缓存服务&#xff0c;可缓存DNS解析、主机名解析等信息​dnsmasq​&#xff1a;轻量级DNS转发器和…

Java开发时出现的问题---并发与资源管理深层问题

Java 并发模型基于 JVM 内存模型&#xff08;JMM&#xff09;&#xff0c;资源管理涉及 IO、线程、锁等关键组件。若对并发语义、资源生命周期理解不透彻&#xff0c;易引发死锁、内存泄漏、数据错乱等严重问题。1. 并发三大特性&#xff08;可见性、原子性、有序性&#xff09…

从「同步」到「异步」:用 aiohttp 把 Python 网络 I/O 榨到极致

目录 一、写在前面&#xff1a;为什么 IO 是瓶颈 二、同步模型&#xff1a;requests 的忧伤 三、线程池&#xff1a;用并发掩盖阻塞 四、aiohttp&#xff1a;让「等待」非阻塞 4.1 安装与版本约定 4.2 异步客户端&#xff1a;asyncio aiohttp 4.3 错误处理与超时 4.4 …

MySQL 在麒麟系统上部署使用 + DBeaver 远程连接 + SQL 数据导入完整流程

&#x1f680; MySQL 在麒麟系统上部署使用 DBeaver 远程连接 SQL 数据导入完整流程适用于国产操作系统&#xff08;如&#xff1a;麒麟 / 统信 / Ubuntu&#xff09;和 MySQL 8.0。包含远程配置、授权连接、SQL 导入、DBeaver连接配置等常见问题解决方案。&#x1f4e6; 环境…

C语言-指针初级(指针定义、指针的作用、指针的计算、野指针、悬空指针、void类型指针)

本章概述思维导图&#xff1a;C语言指针指针是C语言中最强大但也最容易混淆的特性之一。它提供了直接操作内存地址的能力&#xff0c;使得C语言具有高效性和灵活性。下面我将详细介绍C语言指针的各个方面。指针定义指针的本质&#xff1a;指针是一个变量&#xff0c;其值为另一…

具身智能VLA困于“数据泥潭”,人类活动视频数据是否是“破局之钥”?

前言尽管当前的视觉-语言-动作&#xff08;VLA&#xff09;模型已展现出显著进展&#xff0c;但其在新场景和与复杂物体交互中的性能会显著下降&#xff0c;在遵循指令方面落后于像LLaVA 这样的大型多模态模型&#xff08;LMM&#xff09;。这种局限性源于现有VLA模型对存在固有…

CIO如何规划企业BI分析指标体系 —— 从经营出发到绩效管理

如果你是一家企业的CIO&#xff0c;要启动一个商业智能BI项目&#xff0c;负责规划整个项目的商业智能BI分析内容&#xff0c;你该如何入手准备&#xff1f;要有什么样的思路。如果是管理层、老板还不能清晰认识到商业智能BI的价值&#xff0c;也提不出很清晰的需求&#xff0c…

go学习笔记:panic是什么含义

anic 是 Go 语言中的一种运行时错误处理机制&#xff0c;用于处理程序中的异常情况。 基本含义 panic 会&#xff1a; 立即停止当前函数的执行 开始执行 defer 函数&#xff08;如果有的话&#xff09; 向上传播到调用栈&#xff0c;逐层执行 defer 如果到达 main 函数&am…

OpenLayers 入门指南【五】:Map 容器

文章目录 一、Map 对象核心参数 1. target 2. view 3. layers 4. controls 5. interactions 6. 其他重要参数 二、Map 对象常用方法 1. 图层管理 2. 控件管理 3. 交互管理 4. 视图与坐标操作 5. 事件监听 6. 覆盖物管理 7. 其他 三、总结 上一章节中我们通过修改OlMap.vue组件已…

关税战火中的技术方舟:新西兰证券交易所的破局之道 ——从15%关税冲击到跨塔斯曼结算联盟,解码下一代交易基础设施

一、今日焦点&#xff1a;全球关税震荡与新西兰的“技术自卫” 1. 特朗普关税大限落地&#xff0c;新西兰启动紧急游说 2025年8月1日&#xff0c;美国总统特朗普正式签署行政令&#xff0c;对贸易顺差国征收最低15%基准关税。新西兰贸易部长紧急声明&#xff1a;“将提出有力证…

windows内核研究(软件调试-软件断点)

软件调试软件断点调试的本质是什么&#xff1f;就是在被调试程序中触发异常&#xff0c;然后被调试程序就会向_DEBUG_OBJECT结构体添加调试事件&#xff0c;这里我们调试器就接管这个异常了&#xff08;调试的过程就是异常处理的过程&#xff09; 软件断点 在x64dbg中通过快捷键…

HarmonyOS】鸿蒙应用开发中常用的三方库介绍和使用示例

&#x1f31f; 鸿蒙应用开发常用三方库指南&#xff08;2025 最新版&#xff09;适用版本&#xff1a;HarmonyOS NEXT / API 12 参考来源&#xff1a;HarmonyOS 三方库中心 截止至 2025 年 8 月 1 日&#xff0c;本文整理了当前社区中下载量高、稳定性强、生态完善的热门三方库…

【通识】C Sharp

1. 使用 \p{名称}构造匹配Unicode常规类别&#xff08;该示例为Pd或“标点、短划线”类别&#xff09;和命名块&#xff08;IsGreek和IsBsicLatin命名块&#xff09; using System; using system.Text.RegularExpressions; public class Example {public static void main() {s…