当前位置:网站首页>【嵌入式】Cortex M4F DSP库

【嵌入式】Cortex M4F DSP库

2022-07-06 08:40:00 好奇宝宝·权

使用CM4内核自带的FPU需要在编译的时候添加编译选项:--cpu Cortex-M4.fp,以使能FPU指令集,否则使用的是普通Thumb2指令实现的DSP函数。同时还需添加宏定义:ARM_MATH_CM4,这在CMSIS DSP Library的arm_math.h里面用到。CMSIS DSP Library可以在ARM的官网找到:https://developer.arm.com/tools-and-software/embedded/cmsisicon-default.png?t=M5H6https://developer.arm.com/tools-and-software/embedded/cmsis

如果使用MDK的话,直接在Runtime Environment管理器里面添加DSP库,Floating Point Hardware选择Single Precision,预定义宏加上ARM_MATH_CM4,这样工程自动添加了DSP库:

 

上面那个库是使用FPU指令集生成的DSP库,下面的是没有使用FPU指令集......

DSP库测试:

static float sin_out[256];
static float fft_mag[256];
static float fft_out[256];

static void DSP_Test()
{
    #define FFT_LENGTH  256
    
    arm_rfft_fast_instance_f32 S;

    // 创建一个t=2S钟之内的采样数据,采样点数FFT_LENGTH,采样周期T=t/FFT_LENGTH,采样频率F=1/T
    for(uint16_t i = 0; i < FFT_LENGTH; i++)
    {
        sin_out[i] = arm_sin_f32(i*2*3.1416f/128) + 0.3f*arm_sin_f32(i*2*3.1416f/16); //
    }
    
    for(uint16_t i = 0; i < FFT_LENGTH; i++)
    {
        LOGI("%.4f\r\n",sin_out[i]);
        DDL_DelayUS(1000);
    }
    
    arm_rfft_fast_init_f32(&S, FFT_LENGTH);         //初始化1024点FFT参数
    arm_rfft_fast_f32(&S,sin_out,fft_out,0);        //计算FFT
    arm_cmplx_mag_f32(fft_out,fft_mag, FFT_LENGTH); //计算模值

    for(uint16_t i = 0; i < FFT_LENGTH / 2; i++)
    {
        LOGI("%4d %4.4f %4.4f\r\n", i, (float)i * 128 / FFT_LENGTH, fft_mag[i]);//frequency = N * sample frequency / FFT length
        DDL_DelayUS(1000);
    }
}

结果在Excel上画图,采样点图像(1Hz正弦波和8Hz正弦波叠加):

 FFT计算结果:

 两个波峰分别对应1Hz和8Hz,和采样点的频率一致。

原网站

版权声明
本文为[好奇宝宝·权]所创,转载请带上原文链接,感谢
https://blog.csdn.net/tq384998430/article/details/125355739