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

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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"# 读取图片并编码…