实现一个 ADC的滤波器,PT1 滤波器(也称为一阶低通滤波器),用于对输入信号进行滤波处理。
typedef struct PT1FilterSettings PT1FilterSettings;
struct PT1FilterSettings
{//! last Filter output valueuint32_t filtValOld;//! Tn..FilterTimeConstant, Ts...Sampletime, F Faktor =2^Fuint32_t filtConst1; //! (Ts+Tn)*F in 2^nuint32_t filtConst2; //! Ts*Fuint32_t filtConst3; //! Tn*Fuint8_t filtFactor; //! 2^F
};/*************************************************************************************************/
/*! \brief PT1 filter for all channels, setting are used from the observers\param uint16_t uiSignalFiltIn ... input valuePT1FilterSettings *filterSettings ... filter instance of observer\return uint16_t filtert value\callgraph -**************************************************************************************************/
uint16_t pt1Filter(uint16_t uiSignalFiltIn, PT1FilterSettings *filterSettings)
{ // -------- info ----------------// 32Bit PT1 Filter (Euler Forward)uint32_t signalFiltOut;// ------ Filter initialization to first signal sample ----if (!filterSettings->filtValOld) {filterSettings->filtValOld = (uint32_t)uiSignalFiltIn << filterSettings->filtFactor; //load first value}signalFiltOut = (uint32_t)uiSignalFiltIn << filterSettings->filtFactor; //scale value with factorsignalFiltOut = (filterSettings->filtConst2*signalFiltOut); //multiply with sample timesignalFiltOut = signalFiltOut + (filterSettings->filtConst3*filterSettings->filtValOld); //add old value multiplied with the time constantsignalFiltOut >>= filterSettings->filtConst1; //scale down the sum filterSettings->filtValOld = signalFiltOut; //save value for next samplereturn (signalFiltOut >> filterSettings->filtFactor); //return value devided by the factor
}
下面逐行解释这段代码的功能和工作原理。
函数定义
uint16_t pt1Filter(uint16_t uiSignalFiltIn, PT1FilterSettings *filterSettings)
-
参数:
uiSignalFiltIn
:输入信号,类型为uint16_t
(16 位无符号整数)。filterSettings
:指向PT1FilterSettings
结构体的指针,包含滤波器的设置参数。
-
返回值:返回滤波后的信号,类型为
uint16_t
。
代码解析
uint32_t signalFiltOut;
- 定义一个 32 位无符号整数
signalFiltOut
,用于存储滤波后的信号。
滤波器初始化
if (!filterSettings->filtValOld)
{filterSettings->filtValOld = (uint32_t)uiSignalFiltIn << filterSettings->filtFactor; //load first value
}
- 检查
filtValOld
是否为零(即滤波器是否未初始化)。 - 如果是,则将输入信号左移
filtFactor
位并赋值给filtValOld
,这相当于初始化滤波器的状态。
滤波计算
signalFiltOut = (uint32_t)uiSignalFiltIn << filterSettings->filtFactor; //scale value with factor
- 将输入信号左移
filtFactor
位,进行缩放。
signalFiltOut = (filterSettings->filtConst2 * signalFiltOut); //multiply with sample time
- 将缩放后的信号乘以
filtConst2
,通常用于与采样时间相关的计算。
signalFiltOut = signalFiltOut + (filterSettings->filtConst3 * filterSettings->filtValOld); //add old value multiplied with the time constant
- 将
filtValOld
(上一个滤波输出值)乘以filtConst3
,并与当前信号相加。这一部分实现了滤波器的递归特性。
signalFiltOut >>= filterSettings->filtConst1; //scale down the sum
- 将
signalFiltOut
右移filtConst1
位,进行缩放,通常用于调整输出信号的范围。
filterSettings->filtValOld = signalFiltOut; //save value for next sample
- 将当前的滤波输出值保存到
filtValOld
,以便在下一个采样时使用。
返回值
return (signalFiltOut >> filterSettings->filtFactor); //return value divided by the factor
- 返回滤波后的信号,右移
filtFactor
位以恢复到原始范围。
总结
这段代码实现了一个 PT1 滤波器,使用了简单的递归公式来平滑输入信号。主要步骤包括:
- 初始化滤波器状态。
- 对输入信号进行缩放。
- 结合当前信号和上一个滤波输出值进行加权计算。
- 更新滤波器状态以备下次使用。
- 返回滤波后的信号。
这种滤波器常用于信号处理,能够有效去除高频噪声,平滑信号变化。