速度滤波问题(SPEED_FR_MACRO(v) )

我使用的是TMDSHVMTRPFCKIT开发板,在测算速度比时候用了低通滤波,如下:

/* Low-pass filter*/            \
/* Q21 = GLOBAL_Q*Q21 + GLOBAL_Q*Q21*/        \
    v.Tmp = _IQmpy(v.K2,_IQtoIQ21(v.Speed))+_IQmpy(v.K3,v.Tmp); 

没看懂这个滤波器的理论依据是什么(我试了巴特沃斯变换,不对),求解释

完整代码如下:

 

#define BASE_FREQ       100            // Base electrical frequency (Hz)

float32 T = 0.001/ISR_FREQUENCY;    // Samping period (sec), see parameter.h

// Initialize the Speed module for QEP based speed calculation
    speed1.K1 = _IQ21(1/(BASE_FREQ*T));
    speed1.K2 = _IQ(1/(1+T*2*PI*5));  // Low-pass cut-off frequency
    speed1.K3 = _IQ(1)-speed1.K2;
    speed1.BaseRpm = 120*(BASE_FREQ/POLES);

#define SPEED_FR_MACRO(v)           \
/* Differentiator*/             \
/* Synchronous speed computation   */        \
   if ((v.ElecTheta < _IQ(0.9))&(v.ElecTheta > _IQ(0.1)))   \
/* Q21 = Q21*(GLOBAL_Q-GLOBAL_Q)*/         \
  v.Tmp = _IQmpy(v.K1,(v.ElecTheta - v.OldElecTheta));  \
   else v.Tmp = _IQtoIQ21(v.Speed);         \
/* Low-pass filter*/            \
/* Q21 = GLOBAL_Q*Q21 + GLOBAL_Q*Q21*/        \
    v.Tmp = _IQmpy(v.K2,_IQtoIQ21(v.Speed))+_IQmpy(v.K3,v.Tmp);  \
/* Saturate the output */           \
 v.Tmp=_IQsat(v.Tmp,_IQ21(1),_IQ21(-1));       \
 v.Speed = _IQ21toIQ(v.Tmp);          \
/* Update the electrical angle */         \
    v.OldElecTheta = v.ElecTheta;         \
/* Change motor speed from pu value to rpm value (GLOBAL_Q -> Q0)*/ \
/* Q0 = Q0*GLOBAL_Q => _IQXmpy(), X = GLOBAL_Q*/     \
    v.SpeedRpm = _IQmpy(v.BaseRpm,v.Speed);

#endif // __SPEED_FR_H__