STM32自带的DSP库滤波初体验(一)

最近在弄STM32自带的DSP库里的滤波,记录一下:

arm_fir_instance_q15  instance_q15_S;
#define NUM_TAPS 			16				//滤波系数的个数
#define BLOCK_SIZE		32
q15_t firStateF32[BLOCK_SIZE + NUM_TAPS];
q15_t Fir_Coeff[NUM_TAPS] = {
        -79, -136, 312, 654, -1244, -2280, 4501, 14655, 14655, 4501, -2280, -1244, 654, 312, -136, -79};
q15_t firStateF32[BLOCK_SIZE + NUM_TAPS];

//1、初始化S    
arm_fir_init_q15(&instance_q15_S,NUM_TAPS,(q15_t*)&Fir_Coeff[0],&firStateF32[0],BLOCK_SIZE);

//2、用三角函数生成一个数组,
for (i = 0; i < SAMPLE_NUMBER; i++)
{
	f = 0.5 * arm_cos_f32(2 * 3.1415926f * 50 * i / SAMPLE_NUMBER) + 0.5 * arm_cos_f32(2 * 3.1415926f * 6000 * i / SAMPLE_NUMBER);
	arm_float_to_q15(&f, &testInput[i], 1); //f * 32768
}

//3、滤波
for (i = 0; i < SAMPLE_NUMBER / BLOCK_SIZE; i++)
{
	arm_fir_q15(&instance_q15_S,   testInput + (i * BLOCK_SIZE),   testInput + (i * BLOCK_SIZE),  BLOCK_SIZE);
}

        整个滤波的过程比较简单,先是调用arm_fir_init_q15函数来初始化instance_q15_S,然后用三角函数生成一个50Hz+6000Hz的正弦数组,放在testInput数组中,最后调用arm_fir_q15函数来滤波。

        这个里面需要注意的是,滤波系数的个数,也就是NUM_TAPS必须是偶数。这个翻了些文档,都没讲,若是奇数的话一运行就进HARDFAULT。打开arm_fir_init_q15这个函数的原型,里面讲到了参数的设置。

下面是函数的路径:

用软件打开可以看到

    还有就是firStateF32这个数组,它的大小numTaps+blockSize,不要减一,因为我用的STM32F407的芯片,减一的话也会进hardfault。

 这里可以看到,内核是M4的话,数组大小是numTaps+blockSize;内核是M3的话,数组大小是numTaps+blockSize-1。

 

物联沃分享整理
物联沃-IOTWORD物联网 » STM32自带的DSP库滤波初体验(一)

发表评论