当前位置: 首页 > article >正文

【单片机】实现一个简单的ADC滤波器

实现一个 ADC的滤波器,PT1 滤波器(也称为一阶低通滤波器),用于对输入信号进行滤波处理。

typedef struct PT1FilterSettings PT1FilterSettings;
struct PT1FilterSettings
{
 //! last Filter output value
 uint32_t filtValOld;
 
 //! Tn..FilterTimeConstant, Ts...Sampletime, F Faktor =2^F
 uint32_t filtConst1; //! (Ts+Tn)*F in 2^n
 uint32_t filtConst2; //! Ts*F
 uint32_t filtConst3; //! Tn*F
 uint8_t filtFactor; 	//! 2^F
};

/*************************************************************************************************/
/*! \brief   PT1 filter for all channels, setting are used from the observers
 \param   uint16_t uiSignalFiltIn ... input value
					PT1FilterSettings *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 factor
  signalFiltOut  = (filterSettings->filtConst2*signalFiltOut); 							//multiply with sample time
	signalFiltOut  = signalFiltOut + (filterSettings->filtConst3*filterSettings->filtValOld); //add old value multiplied with the time constant
  signalFiltOut >>= filterSettings->filtConst1;															//scale down the sum 
  filterSettings->filtValOld = signalFiltOut;																//save value for next sample

  return (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 滤波器,使用了简单的递归公式来平滑输入信号。主要步骤包括:

  1. 初始化滤波器状态。
  2. 对输入信号进行缩放。
  3. 结合当前信号和上一个滤波输出值进行加权计算。
  4. 更新滤波器状态以备下次使用。
  5. 返回滤波后的信号。

这种滤波器常用于信号处理,能够有效去除高频噪声,平滑信号变化。


http://www.kler.cn/a/473316.html

相关文章:

  • 【电子通识】PWM驱动让有刷直流电机恒流工作
  • 无网络时自动切换备用网络环境
  • ADO.NET知识总结3---SqlCommand命令对象
  • Linux下文件重定向
  • 【阅读笔记】基于FPGA的红外图像二阶牛顿插值算法的实现
  • 使用JMeter玩转tidb压测
  • 数据结构(1~10)
  • Flutter Web 中文字体显示异常问题
  • C++之闭散列哈希表
  • 使用 Python 的 pyttsx3 库进行文本转语音
  • 探索电商宝藏:用Java打造1688商品详情爬虫,挖掘商业价值
  • ChatGPT加速器:解锁高效智能对话的新工具
  • 怎么对PDF插入图片并设置可见程度-免费PDF编辑工具分享
  • fetch-pack: unexpected disconnect while reading sideband packet报错问题排查
  • 设置密码,保护隐私:Excel文件加密的几种方法
  • CH348结合开源ModBus协议组成串口温度采集服务器
  • K-means算法在无监督学习中的应用
  • 网络安全-XSS跨站脚本攻击(基础篇)
  • C++虚函数(八股总结)
  • 深入理解 JSON 数据传递方式:数组格式与对象包装格式的对比与选择
  • 力扣第141题:环形链表 C语言解法
  • CentOS: RPM安装、YUM安装、编译安装(详细解释+实例分析!!!)
  • ExcelDataReader:一个.Net高性能Excel开源读取器
  • 游戏引擎学习第76天
  • 将txt转成excel正则化公式的调整
  • 超完整Docker学习记录,Docker常用命令详解