最近在弄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。