一阶RC滤波器的算法实现(低通和高通)

2023-10-27

目前,项目需要处理信号。目标信号是特定频率范围内的信号。高频视为干扰。而一阶RC滤波器容易实现。但是网上资料往往没有详细的推导。因此在这里把笔记记下。本文的优势是比较详细,参数配置都有公式依据。

目录

1、一阶RC低通滤波器的算法实现

1.1 算法推导

1.2 波特图

1.3 用C语言实现

 2、一阶RC高通滤波器的原理以及实现

2.1 原理推导

2.2 波特图

2.3 用C语言实现

3 上机测试


1、一阶RC低通滤波器的算法实现

1.1 算法推导

一阶RC滤波器的硬件电路如图:

图中输入电压是Vi,电阻R,电容C,输出电压为Vo。

假设电路的输出阻抗很大(即不带任何负载),输入阻抗很小(理想情况)。可以得到以下公式:

V_o = \frac{1}{1+j\omega RC}V_i

电容的阻抗是Z_C = \frac{1}{j\omega C}

\omega = 2\pi f

截止频率f_{cut} = \frac{1}{2\pi RC},此频率下的信号,通过这个电路,输出电压和输入电压的关系式是V_o = \frac{1}{1+j}V_i

或者时域上的表达式:

V_o = V_i - RC\frac{dV_o}{dt}

上式离散后,可以得到:

V_o\left ( k \right )=\frac{V_i\left ( k \right )+\frac{RC}{T_s}V_o\left ( k-1 \right )}{1+\frac{RC}{T_s}}

假如要过滤掉10KHz以上的频率,可以选择fcut = 1K,并计算RC的值,代入上式。

1.2 波特图

用Octave或者Matlab可以得到传递函数的波特图:

 
  1. fcut =1000;

  2. RC=1/2/pi/fcut;

  3. %pkg load control %Octave用的读取control包

  4. y1 = tf(1,[RC,1])

  5. bode(y1)

以上波特图可见,在截止频率处(\omega =2\pi f,代入f=1k,可得截至角频率是6283 rad/s),信号会衰减到原来的0.707。这电路对频率大于截止频率的高频信号,具有比较强的衰减作用,同时对该信号有比较大的相位移动。

 

1.3 用C语言实现

C语言的实现1

 
  1. /**

  2. * @brief implement 1 order RC low pass filter

  3. * raw data filtered by a simple RC low pass filter@cufoff=5Hz

  4. * @param Vi : Vi(k)

  5. * @param Vi_p : Vi(k-1)

  6. * @param Vo : Vo(k)

  7. * @param Vo_p : Vo(k-1)

  8. * @note This example shows a simple way to report end of conversion

  9. * and get conversion result. You can add your own implementation.

  10. * @retval None

  11. */

  12. void LowPassFilter_RC_1order(float *Vi, float *Vo, float *Vo_p, float sampleFrq )

  13. {

  14. float CutFrq, RC, Cof1, Cof2;

  15.  
  16. //low pass filter @cutoff frequency = 5 Hz

  17. CutFrq = 5;

  18. RC = (float)1.0/2.0/PI/CutFrq;

  19. Cof1 = 1/(1+RC*sampleFrq);

  20. Cof2 = RC*sampleFrq/(1+RC*sampleFrq);

  21. *Vo = Cof1 * (*Vi) + Cof2 * (*Vo_p);

  22.  
  23. //update

  24. *Vo_p = *Vo;

  25. }

调用例子:

 
  1.  
  2. float b_ADCLoad1Volt, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;

  3.  
  4.  
  5. LowPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);

C语言实现2:

 
  1.  
  2. //*********** Structure Definition ********//

  3. typedef struct {

  4. float Vi;

  5. float Vo_prev;

  6. float Vo;

  7. float Fcutoff;

  8. float Fs;

  9. } LPF_1orderRC_F;

  10. //*********** Structure Init Function ****//

  11. void LPF_1orderRC_F_init(LPF_1orderRC_F *v)

  12. {

  13. v->Vi=0;

  14. v->Vo_prev=0;

  15. v->Vo=0;

  16.  
  17. //low pass filter @cutoff frequency = 5 Hz

  18. v->Fcutoff=5;

  19.  
  20. // execute 1000 every second

  21. v->Fs=1000;

  22. }

  23.  
  24. //*********** Function Definition ********//

  25. float LPF_1orderRC_F_FUNC(LPF_1orderRC_F *v)

  26. {

  27. float RC, Cof1, Cof2;

  28.  
  29. RC = (float)1.0/2.0/PI/v->Fcutoff;

  30. Cof1 = 1/(1+RC*v->Fs);

  31. Cof2 = RC*v->Fs/(1+RC*v->Fs);

  32.  
  33. v->Vo = Cof1 * v->Vi + Cof2 * v->Vo_prev;

  34.  
  35. v->Vo_prev = v->Vo;

  36.  
  37. return v->Vo;

  38. }

  39.  
  40. LPF_1orderRC_F lpf_1orderrc_handle;

  41.  

调用方式:

 
  1. ...

  2. int main(void)

  3. {

  4. ...

  5. LPF_1orderRC_F_init(&lpf_1orderrc_handle); //初始化

  6. while(1)

  7. {

  8. ...

  9. if(flag_1ms==1)

  10. {

  11. lpf_1orderrc_handle.Vi = ADCresult; //假设ADCresult是ADC采样结果

  12. LPF_1orderRC_F_FUNC(&lpf_1orderrc_handle); //usage

  13. FilteredResult = lpf_1orderrc_handle.Vo; //FilteredResult存放滤波结果

  14. }

  15. }

  16. }

  17.  

 

 

 

 2、一阶RC高通滤波器的原理以及实现

2.1 原理推导

这是一节RC高通滤波器的原理图:

V_o = \frac{1}{1+\frac{1}{j\omega RC}}V_i

截止频率f_{cut} = \frac{1}{2\pi RC}

写成时域上的表达式:

V_o = C\frac{d\left ( V_i - V_o \right )}{dt}R

离散化后得到:

V_o\left ( k \right )=\left ( V_i\left ( k \right )-V_i\left ( k-1 \right )+V_o\left ( k-1 \right ) \right )\frac{RC}{RC+T_s}

根据设定的截止频率,假如目标频率是50Hz,截止频率可以整定为0.5Hz,过滤低频分量,而不影响目标信号的采集。

RC = \frac{1}{2\pi f_{cut}}

2.2 波特图

传递函数可又频域函数转换得到,将s=j\omega带入频域公式。得到:

V_o = \frac{RCs}{RCs+1}V_i

Octave绘制波特图:

 
  1. fcut =0.5;

  2. RC=1/2/pi/fcut;

  3. pkg load control

  4. y1 = tf([RC,0],[RC,1])

  5. bode(y1)

 

 

高通滤波器对截至频率以上的信号无大影响,信号能正常经过滤波器。但是该滤波器对截至频率以下的信号,具有较大的影响。和截至频率相比,频率越小,衰减作用越明显。同时在相位图中可见,对频率越低的信号,相位移动也越大。

 

2.3 用C语言实现

C语言的实现1:

 
  1. void HighPassFilter_RC_1order(float *Vi, float *Vi_p, float *Vo, float *Vo_p, float sampleFrq )

  2. {

  3. float CutFrq, RC, Coff;

  4.  
  5. //high pass filter @cutoff frequency = 0.5 Hz

  6. CutFrq = 0.5;

  7. RC = (float)1.0/2.0/PI/CutFrq;

  8. Coff = RC/(RC + 1/sampleFrq);

  9. *Vo = ((*Vi) - (*Vi_p) +(*Vo_p) )*Coff ;

  10.  
  11. //update

  12. *Vo_p = *Vo;

  13. *Vi_p = *Vi;

  14. }

调用例子:

 
  1.  
  2. float b_ADCLoad1Volt, b_ADCLoad1VoltPrv, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;

  3.  
  4.  
  5. HighPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltPrv, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);

调用时,1000是指每秒需要执行这个函数1000次。

C语言实现2:

 
  1.  
  2. #define PI 3.1415

  3.  
  4.  
  5. //*********** Structure Definition ********//

  6. typedef struct {

  7. float Vi;

  8. float Vi_prev;

  9. float Vo_prev;

  10. float Vo;

  11. float Fcutoff;

  12. float Fs;

  13. } HPF_1orderRC_F;

  14. //*********** Structure Init Function ****//

  15. void HPF_1orderRC_F_init(HPF_1orderRC_F *v)

  16. {

  17. v->Vi=0;

  18. v->Vi_prev=0;

  19. v->Vo_prev=0;

  20. v->Vo=0;

  21.  
  22. //high pass filter @cutoff frequency = 0.05 Hz

  23. v->Fcutoff=0.05;

  24.  
  25. // execute 1000 every second

  26. v->Fs=1000;

  27. }

  28.  
  29. //*********** Function Definition ********//

  30. float HPF_1orderRC_F_FUNC(HPF_1orderRC_F *v)

  31. {

  32. float RC, Coff;

  33.  
  34. RC = (float)1.0/2.0/PI/v->Fcutoff;

  35. Coff = RC/(RC + 1/v->Fs);

  36. v->Vo = (v->Vi - v->Vi_prev + v->Vo_prev ) * Coff;

  37.  
  38. //update

  39. v->Vo_prev = v->Vo;

  40. v->Vi_prev = v->Vi;

  41.  
  42. return v->Vo;

  43. }

  44.  
  45. HPF_1orderRC_F hpf_1orderrc_handle;

调用例子:

 
  1. ...

  2. int main(void)

  3. {

  4. ...

  5. HPF_1orderRC_F_init(&hpf_1orderrc_handle); //初始化

  6. while(1)

  7. {

  8. ...

  9. if(flag_1ms==1)

  10. {

  11. hpf_1orderrc_handle.Vi = ADCresult; //假设ADCresult是ADC采样结果

  12.  
  13. FilteredResult = HPF_1orderRC_F_FUNC(&hpf_1orderrc_handle);//FilteredResult存放滤波结果

  14. }

  15. }

  16. }

  17.  

 

3 上机测试

板子上面MCU采用STM32F103C8,外扩了USB转UART模块,外扩了PIR+运放模块。

在STM32F103C8上面,PA7连接了某信号源。USART1和FT232模块连接,与电脑通信。

单片机对PA7的采样信号进行滤波处理,目的是把目标信号的直流部分和高频部分滤除,得到0.05Hz-5Hz以内的分量。

上位机使用了SerialChart-0.3.4,把信号波形显示。效果如下图。数据第一列是时间戳,第二列是原始数据,第三列是滤波后的数据。Chart中,蓝色是第二列原始数据,红色是第三列滤波后的数据。

可以看到,滤波器对直流信号有衰减作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一阶RC滤波器的算法实现(低通和高通) 的相关文章

  • NMOS和PMOS详解以及电路设计

    一 简介 MOS管 是MOSFET的缩写 MOSFET金属 氧化物半导体场效应晶体管 简称金氧半场效晶体管 Metal Oxide Semiconductor Field Effect Transistor MOSFET 其中 G是栅极 S
  • 一文说清DC-DC BUCK电路(非常详细)

    目录 摘要 BUCK原理 DC DC芯片框图 自举电容 输出电感 输出电容和纹波 损耗 总结 摘要 DC DC BUCK 是硬件工程师工作中使用频率非常高的电路 可以这么说 只要板子不是迷你型的 十有八九都有DC DC 因此 对它的了解与学
  • AD PCB导出Gerber文件(非常详细的步骤)

    当我们的PCB绘制好 并仔细检查后 就可以把文件交给工厂生产了 一般有两种方式 第一种最简单 就是直接将PCB文件压缩打包 发给工厂 发给工厂的途径一般有两种 一种是在其官网上提交 一种是在其开发的应用程序上提交 嘉立创工厂就可以在其开发的
  • 【电路设计】基于变压器的DC/DC变换电路(含Multisim仿真)

    前言 今天看到一个电路图 觉得很有意思 是使用变压器来进行DC DC变换的电路 似乎和电力电子中学的Buck Boost电路都不一样 然后就这个问题花了一点时间 找了一些资料 记录一下 变压器进行直流变换 从高中物理开始 我们接触到的变压器
  • 太阳能充电板给锂电池充电电路设计

    目前很多产品都使用了太阳能板给板卡充电 如何进行电路设计呢 确定充电管理芯片 充电管理芯片的目的是 对电池有不同模式的充电 包括涓流充电 恒流充电 恒压充电等 在电池不同的容量下进行不同的模式 才能更好的保护电池 如下是一枚国产芯片的描述
  • 模拟电路设计(17)---典型RC正弦波振荡器

    RC正弦波振荡器 采用LC器件作为振荡电路的反馈网络可以达到很高的输出频率 器件比较容易实现小体积 但是要求振荡器输出几十或者几百Hz信号时 LC器件的取值会很大 很难实现实用的产品 此时采用RC选频网络就会有很大的优势 RC LC反馈振荡
  • 简单聊一聊手机端口的识别协议-BC1.2

    关于BC1 2协议 每一个从事手机硬件设计的工程师都应该非常了解熟悉 其主要是为了充电端口的识别 然而关于这部分协议 网上有很多的讲解 有讲的很仔细的 也有讲的很粗糙的 小编也是为了学习这部分协议 翻阅了很多资料 最终决定将自己学到的结合自
  • 12V转5V2A电源模块的电路集合

    目前工作上所用到的电源模块都整理出来 以便之后的不时之需 建议在稳定的12V左右的电源下应用该模块 1 TPS54331DR 该芯片目前在TB中大概为1 1 RMB 价格也还能接收 主要的特点就是体积小 但是电路比较复杂 在放置PCB的过程
  • 逻辑电平(TTL/CMOS/LVDS/LVPECL/CML)

    低速逻辑电平 TTL CMOS LVTTL LVCMOS逻辑电平介绍 传统单板设计中 TTL和CMOS逻辑电平被广泛应用 是数字电路设计中最常见的两种逻辑电平 LVTTL和LVCMOS是它们的低电平版本 TTL Transistor Tra
  • 关于手机常见音频POP音产生的原因以及解决思路(一)——耳机插入与拔出

    最近在项目上debug音频POP音问题 属于手机音频关闭播放后的一小段时间产生的POP音 音频PA采用的是某知名厂商的模拟PA 无论数字PA还是模拟PA 虽然有所差别 但是debug思路是相似的 只是换汤不换药而已 其实 在手机音频POP音
  • PT100温度采集电路设计

    PT100是正温度系数的热敏电阻 顾名思义 随着温度的升高 电阻的阻值变大 相反 如果随着温度的升高 电阻的阻值变小 就是负温度系数的热敏电阻 之所以叫做PT100 是因为在0度时其阻值为100欧姆 PT100之所以应用很广泛 不仅仅是因为
  • 电路PCB设计

    EDA快速入门 文章目录 EDA快速入门 1 边框 2 电路线形状 3 导入logo 1 导入图片 2 照片预览 3 LOGO开窗处理 4 覆铜 1 边框 工具 gt 边框设置 2 电路线形状 通过 L 调节线段形状 3 导入logo 1
  • 【电路设计】AD快速敷铜技巧

    推荐一款 求职面试 刷题学习 的神器 点击跳转 快来看看吧 参考帖子 http bbs eeworld com cn forum php mod viewthread tid 465056 建立一个工程 添加原理图和PCB文档 原理图上简单
  • 晶体(crystal、无源晶振)两端电容取值计算

    数字电路中往往会需要一个时钟源 常用的比如晶体振荡器 oscillator 有源晶振 晶体 crystal 无源晶振 等 一般晶体用的更多些 对于晶体来说 一般电路设计时会在晶体两端各接一个电容到地 如下图所示 上面电路中晶体两端的电容是用
  • AD设置覆铜的过孔连接方式

    参考链接 https wenku baidu com view 15666e13f18583d049645956 过孔和焊盘有三种连接状态 noconnect 不连接 reliefconnect 十字形连接 directconnect 直接
  • 晶振PCB Layout

    晶振PCB Layout 前提摘要 个人说明 限于时间紧迫以及作者水平有限 本文错误 疏漏之处恐不在少数 恳请读者批评指正 意见请留言或者发送邮件至 noahpanzzz gmail com 参考 B站唐老师讲电赛 跟着大厂学画PCB 2
  • 共基、共射、共集三种放大电路的总结及比较

    说明 分析基本放大电路要遵循 先静态 后动态 的原则 只有 Q点合适 动态分析才有意义 直接耦合共射放大电路 B极输入 C极输出 直流工作点 阻容耦合共射放大电路 B极输入 C极输出 直流工作点 基本共射放大电路及交流小信号模型 计算 B
  • BUCK电路原理及PCB布局与布线注意事项

    1 BUCK架构 Buck架构 当开关闭合的时候 当开关断开的时候 根据伏秒平衡定理可得 Vin Vout DT Vout 1 D T gt Vin Vout D lt 1 在实际DCDC应用中 当Q1闭合的时候 在图1 a中 红线示出了当
  • LED为何通过电流控制?

    前段时间 散热部的同事咨询我关于手机的闪光灯输出电压值 说实话 一时间把我问住了 关于闪光灯 以往我们关注电流值 电压值很少关注 虽说手机的闪光灯驱动IC输出为BOOST电路 但是输出电压到多少 我还真未了解过 因闪光灯本身属于电流控制 所
  • 关于BUCK-BOOST电路的负压生成

    在一些实际应用中 我们时常会用到需要提供负压的场合 针对负压的设计 小白之前就讲述过一种方式 即采用charge pump的方法 然而呢 由于其带负载能力的不足 往往在一些设计中不被采用 同时 小白之前还见到过呦采用变压器隔离绕组反接的方式

随机推荐

  • Linux -TCP网络编程基础

    Linux TCP网络编程基础 一 套接字编程基础知识 1 套接字地址结构 2 用户层和内核层交互过程 二 TCP网络编程流程 1 TCP网络编程架构 2 创建网络插口函数socket 3 绑定一个地址端口对bind 4 监听本地端口lis
  • JAVA提高ZXING对图片中的二维码的识别率(第一弹)

    第二弹链接 https blog csdn net StrangeSir article details 93143177 背景 java开发 公司最近需要在对凭证识别的过程中加入二维码识别 在网上搜索后 选定了两款开源工具 分别是谷歌的Z
  • OpenMVS :用 colmap制作自己的数据集 重建(用colmap计算位姿,将位姿转为MVS需要的格式)

    1 采集图片 2 安装colmap 3 位姿计算 3 1 创建工程 3 2 特征提取与匹配 3 3 重建 3 4 保存位姿和稀疏点 4 将colmap位姿和稀疏点 转成MVS读取的格式 5 输入到OpenMVS稠密重建 6 OpenMVS
  • 过渡与变形(2)

    css3中制作动画的几个属性 css3中的变形 transform 过渡 transition 动画 animation 一 CSS3变形 transform 语法 transform none
  • 微信小程序 rich-text 富文本的解析显示

    背景 最近在开发学习 Uniapp 的过程中遇到了富文本的显示 对比了 微信小程序 中生成的代码 才发现原来微信官方早就开发了
  • jinfo 命令

    NAME jinfo Generates configuration information SYNOPSIS jinfo option pid 示例 jinfo 3245 转载于 https www cnblogs com imcati
  • 【AntDB数据库】AntDB数据库性能调优(一)

    操作系统 处理器 动态节能技术 cpufreq 是一个动态调整 CPU 频率的模块 可支持五种模式 为保证服务性能应选用 performance 模式 将 CPU 频率固定工作在其支持的最高运行频率上 不进行动态调节 操作命令为 cpupo
  • Node.js基础与进阶

    文章目录 Node js基础 1 Node js前言 1 Node出现的背景 2 V8引擎 2 Node js简介 1 什么是Node js 2 Node js的特点 3 Node js的应用方向 客户端与服务器 1 CS与BS 2 Web
  • ASP.NET实用技巧(一)

    作者 http www cnblogs com Kenny Jiang 来源 博客园 时间 2008 09 25 阅读 364 次 原文链接 收藏 本文主要介绍ASP NET编程中的一些常用方法 内容涉及代码技巧 性能优化等方面 1 跟踪页
  • map相关基础知识点

    1 count 判断键值元素是否存在
  • HyperLPR中文车牌识别

    转自 https blog csdn net djstavaV article details 86883931 原文出处 https xugaoxiang com 2019 12 16 hyperlpr 软硬件环境 Intel Xeon
  • String判断非空最全解析

    在校验一个String类型的变量是否为空时 通常存在3中情况 是否为 null 是否为 是否为空字符串 引号中间有空格 如 trim 方法会从一个字符串的两端删除空白字符 常用非空判断方法 String为空的三种状态 null 和new S
  • 找不到msvcp140.dll无法继续执行代码,怎么解决?

    MSVCP140 dll是一个Windows操作系统中的动态链接库文件 它是Microsoft Visual C Redistributable for Visual Studio 2015的一部分 这些库提供了一些C 程序所需的基本功能
  • altium dxp 选定区域铺铜或者填充

    altium dxp 选定区域快速铺铜或者填充 步骤如图 生成完后可以调整到你需要的层即可
  • 【python爬虫】4.爬虫实操(菜品爬取)

    文章目录 前言 项目 解密吴氏私厨 分析过程 代码实现 一 获取与解析 提取最小父级标签 一组菜名 URL 食材 写循环 存列表 代码实现 二 复习总结 前言 上一关 我们学习了用BeautifulSoup库解析数据和提取数据 解析数据的方
  • C++成员函数与非成员函数实现运算符重载

    目录 1 成员函数运算符重载 2 非成员函数 友元函数 运算符重载 3 运算符重载的禁区与规则 成员函数与非成员函数重载区别 区别 两种方式选择 特殊情况 4 运算符重载的禁区和规则 1 成员函数运算符重载 需求 规则 一斤牛肉 2斤猪肉
  • 03 - 大学生如何使用GPT

    大学生如何使用GPT提高学习效率 一 引言 在当今的高速发展的信息时代 大学生面临着越来越多的学习挑战 作为一种先进的人工智能技术 GPT为大学生提供了一种强大的学习工具 本文将介绍大学生在不同场景中如何使用GPT来提高学习效率 并给出一些
  • C++环形缓冲区的简单实现

    分享一个在工作中用到的简单的环形缓冲区 构造简单 可以改造到Qt中使用 也可以直接在VS下使用 所谓环形缓冲区 其实就是带有标识缓冲区中数据头 尾位置的缓冲区 这个缓冲区根据业务的不同 要设置的稍微大一点 不能一有数据过来就填满了 这样就失
  • SpringBoot整合常用Json框架-基础篇

    1 本篇概要 本文主要介绍如何在Spring Boot中整合3种常用的Json框架 包含Spring Boot本身提供的Jackson和Gson 以及国内常用的阿里巴巴开源Fastjson的整合 2 Json框架整合 2 1 整合 Jack
  • 一阶RC滤波器的算法实现(低通和高通)

    目前 项目需要处理信号 目标信号是特定频率范围内的信号 高频视为干扰 而一阶RC滤波器容易实现 但是网上资料往往没有详细的推导 因此在这里把笔记记下 本文的优势是比较详细 参数配置都有公式依据 目录 1 一阶RC低通滤波器的算法实现 1 1