ADC采集噪声问题及均方根值滤波与Kalman滤波比较
有一阵子笔者在做一个PT100热电阻的调理电路的时候采用了,使用恒流源的方式测热电阻的阻值。为了采集方便,将0.3mA的电流接入PT100直接把ADC输入端接在了PT100的两端。之后再输出温度的时候数据非常乱。查阅资料受到启发,采用求该信号的有效值(均方根值)方法进行滤波。
ADC采样、恒流源
ADC使用的是STM32F10x系列的内部12位ADC。恒流源电流值为0.3mA。
PT100热电阻
PT100是在零度下,阻值为100Ω的热电阻,其温度特性曲线如图1
图1:PT100温度特性曲线
基本上在-200—600摄氏度之间温度与电阻是线性关系。故测量PT100电阻值的其中一种办法就是给PT100接入一个恒流源,然后测其两端电压进而求出PT100电阻值。
噪声分析
电路上电(电源采用的是两节18650串联,AMS1115-3.3V降压稳压)将热电阻两端接入示波器(输入阻抗1MΩ)如图2。Single一下,然后将界面的所有采样数据做FFT(快速傅里叶变换)得到图3、图4.不难看出噪声主要来自于1Mhz的频段和一些高斯白噪声。
图2:原始信号
图3:FFT
图4:FFT
均方根值去除噪声
求一段信号的均方根值其实就是求这段信号的的有效值(RMS)即信号平方的均值再开方。ADC采样频率为10Khz。每次取100个数据进行计算。计算后数据由串口输出,见图:6、图7.(C代码见程序1)
图5:串口输出原始数据
图6:滤波数据
图7:给PT100加温度
一阶低通滤波器
y(n) = q*x(n) + (1-q)*y(n-1)
中Y(n)为输出,x(n)为输入。其中Q取0.5输入波形见图8.(C代码见程序2)
图8:加入一阶低通滤波串口输出
kalman滤波
第一步将数据导入MATLAB,画出原始数据曲线。见图9.。将数据做卡尔曼滤波观测矩阵。将该数据的t-2到t时刻的均值作为推测矩阵(详细见附加代码)。最后将卡尔曼输出做滑动平均。卡尔曼输出模型(蓝色)见图10.(matlab代码见程序3)
图9:MATLAB导入原始数据
图10:原始数据与滤波后的数据
总结:
噪声的产生有很大一部分原因应该是在画电路板的时候没有把数字地和模拟地分开造成的。Kalman滤波算法是一种基于时域的滤波算法。笔者认为该电路中的高斯白噪声主要来源于电源和数字信号对模拟信号的干扰。就本电路而言求信号的均方根值是比较有效的办法。笔者学识有限,如有错误的地方欢迎指正。
程序1
unsigned int disposePT100v()
{unsigned char i;double dData[100];double dSum;for(i=0;i<100;i++){dData[i] = g_iADC[0];//获取ADC数据dSum +=pow(dData[i],2);//做平方和delay_us(100);}dSum /= 100;//求均值dSum = sqrt(dSum);//开方return (unsigned int)dSum*3300/4096;//mv电压值
}
程序2
unsigned int lowV(unsigned int com)
{static unsigned int iLastData;unsigned int iData;double dPower=0.5;iData = (com*dPower)+(1-dPower)*iLastData;//计算iLastData = iData;//jilu return iData;//返回数据
}
程序3
clear
clc
ydata=textread('a123.txt','%s');%%导入数据
cData = hex2dec(ydata);%转换为10进制数据%t-1时刻的输出作为本次时刻的系统推测数值 最优偏差(初值)g_zer 推测误差(初值)g_ter 测量值偏差(初值)g_cer
%测量结果(矩阵) ner1 推测结果(矩阵)ner2 (end)
g_zer = 5;%%最优偏差初值
g_ter = 3;%%推测偏差初值
g_cer = 2;%%测量偏差初值
kdata = 0;
for i=1:5792%%迭代5000次ner1 = cData(i);if i>3ner2 = (cData(i-2)+cData(i-1)+cData(i))/3;%%t-2时刻到t时刻的平均值作为t时刻的推测值elsener2 = kdata;endif g_zer>g_terg_er = sqrt((g_zer^2)-(g_ter^2));%计算本次误差elseg_er = sqrt((g_ter^2)-(g_zer^2));%计算本次误差endkk = sqrt((g_er^2)/((g_er^2)+(g_cer^2)));%计算卡尔曼增益kdata = ner1+kk*(ner2-ner1);%更新卡尔曼输出g_zer = ((1-kk)*g_ter^2)^0.5;%计算本次最优偏差cKdata(i) = kdata;
end
%%%%%%%滑动平均%%%%%%%%%%
t = 1:5792;
a = 0;
b = 0;
pKdata = zeros(1,5792);
for i=1:5700for j=1:50a = a + cKdata(i+j);endb = a/50;%%求平均a = 0;pKdata(i)=b;
end
plot(t,cData,'R',t,cKdata,'G',t,pKdata,'B');
ADC采集噪声问题及均方根值滤波与Kalman滤波比较相关推荐
- STM32 热敏电阻NTC的软件设计(ADC采集)
目录 前言 一.查表函数 二.ADC采集 三.查表 四.数据滤波 前言 记录一些我在工作和学习过程中遇到的问题. NTC:在淘宝随便买的 单片机型号:STM32G030C8T6 目的:用单片机采集NT ...
- GNSS说第(七)讲---自适应动态导航定位(四)---Kalman滤波
GNSS说第(七)讲-自适应动态导航定位(四)-Kalman滤波 Kalman滤波 Kalman滤波的显著特点是对状态空间进行估计,而状态空间估计一般是动态估计.Kalman滤波采用递推算法,即由参数 ...
- 贝叶斯滤波和贝叶斯平滑(Kalman滤波,RTS平滑)
文章目录 贝叶斯滤波(*Bayesian filtering equations*) 贝叶斯滤波方程 Kalman滤波 贝叶斯平滑(*Bayesian smoothing*) 贝叶斯最优平滑方程 Ra ...
- Kalman滤波算法解释与实现
转载,原文地址,请支持:http://www.cnblogs.com/ycwang16/p/5999034.html 认知计算,还要从贝叶斯滤波的基本思想讲起.这一部分,我们先回顾贝叶斯公式的数学基础 ...
- 时序分析:Kalman滤波(状态空间)
在现实生活中, 数据的出现大多数是以非平稳形式, 这就涉及到了动态数据所构成的时间序列的分解.关于时间序列的分解, PeterJ.Brochwell&RichardA.Davis在其著作< ...
- kalman滤波算法与仿真
kalman滤波 认识kalman滤波 极力推荐此博客: 清风莞尔的博客 读完该博客可以较为清晰地认识kalman滤波 归纳出kalman方程: X^k=Fk∗X^k−1+Bk∗uk\hat{X}_k ...
- 卡尔曼滤波原理(七)平方根Kalman滤波:Potter平方根滤波、SVD分解滤波、UD分解滤波、平方根信息滤波SRIKF
学习总结分享导航定位知识,希望能帮助到大家,欢迎关注我的公众号:导航定位源码阅读 文章目录 一.平方根滤波基本形式 二.Potter平方根滤波 1.方差阵的量测更新 2.方差阵的时间更新 3.Pott ...
- 基于STM32F4:多通道ADC采集,采用DMA的形式,亲测有效
基于STM32F4的多通道ADC采集 单片机源程序如下: #include "sys.h" #include "delay.h" #include " ...
- ADC系列---噪声与误差(TI视频)
ADC系列-噪声与误差(TI视频) 1.误差分析背后统计学知识 对于一个均值为0的指标,典型值就是在高斯分布的均值上叠加±1个标准差之后的绝对值. 分布曲线是截断的高斯分布曲线. 三个分布是随机的,不 ...
最新文章
- Dubbo zookeeper 分布式 集群问题
- 博士论文致谢走红后,黄国平母校演讲再刷屏!
- Nginx+keepalived 实现高可用,防盗链及动静分离配置详解(值得收藏)
- gui界面设计心得体会 python_关于GUI的一点心得体会
- 使用Excel公式,获取 当前 Excel 的Sheet页 的 名字
- [转载] 5.2 calendar--通用日期的相关函数(4)
- python 发送email
- BZOJ1468Tree——点分治
- python3带tkinter窗口的ftp服务器,并使用pyinstaller打包成exe
- Spring Cloud 子项目
- Echarts地图动效制作
- 播布客全部视频教程汇总
- 刘夏真的简历中国科学院计算机所,一个中科院,四个985,还有一个志愿留在本校,这个学霸考研宿舍是怎样炼成的?...
- java微信公众号素材管理系统_微信公众平台后台素材管理
- 解决:微信支付坑多?其实很简单!在WXPayEntryActivity回调方法中向后台验证支付结果,但获取不到OrderID,下面几种办法应该可以解决。
- php 操作 腾讯企业邮箱设置发邮件,纯代码实现WordPress使用腾讯企业邮箱发送邮件...
- 集成电路之父Jack Kilby鲜为人知的故事
- 数字IC设计实现之hold violation修复大全
- 量化投资学习-6:谈谈熊市思维转牛市思维,解读牛市踏空和亏本的原因
- Python脚本一键找出哪些微信好友删了你(附源码)