目前,项目需要处理信号。目标信号是特定频率范围内的信号。高频视为干扰。而一阶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。

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

电容的阻抗是

截止频率,此频率下的信号,通过这个电路,输出电压和输入电压的关系式是

或者时域上的表达式:

上式离散后,可以得到:

假如要过滤掉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)

以上波特图可见,在截止频率处(,代入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. //low pass filter @cutoff frequency = 5 Hz

  16. CutFrq = 5;

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

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

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

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

  21. //update

  22. *Vo_p = *Vo;

  23. }

调用例子:

  1. float b_ADCLoad1Volt, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;

  2. LowPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);

C语言实现2:

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

  2. typedef struct {

  3. float Vi;

  4. float Vo_prev;

  5. float Vo;

  6. float Fcutoff;

  7. float Fs;

  8. } LPF_1orderRC_F;

  9. //*********** Structure Init Function ****//

  10. void LPF_1orderRC_F_init(LPF_1orderRC_F *v)

  11. {

  12. v->Vi=0;

  13. v->Vo_prev=0;

  14. v->Vo=0;

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

  16. v->Fcutoff=5;

  17. // execute 1000 every second

  18. v->Fs=1000;

  19. }

  20. //*********** Function Definition ********//

  21. float LPF_1orderRC_F_FUNC(LPF_1orderRC_F *v)

  22. {

  23. float RC, Cof1, Cof2;

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

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

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

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

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

  29. return v->Vo;

  30. }

  31. LPF_1orderRC_F lpf_1orderrc_handle;

调用方式:

  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. }

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

2.1 原理推导

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

截止频率

写成时域上的表达式:

离散化后得到:

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

2.2 波特图

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

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. //high pass filter @cutoff frequency = 0.5 Hz

  5. CutFrq = 0.5;

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

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

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

  9. //update

  10. *Vo_p = *Vo;

  11. *Vi_p = *Vi;

  12. }

调用例子:

  1. float b_ADCLoad1Volt, b_ADCLoad1VoltPrv, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;

  2. HighPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltPrv, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);

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

C语言实现2:

  1. #define PI 3.1415

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

  3. typedef struct {

  4. float Vi;

  5. float Vi_prev;

  6. float Vo_prev;

  7. float Vo;

  8. float Fcutoff;

  9. float Fs;

  10. } HPF_1orderRC_F;

  11. //*********** Structure Init Function ****//

  12. void HPF_1orderRC_F_init(HPF_1orderRC_F *v)

  13. {

  14. v->Vi=0;

  15. v->Vi_prev=0;

  16. v->Vo_prev=0;

  17. v->Vo=0;

  18. //high pass filter @cutoff frequency = 0.05 Hz

  19. v->Fcutoff=0.05;

  20. // execute 1000 every second

  21. v->Fs=1000;

  22. }

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

  24. float HPF_1orderRC_F_FUNC(HPF_1orderRC_F *v)

  25. {

  26. float RC, Coff;

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

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

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

  30. //update

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

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

  33. return v->Vo;

  34. }

  35. 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. FilteredResult = HPF_1orderRC_F_FUNC(&hpf_1orderrc_handle);//FilteredResult存放滤波结果

  13. }

  14. }

  15. }

3 上机测试

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

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

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

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

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

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

  1. matlab通过“ideal_lp设计理想高通滤波器_常见低通、高通、带通三种滤波器的工作原理...

    ∧      更多内容推荐        请关注为星标 □ 广播科技 滤波器是对波进行过滤的器件,是一种让某一频带内信号通过,同时又阻止这一频带外信号通过的电路. 滤波器主要有低通滤波器.高通滤波器和 ...

  2. 一文读懂:常见低通、高通、带通三种滤波器的工作原理

    滤波器 滤波器是对波进行过滤的器件,是一种让某一频带内信号通过,同时又阻止这一频带外信号通过的电路. 滤波器主要有低通滤波器.高通滤波器和带通滤波器三种,按照电路工作原理又可分为无源和有源滤波器两大类 ...

  3. 【滤波器】1. 一阶RC滤波器

    文章目录 [ 1. 低通滤波器 ] [ 2. 高通滤波器 ] [ 3. 常用工具 ] [ 1. 低通滤波器 ] 电容上的分压 UC=UI1jwCR+1jwCU_C=U_I\frac{\frac{1}{ ...

  4. MATLAB实现一阶RC滤波器

    MATLAB仿真分别实现一阶RC低通和高通滤波器,输入信号为正弦信号或者方波信号. 注意截止频率为f = 1/(2*pi*R*C) 低通滤波器下所示: %功能:一阶RC低通滤波器仿真 %说明: %1. ...

  5. 一阶RC滤波器,数字滤波器

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

  6. 高斯滤波器是低通还是高通_经典模拟滤波器仍值得研究吗?

    对于大多数的电路和系统来说,使用电感器.电容器和电阻器的模拟滤波器至关重要.无论是被动还是主动设计,透过具有高难度数学的理论结构.实际的「应用说明」(application note)设计与物料清单( ...

  7. 【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第36章       FIR滤波器的Matlab设计(含低通 ...

  8. C# FIR滤波器(含低通、高通、带通、带阻)

    最近需要用到Fir滤波器,在网上也看了不少资料,发现一个稍微能用的(https://blog.csdn.net/BIGFatming/article/details/92386914),主要代码也是直 ...

  9. 基于fdatool的滤波器设计(低通、带通、高通)

    体程序参考原文: 基于fdatool的滤波器设计(低通.带通.高通) - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/47392900 一.关于 结合上一篇8PSK ...

最新文章

  1. 【2012百度之星/初赛上】C:集合的交与并
  2. C#中使用opencv处理图像
  3. Eclipse之如何导入arr文件
  4. Cracking the Coding Interview 6.5
  5. 女朋友想进高校当老师,其实中学老师更适合他
  6. bootstrap 栅格系统实现类似table跨行
  7. paip.c++ sqlite数据库操作总结
  8. 贪吃蛇c加加代码_C语言贪吃蛇代码完整加注释
  9. 我的求职之路——首战:毕马威(KPMG)笔试
  10. 透视HTTP协议-进阶篇-极客时间-学习笔记
  11. 【寻找最佳小程序】03期:摩拜单车小程序——联合微信团队打造,实现不换码一扫即用
  12. app logo显示不全没有铺满
  13. 膨胀卷积的缺点_卷积、反卷积与膨胀卷积
  14. python数据结构之线性顺序表
  15. 短信发送失败之短信中心号码异常
  16. 非标资产与标准资产_标准资产更新! 第二部分
  17. 鸡啄米:C++编程入门系列之二(原码、反码与补码)
  18. Oracle 回滚详解(rollback)
  19. Lua04 实例列举 ESB2CP的报文转换流程
  20. 面试必看:手机扫描二维码的测试用例(建议收藏)

热门文章

  1. Android定位方式和测试方法,定位方式(d16)
  2. select2搜索内容显示搜索词
  3. 计算机基础 电子工业出版,电子工业出版社21世纪计算机基础教育系列教材2吴功宜吴英编着.ppt...
  4. spf打包解包_2020最新CentOS(linux下)安装7-Zip(7za压缩软件)以及解压命令,只打包不压缩,加密的方法...
  5. 盛世昊通:工信部第351批即将上市的汽车履历表
  6. 判断三个数是否能构成三角形_七年级 初一下册数学三角形专题复习提纲及经典例题...
  7. 离职总结(2022-9-5)
  8. Ubuntu 18.04 安装 nginx 并搭建一个简单的网站
  9. python爬虫能赚钱吗-个人利用Python爬虫技术怎么挣钱-10万被动收入
  10. CCD与CMOS的区别?