void FIR_FilterInit(struct FIR *FIR_Filter)
{
/*128阶,截止频率5Hz,采样率6400Hz,BlackMan窗*/
const int32_t Fir_Coe[FIR_STAGE]=
{
0,0,1,2,4,7,10,14,18,23,29,36,43,52,61,71,83,95,108,123,139,156,174,194,214,236,260,284,310,337,365,
394,424,455,488,520,554,588,622,657,692,727,762,797,832,866,898,931,963,993,1022,1050,1076,1100,1123,
1144,1163,1179,1193,1206,1216,1223,1228,1230,1230,1228,1223,1216,1206,1193,1179,1163,1144,1123,1100,
1076,1050,1022,993,963,931,898,866,832,797,762,727,692,657,622,588,554,520,488,455,424,394,365,337,310,
284,260,236,214,194,174,156,139,123,108,95,83,71,61,52,43,36,29,23,18,14,10,7,4,2,1,0,0
};
for (uint8_t i = 0; i < FIR_STAGE; i++)
{
FIR_Filter->coef[i] = Fir_Coe[i];
}
for (uint8_t i = 0; i < FIR_STAGE; i++)
{
FIR_Filter->buffer[i] = 0;
}
FIR_Filter->index = 0;
}
/************************************************************************
* @brief 滤波器计算
* @param
* @retVal
* @Note
************************************************************************/
int32_t FIR_FilterProcess(struct FIR *FIR_Filter, int32_t input)
{
int64_t sum = 0;
int32_t output = 0;
uint8_t i, pos;
FIR_Filter->buffer[FIR_Filter->index] = input;
for (i = 0; i < FIR_STAGE; i++)
{
pos = (FIR_Filter->index + i)%FIR_STAGE;
sum += (int64_t)FIR_Filter->buffer[pos]*FIR_Filter->coef[i];
}
output = (int32_t)(sum>>FIR_SHIFT);//缩放2^16
FIR_Filter->index = (FIR_Filter->index + 1)%FIR_STAGE;
return output;
}