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