STM32CubeMX+CLion 使用ARM_CMSIS_DSP

安裝

參考:

【CLion開發stm32】如何使用DSP庫 - 未知的奇跡 - 博客園

實際上這樣配置會出一點小問題,現對其修改

1. 項目根目錄下新建 DSP_LIB文件夾

將目錄STM32CubeMX\Repository\STM32Cube_FW_G4_V1.6.1\Drivers\CMSIS\DSP下的Include文件夾和Sources文件夾復制到DSP_LIB文件夾中

Include文件夾中,僅保留arm_common_tables.harm_const_structs.harm_math.h三個頭文件,刪除其余頭文件。

如果沒有,需要在Software Packs里下載

2. 修改CMakeLists_template.txt文件內容為

include_directories(${includes} DSP_LIB/Include)add_definitions(${defines})file(GLOB_RECURSE SOURCES ${sources} "DSP_LIB/Source/*.c")
list(FILTER SOURCES EXCLUDE REGEX ".*/arm_.*\\.c")

3. 點擊STM32CubeMX中的 GENERATE CODE 重新生成代碼

常用函數講解

兩種類型:

  • 浮點類型:
  • 定點類型

基本數學運算

// 浮點加法
float32_t arm_add_f32(float32_t a, float32_t b);
// 浮點乘法
float32_t arm_mult_f32(float32_t a, float32_t b);
// 浮點向量加法(逐個元素相加)
void arm_add_f32(const float32_t *pSrcA, const float32_t *pSrcB, float32_t *pDst, uint32_t blockSize);
// 浮點向量乘法(逐個元素相乘)
void arm_mult_f32(const float32_t *pSrcA, const float32_t *pSrcB, float32_t *pDst, uint32_t blockSize);// Q15加法
q15_t arm_add_q15(q15_t a, q15_t b);
// Q15乘法
q15_t arm_mult_q15(q15_t a, q15_t b);
// Q31乘法
q31_t arm_mult_q31(q31_t a, q31_t b);

參數解釋:

  • const float32_t *pSrcA:第一個輸入數組指針
  • const float32_t *pSrcB:第二個輸入數組指針
  • float32_t *pDst:輸出數組指針
  • uint32_t blockSize:數組元素個數

快速傅里葉變換(FFT)函數

初始化實例

// 初始化浮點FFT實例
arm_status arm_cfft_init_f32(arm_cfft_instance_f32 *S, uint16_t fftLen);
// 初始化Q15 FFT實例
arm_status arm_cfft_init_q15(arm_cfft_instance_q15 *S, uint16_t fftLen);

參數解釋:

  • arm_cfft_instance_f32 *S:FFT實例結構體指針
  • uint16_t fftLen:FFT長度(點數)
    • arm_cfft_sR_f32_lenx,x可取大于等于16的2的整數冪,例如 arm_cfft_sR_f32_len16、arm_cfft_sR_f32_len32等?

使用預定義的初始化方法:

const arm_cfft_instance_f32 *fftInstance = &arm_cfft_sR_f32_len256;

核心函數

// 浮點復數FFT/逆FFT
void arm_cfft_f32(const arm_cfft_instance_f32 *S, float32_t *p1, uint8_t ifftFlag, uint8_t bitReverseFlag);
// Q15復數FFT/逆FFT
void arm_cfft_q15(const arm_cfft_instance_q15 *S, q15_t *p1, uint8_t ifftFlag, uint8_t bitReverseFlag);

參數解釋

參數描述
S預初始化的FFT實例指針(由arm_cfft_init_f32或預定義實例提供)
p1復數輸入/輸出數組(實部和虛部交錯存儲,長度為2*fftlen)
ifftFlag0表示FFT(正變換),1表示IFFT(逆變換)
bitReverseFlag0表示禁用位反轉,1表示啟用位反轉

幅度計算

// 計算復數FFT結果的幅度(浮點)
void arm_cmplx_mag_f32(float32_t *pSrc, float32_t *pDst, uint32_t numSamples);
// 計算復數FFT結果的幅度(Q15)
void arm_cmplx_mag_q15(q15_t *pSrc, q15_t *pDst, uint32_t numSamples);

參數解釋

  • pSrc:FFT復數結果
  • pDst:幅度譜
  • numSamples:樣本數量

濾波器函數

FIR濾波器

// 浮點FIR初始化
void arm_fir_init_f32(arm_fir_instance_f32 *S, uint16_t numTaps, float32_t *pCoeffs, float32_t *pState, uint32_t blockSize);
// Q15 FIR初始化
void arm_fir_init_q15(arm_fir_instance_q15 *S, uint16_t numTaps, q15_t *pCoeffs, q15_t *pState, uint32_t blockSize);

參數解釋

  • arm_fir_instance_f32 *S:FIR濾波器實例指針
  • uint16_t numTaps:濾波器系數個數
  • float32_t *pCoeffs:濾波器系數數組指針
  • float32_t *pState:狀態緩沖區指針
  • uint32_t blockSize:每次處理的樣本塊大小
// 浮點FIR濾波
void arm_fir_f32(const arm_fir_instance_f32 *S, float32_t *pSrc, float32_t *pDst, uint32_t blockSize);

參數解釋:

參數描述
Sarm_fir_init_f32初始化的FIR實例
pSrc輸入樣本數組,大小為blockSize
pDst輸出樣本數組,大小為blockSize
blockSize要處理的樣本數量,必須與初始化時相同

IIR濾波器

// 浮點IIR初始化
void arm_biquad_cascade_df1_init_f32(arm_biquad_casd_df1_inst_f32 *S, uint8_t numStages, float32_t *pCoeffs, float32_t *pState);// 浮點IIR濾波
void arm_biquad_cascade_df1_f32(const arm_biquad_casd_df1_inst_f32 *S, float32_t *pSrc, float32_t *pDst, uint32_t blockSize);

    參數解釋:

    參數說明
    *S??濾波器實例結構體指針??,用于存儲初始化后的配置和狀態。
    numStages??雙二階階段的數量??(即二階濾波器的個數)。
    *pCoeffs??濾波器系數數組??,按?[b0, b1, b2, a1, a2]?順序排列,每組對應一個階段,連續存儲。
    *pState??狀態緩沖區??,用于存儲延遲線數據(如?x[n-1],?y[n-1]?等),大小需為?2 × numStages

    FIR濾波器和IIR濾波器的區別

    特性FIR濾波器IIR濾波器
    ??全稱??Finite Impulse ResponseInfinite Impulse Response
    ??定義??系統沖激響應在有限時間內衰減為零系統沖激響應理論上會無限持續
    ??差分方程??僅使用輸入信號的歷史值同時使用輸入和輸出的歷史值
    ??數學表達式??y[n] = Σ b?·x[n-k] (k=0 to N-1)y[n] = Σ b?·x[n-k] - Σ a?·y[n-k]

    統計函數

    // 求最大值及其索引
    void arm_max_f32(float32_t *pSrc, uint32_t blockSize, float32_t *pResult, uint32_t *pIndex);// 求最小值及其索引
    void arm_min_f32(float32_t *pSrc, uint32_t blockSize, float32_t *pResult, uint32_t *pIndex);// 求平均值
    void arm_mean_f32(float32_t *pSrc, uint32_t blockSize, float32_t *pResult);// 求均方根(RMS)
    void arm_rms_f32(float32_t *pSrc, uint32_t blockSize, float32_t *pResult);// 求標準差
    void arm_std_f32(float32_t *pSrc, uint32_t blockSize, float32_t *pResult);// 求方差
    void arm_var_f32(float32_t *pSrc, uint32_t blockSize, float32_t *pResult);

    矩陣運算函數

    // 矩陣加法
    arm_status arm_mat_add_f32(const arm_matrix_instance_f32 *pSrcA, const arm_matrix_instance_f32 *pSrcB, arm_matrix_instance_f32 *pDst);// 矩陣乘法
    arm_status arm_mat_mult_f32(const arm_matrix_instance_f32 *pSrcA, const arm_matrix_instance_f32 *pSrcB, arm_matrix_instance_f32 *pDst);// 矩陣轉置
    arm_status arm_mat_trans_f32(const arm_matrix_instance_f32 *pSrc, arm_matrix_instance_f32 *pDst);// 矩陣求逆
    arm_status arm_mat_inverse_f32(const arm_matrix_instance_f32 *pSrc, arm_matrix_instance_f32 *pDst);

    經典數學函數

    // 正弦函數(浮點)
    float32_t arm_sin_f32(float32_t x);// 余弦函數(浮點)
    float32_t arm_cos_f32(float32_t x);// 平方根
    void arm_sqrt_f32(float32_t in, float32_t *pOut);

    類型轉換函數

    // 浮點到Q15轉換
    void arm_float_to_q15(float32_t *pSrc, q15_t *pDst, uint32_t blockSize);// Q15到浮點轉換
    void arm_q15_to_float(q15_t *pSrc, float32_t *pDst, uint32_t blockSize);

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/bicheng/88852.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88852.shtml
    英文地址,請注明出處:http://en.pswp.cn/bicheng/88852.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    深入解析C#接口實現的兩種核心技術:派生繼承 vs 顯式實現

    —— 如何優雅解決多接口沖突問題 🔍 核心概念速覽 派生成員實現 類通過繼承基類方法隱式滿足接口實現需求 interface IIfc1 { void PrintOut(string s); }class MyBaseClass { // 基類實現方法 public void PrintOut(string s) > Console.WriteLine($"Cal…

    鴻蒙項目構建配置

    鴻蒙項目構建配置 參考文檔 深入鴻蒙開發之后,一般會遇到以下幾個問題。 每次編譯的時候需要手動配置不同的 versionCode 和 versionName;在使用 git 管理代碼的時候,不同的人或者不在同一臺電腦上,dev eco 這個編譯器需要經常…

    os.machine()詳解

    核心功能返回硬件架構 返回字符串表示系統的硬件架構,常見值包括: x86_64:64 位 x86 架構(Intel/AMD)armv7l:32 位 ARM 架構(如樹莓派 3B)aarch64:64 位 ARM 架構&#x…

    linux-shell腳本

    linux-shell腳本一、什么是shell腳本?二、為什么要學習shell腳本?三、腳本執行的方式3.1 bash test.sh3.2 ./test.sh3.3 source test.sh3.4 . test.sh四、變量的使用4.1 變量定義與使用4.2 避免變量混淆4.3 位置變量for循環和位置變量的結合案例4.4 read…

    【嵌入式】51單片機學習筆記-Keil5軟件安裝教程

    00. 目錄 文章目錄00. 目錄01. Keil C51概述02. Keil C51下載03. Keil C51安裝04. Keil C51注冊05. 附錄01. Keil C51概述 Keil C51 是德國Keil公司(現被ARM收購)開發的嵌入式開發工具,專注于8051單片機的C語言和匯編開發。它是μVision IDE…

    ai之 ubuntu本地安裝mineru2.1.0

    MinerU 目錄 一、更新內容概述寫在前面的話:總體來看,2.0版本升級為全新的 VLM 解析模式,更優于以前的基礎解析方式。二、MinerU 安裝部署下面使用源碼來進行環境安裝。注意:當前狀態說明推薦解決方案如果是下載插件慢可以 指定阿里源三、MinerU 使用1. 在線體驗2. 命令行使…

    華為昇騰NPU與NVIDIA CUDA生態兼容層開發實錄:手寫算子自動轉換工具鏈(AST級代碼遷移方案)

    點擊 “AladdinEdu,同學們用得起的【H卡】算力平臺”,H卡級別算力,按量計費,靈活彈性,頂級配置,學生專屬優惠。 當國產AI芯片崛起遭遇生態壁壘,如何實現CUDA算子到昇騰平臺的無損遷移成為關鍵挑…

    GraphRAG Docker化部署,接入本地Ollama完整技術指南:從零基礎到生產部署的系統性知識體系

    相關推薦:Umi-OCR 的 Docker安裝(win制作鏡像,Linux(Ubuntu Server 22.04)離線部署) 一、技術背景與發展脈絡 1.1 RAG技術演進歷程分析 檢索增強生成(RAG)技術的發展經歷了三個重要…

    Android 系統默認Launcher3 菜單模式雙層改成單層-3

    Android 系統默認自帶Launcher3 菜單都為雙層模式 各手機大廠的Launcher的菜單模式都為單層 如何將launcher3的菜單模式改為單層模式 mOverviewPanel = (ViewGroup) findViewById(R.id.overview_panel); mWidgetsButton = findViewById(R.id.widget_butto…

    基于k8s環境下pulsar高可用測試和擴縮容(上)

    #作者:任少近 文章目錄Pulsar高可用測試1. 測試目的2.當前集群環境說明3. 模擬故障場景4.功能驗證5.結論Pulsar高可用測試 1. 測試目的 本次測試旨在驗證 Apache Pulsar 在某個 Broker 節點宕機(down)的情況下,是否仍能正常提供…

    JAVA JVM垃圾收集

    JVM 垃圾收集是 Java 自動內存管理的核心,本文通過圍繞 “哪些是垃圾、何時回收、怎么回收、用啥回收器、內存咋分配” 等展開一、判斷哪些是垃圾引用計數法:給對象分配引用計數器,有引用時計數加 1,引用失效減 1 ,計數…

    UniHttp生命周期鉤子與公共參數實戰:打造智能天氣接口客戶端

    > 通過靈活的生命周期鉤子,我們讓HTTP請求從機械操作進化為智能對話 在現代應用開發中,高效處理HTTP請求是核心能力。本文將深入探索UniHttp框架中強大的**HttpApiProcessor生命周期鉤子**,并演示如何利用其**公共參數填充機制**優雅地處理第三方接口。我們將以百度天…

    C++高級編程,類模版成員函數類外實現

    #include <iostream> #include <string>//類模版成員函數類外實現 template<class T1,class T2> class Person {//Person構造函數 public:Person(T1 name,T2 age);// {// this->m_Namename;// this->m_Ageage;// }//Person的成員函數void show…

    [Linux入門 ] RAID存儲技術概述

    一.數據存儲架構 1??存儲系統 2??主機系統 3??互連部件 4??存儲設備與磁盤陣列 二.數據存儲技術 1??數據冗余技術 2??RAID 0 3??RAID 1 4??RAID 2 5??RAID 3 6??RAID 4 三.基于硬件的RAID磁盤陣列 1??陣列卡(RAID控制器) 2??陣列卡種類 …

    AI繪畫生成章邯全身像提示詞

    融合了歷史元素和視覺表現力&#xff0c;力求生成符合秦末名將章邯身份的全身像。 核心提示詞結構&#xff1a; [主體描述]&#xff0c;[服裝/盔甲細節]&#xff0c;[姿態/神情]&#xff0c;[武器]&#xff0c;[背景/氛圍]&#xff0c;[風格/質量]&#xff0c;[參數] 選項一&…

    iOS高級開發工程師面試——關于優化

    iOS高級開發工程師面試——關于優化 一、TableView 有什么好的性能優化方案?二、界面卡頓和檢測你都是怎么處理?三、談談你對離屏渲染的理解?四、如何降低APP包的大小?五、日常如何檢查內存泄露?六、APP啟動時間應從哪些方面優化?一、TableView 有什么好的性能優化方案?…

    線性基學習筆記

    我們稱一個線性空間 V V V 的一個極大線性無關集為這個線性空間的線性基,簡稱基。 異或線性基 在異或空間下,我們定義如下內容。 異或和 設 S S

    ESP-Timer入門(基于ESP-IDF-5.4)

    主要參考資料&#xff1a; ESP 定時器&#xff08;高分辨率定時器&#xff09;: https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32s3/api-reference/system/esp_timer.html 目錄ESP-Timer與FreeRTOS TimerAPI 使用1.創建定時器2.啟動定時器3.管理定時器4.時間管…

    014_批處理與大規模任務

    批處理與大規模任務 目錄 批處理概述核心優勢技術規格API使用管理和監控應用場景最佳實踐 批處理概述 什么是批處理 批處理&#xff08;Batch Processing&#xff09;是一種異步處理大量Claude API請求的方法&#xff0c;允許您一次性提交多個消息請求&#xff0c;系統將在…

    Python淘寶拍立淘按圖搜索API接口,json數據示例參考

    淘寶拍立淘按圖搜索API接口示例淘寶的拍立淘(圖片搜索)功能通常是通過淘寶開放平臺提供的API實現的。以下是一個模擬的JSON數據示例和接口調用參考&#xff1a;模擬API請求示例import requestsimport base64# 示例圖片路徑image_path "example.jpg"# 讀取圖片并編碼…