0
点赞
收藏
分享

微信扫一扫

【嵌入式】Cortex M4F DSP库

使用CM4内核自带的FPU需要在编译的时候添加编译选项:--cpu Cortex-M4.fp,以使能FPU指令集,否则使用的是普通Thumb2指令实现的DSP函数。同时还需添加宏定义:ARM_MATH_CM4,这在CMSIS DSP Library的arm_math.h里面用到。CMSIS DSP Library可以在ARM的官网找到:​

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

【嵌入式】Cortex M4F DSP库_i++ 

上面那个库是使用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正弦波叠加):

【嵌入式】Cortex M4F DSP库_arm开发_02

 FFT计算结果:
【嵌入式】Cortex M4F DSP库_arm开发_03

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


举报

相关推荐

0 条评论