藍訊hifi添加自定義算法

總結

自己定義算法要添加在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…