在OpenSTLinux中使用CMSIS-DSP
在OpenSTLinux中使用CMSIS-DAP
第一步、下载CMSIS-Core内核源码包和CMSIS-DSP源码包
git clone https://github.com/ARM-software/CMSIS_5.git
git clone https://github.com/ARM-software/CMSIS-DSP.git
第二步、将DSP 源码包编译成.a预编译文件
cd CMSIS-DSP/Source
然后打开CMakeList.txt文件
include_directories(/home/bai/project/CMSIS-DSP/Include)
include_directories(/home/bai/project/CMSIS_5/CMSIS/Core_A/Include)
include_directories(/home/bai/project/CMSIS-DSP/PrivateInclude)
添加这几个头文件不然会报找不到文件的错误,记得替换为自己的路径
然后
cmke …
make编译之前记得使用交叉编译环境
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
然后 make
然后你ls Source/ 就会看到
CMakeFiles cmake_install.cmake libCMSISDSP.a Makefile
此时libCMSISDSP.a 就是我们需要的文件
使用示例
如果你单独编译.c文件
创建一个CMakeList.txt 也可以使用Makefile
cmake_minimum_required(VERSION 3.15)
# 使用C99标准
set(CMAKE_C_STANDARD 99)
# 项目名称
project(CMSIS_DSP_Project C CXX ASM)
# 设置交叉编译工具链路径
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_ASM_COMPILER arm-linux-gnueabihf-gcc)
# 添加 CMSIS-DSP 头文件路径
include_directories("/home/bai/project/CMSIS-DSP/Include")
include_directories("/home/bai/project/CMSIS_5/CMSIS/Core_A/Include")
# 添加 CMSIS-DSP 静态库路径
link_directories("/home/bai/project/CMSIS-DSP/Source/Source")
# 定义你的可执行文件(以 main.c 为例)
add_executable(main_executable main.c)
# 链接 CMSIS-DSP 库和数学库
target_link_libraries(main_executable CMSISDSP m)
然后再创建一个main.c文件
#include "arm_math.h"
#include <stdio.h>
int main(void) {
float32_t inputArray[4] = {1.0, 2.0, 3.0, 4.0};
float32_t outputArray[4];
arm_rfft_fast_instance_f32 S;
// 初始化FFT实例
arm_rfft_fast_init_f32(&S, 4);
// 进行FFT
arm_rfft_fast_f32(&S, inputArray, outputArray, 0);
// 打印输出结果
for (int i = 0; i < 4; i++) {
printf("%f\n", outputArray[i]);
}
return 0;
}
如果你使用Qt
你需要在pro文件中添加
INCLUDEPATH += /home/bai/project/CMSIS-DSP/Include
INCLUDEPATH += /home/bai/project/CMSIS_5/CMSIS/Core_A/Include/
# 指定库路径
LIBS += -L/home/bai/project/CMSIS-DSP/Source/Source -lCMSISDSP
# 如果项目需要数学库,可以加入数学库链接
LIBS += -lm
#define FFT_SIZE 1024 // 设置 FFT 的点数,必须是 2 的幂
float32_t input[FFT_SIZE * 2]; // 输入数组,存放时域信号,FFT 输入是复数,因此大小为 2*FFT_SIZE
float32_t output[FFT_SIZE]; // 输出数组,用于存储 FFT 的幅度(频域数据)
void performFFT() {
arm_cfft_instance_f32 fft_instance;
// 初始化 FFT
arm_cfft_init_f32(&fft_instance, FFT_SIZE);
// 执行 FFT
arm_cfft_f32(&fft_instance, input, 0, 1);
// 计算频谱幅度
arm_cmplx_mag_f32(input, output, FFT_SIZE);
// 输出结果
for (int i = 0; i < FFT_SIZE; i++) {
printf("Frequency bin %d: Magnitude = %f\n", i, output[i]);
}
}