C语言一阶低通、高通滤波器滤除截止频率外的杂波

目录

  • 理论推导
  • 产生测试信号
    • sin_cal.c
    • sin_cal.h
    • 生成波形
  • 一阶滤波器
    • FirstOrderFilter.c
    • FirstOrderFilter.h
    • 测试
      • 低通滤波器
      • 高通滤波器

IAP15W4K58S4
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0
串口示波器:Vofa+ 1.3.10


理论推导

低通滤波器
见一阶RC低通滤波器的数学模型及算法实现 —— 奔跑的chanchanchan
Yn=A⋅Xn+(1−A)⋅Yn−1Y_n=A⋅X_n+(1−A)⋅Y_{n-1}Yn=AXn+(1A)Yn1
A=ΔTRC+ΔT=ΔT12πf+ΔT=11+12πfΔTA=\frac{ΔT}{RC+ΔT}=\frac{ΔT}{\frac{1}{2πf}+ΔT}=\frac{1}{1+\frac{1}{2πfΔT}}A=RC+ΔTΔT=2πf1+ΔTΔT=1+2πfΔT11
高通滤波器
见一阶RC高通滤波器详解(仿真+matlab+C语言实现)—— 小麦大叔
Yn=A⋅Yn−1+A⋅(Xn−Xn−1)Y_n=A⋅Y_{n-1}+A⋅(X_n-X_{n-1})Yn=AYn1+A(XnXn1)
A=RCRC+ΔT=12πf12πf+ΔT=11+2πfΔTA=\frac{RC}{RC+ΔT}=\frac{\frac{1}{2πf}}{\frac{1}{2πf}+ΔT}=\frac{1}{1+2πfΔT}A=RC+ΔTRC=2πf1+ΔT2πf1=1+2πfΔT1

产生测试信号

sin_cal.c

#include "sin_cal.h"
#include <math.h>void sin_Init(sin_Type *Sin, float f, float delta_ms)
{Sin->angle = 0;Sin->delta = 2 * 3.141592653589793f * f * delta_ms / 1000.f;Sin->out = 0;
}float sin_cal(sin_Type *Sin)
{Sin->angle += Sin->delta;if (Sin->angle > 6.283185307179586f)Sin->angle -= 6.283185307179586f;Sin->out = sin(Sin->angle);return Sin->out;
}

sin_cal.h

#ifndef __SIN_CAL_H__
#define __SIN_CAL_H__typedef struct
{float angle;float delta;float out;
} sin_Type;void sin_Init(sin_Type *Sin, float f, float delta_ms);	//f为设定的频率,delta_ms为时间间隔
float sin_cal(sin_Type *Sin);#endif

生成波形

初始化

//...
sin_Type Sin_1, Sin_2;
//...sin_Init(&Sin_1, 1, 5);		//1  Hz的正弦波sin_Init(&Sin_2, 25, 5);	//25 Hz的正弦波
//...

定时器中断周期为1ms,每5ms输出一次数据

extern sin_Type Sin_1, Sin_2;/********************* Timer0中断函数************************/
void timer0_int (void) interrupt TIMER0_VECTOR
{static int count = 0;float Data;if(++count >= 5){count = 0;sin_cal(&Sin_1);sin_cal(&Sin_2);Data = Sin_1.out+Sin_2.out;printf("%f\r\n", Data);}
}

如图,生成了1Hz和25Hz的混合波形:
在这里插入图片描述

一阶滤波器

FirstOrderFilter.c

#include "FirstOrderFilter.h"void fof_Init(fof_Type *fof, float f, float delta_ms, char HPForLPF) 
{fof->in_old = 0;fof->out = 0;fof->type = HPForLPF;fof->a = 2 * 3.141592653589793f * f * delta_ms / 1000.f;if(!HPForLPF){fof->a = 1.f / fof->a;}fof->a = 1.f / (1.f + fof->a);
}float FirstOrderFilter(fof_Type *fof, float in)
{if(fof->type){fof->out = fof->a * fof->out + fof->a * (in - fof->in_old);fof->in_old = in;}elsefof->out = fof->a * in + (1 - fof->a) * fof->out;return fof->out;
}

FirstOrderFilter.h

#ifndef __FOF_H__
#define __FOF_H__typedef struct
{float a;float in_old;float out;char type;
} fof_Type;void fof_Init(fof_Type *fof, float f, float delta_ms, char HPForLPF);	//f为截止频率,delta_ms为时间间隔,HPForLPF为类型选择
float FirstOrderFilter(fof_Type *fof, float in);#endif

测试

//...
fof_Type fof_1, fof_2;
//...fof_Init(&fof_1, 1, 5, 0);	//低通滤波器,截止频率为1Hzfof_Init(&fof_2, 25, 5, 1);	//高通滤波器,截止频率为25Hz
//...
extern fof_Type fof_1, fof_2;
extern sin_Type Sin_1, Sin_2;/********************* Timer0中断函数************************/
void timer0_int (void) interrupt TIMER0_VECTOR
{static int count = 0;float Data;if(++count >= 5){count = 0;sin_cal(&Sin_1);sin_cal(&Sin_2);Data = Sin_1.out+Sin_2.out;printf("%f, %f, %f\r\n", Data, FirstOrderFilter(&fof_1, Data), FirstOrderFilter(&fof_2, Data));}
}

下图为滤波效果
在这里插入图片描述

低通滤波器

在这里插入图片描述

对于低通滤波器,截止频率处的1Hz信号能量衰减至0.688,与12≈0.707\frac{1}{\sqrt{2}}≈0.707210.707相差2.7%,
在这里插入图片描述
截止频率外的25Hz的信号经滤波已衰减至0.040
在这里插入图片描述

高通滤波器

在这里插入图片描述

对于高通滤波器,截止频率处的25Hz信号能量衰减至0.594,与12≈0.707\frac{1}{\sqrt{2}}≈0.707210.707相差16%,
在这里插入图片描述
截止频率外的1Hz的信号经滤波已衰减至0.039
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OAF_开发系列19_实现OAF对话框提示dialogPage(案例)

20150716 Created By BaoXinjian 一、摘要 Oracle dialogPage是OAF提示框的一种用法&#xff0c;具体应用例如在删除数据时&#xff0c;提示用户进行确认是否可以删除 二、实现方法 在CO中添加如下方法 public void processFormRequest(OAPageContext pageContext,OAWebBean we…

flask ajax 笔记

html 其中 {{url_for(add)}} 的 add 为 flask 路由函数名 dataType: "json", 加了这句&#xff0c;才能读到 flask 返回的 json var my_tra_info {"key1":"val1","key2":val2};$.ajax({type:post,async:false,url:"{{url_fo…

设计模式(一)---简单工厂模式

1&#xff0c;简介&#xff1a;简单工厂模式&#xff0c;又称为静态工厂模式&#xff0c;是通过专门定义一个类来负责创建其他类的实例&#xff0c;被创建的实例通常都具有共同的父类。 2&#xff0c;简单工厂模式的结构 2.1&#xff1a;简单工厂的通用结构 2.2&#xff1a;示意…

给LaTex输出的论文PDF加上电子签名

目录问题准备签名插入签名TeXstudio 4.2.3 Windows 10 20H2 参考资料&#xff1a;研究生毕业论文电子签名怎么弄&#xff1f;—— kk肥妹 问题 完成论文之后&#xff0c;需要加上签名&#xff0c;但LaTex输出的结果是PDF格式的 准备签名 准备自己的签名&#xff0c;比如直接…

asp.net模态窗口返回值

个人感觉模态窗口在做网站的时候&#xff0c;使用到的比较少&#xff0c;前段时间在做项目时要实现以模态窗口传值和接收返回值&#xff0c; 模态窗口传值实现比较简单&#xff0c;但是做好后发现在Chrome浏览器中接收不到返回值&#xff0c;修改好Chrome浏览器的问题后 大概过…

web前端-css

1.1CSS 链接的四种状态&#xff1a;a:link --普通的、未被访问的链接 a:visited --用户已访问的链接 a:hover --鼠标指针位于链接的上方 a:active --链接被点击的时刻这里我们需要注意的是这四个属性设置要遵循的顺序问题&#xff1a; a:hover 必须位于 a:link 和 a:visited 之…

PyCharm设置字体大小与颜色

https://jingyan.baidu.com/article/fedf0737b31f7435ac8977de.html Editor -> Color & Fonts -> Font

判断两个矩形相交以及求出相交的区域

问题&#xff1a;给定两个矩形A和B&#xff0c;矩形A的左上角坐标为&#xff08;Xa1,Ya1&#xff09;&#xff0c;右下角坐标为&#xff08;Xa2,Ya2&#xff09;&#xff0c;矩形B的左上角坐标为&#xff08;Xb1,Yb1&#xff09;&#xff0c;右下角 坐标为&#xff08;Xb2,Yb2&…

【MSP430G2553】图形化开发笔记(1) 配置环境

目录CCS的配置下载和安装激活安装Grace并导入CCS安装MSP430Ware并导入CCS安装XDCtools并导入CCS建立工程Welcome介绍开始打开官方点灯Demo平台&#xff1a; Code Composer Studio 6.2.0 Grace 2.2.0 MSP430G2553 LaunchPad™ Development Kit (MSP-EXP430G2ET) CCS的配置 支…

【现代程序设计】【homework-07】

C11 中值得关注的几大变化 1.Lambda 表达式 Lambda表达式来源于函数式编程&#xff0c;说白就了就是在使用的地方定义函数&#xff0c;有的语言叫“闭包”&#xff0c;如果 lambda 函数没有传回值(例如 void )&#xff0c;其回返类型可被完全忽略。 定义在与 lambda 函数相同作…

Jfinal源码解析系列一

2019独角兽企业重金招聘Python工程师标准>>> 1 Jfinal的初始化入口 <filter><filter-name>jfinal</filter-name><filter-class>com.jfinal.core.JFinalFilter</filter-class><init-param><param-name>configClass</pa…

Pycharm(社区版) 创建Flask项目

https://blog.csdn.net/hold_on_/article/details/86651594

【MSP430G2553】图形化开发笔记(2) 系统时钟和低功耗模式

目录系统时钟概述BCS模块单元的基本构造时钟-概览介绍Basic User 模式Power User 模式1. 数控振荡器 DCO2. 出厂预校正频率3. 低频振荡器 VLO4. 内部匹配电容5. 延时启动6. 自动选择 MCLK 源7. 时钟输出8. 振荡器失效中断9. 中断事件处理函数10. 退出中断后的节能选项Registers…

alias命令

alias命令&#xff08;取别名之前先运行一下将要使用的别名&#xff0c;以免冲突&#xff09; alias语法&#xff1a;alias 自定义的命令真正的命令 1.使用which查看一个命令的完整命令&#xff0c;也可以查看绝对路径 2.‘alias’查看系统中所有别名&#xff1a; 3.应用 再使用…

奇怪的 加号

转载于:https://www.cnblogs.com/chuyu/p/3421237.html

Java反射机制:表单数据自动封装到JavaBean中【IT】

2019独角兽企业重金招聘Python工程师标准>>> (2010-07-09 19:50:18) 转载▼ 标签&#xff1a; it 分类&#xff1a; IT路人丁 利用Java的反射机制&#xff0c;模拟一个简单的Struts控制器ActionServlet时&#xff0c;为了将请求的表单数据自动封装到JavaBean中&…

媒体查询使用方法@media

https://blog.csdn.net/leaves_yu/article/details/79280389 Media Queries能在不同的条件下使用不同的样式&#xff0c;使页面在不同在终端设备下达到不同的渲染效果。前面简单的介绍了Media Queries如何引用到项目中&#xff0c;但Media Queries有其自己的使用规则。具体来说…

JavaScript实现接口的三种经典方式

1 /*2 接口:提供一种说明一个对象应该有哪些方法的手段3 js中有三种方式实现接口:4 1 注释描述接口5 2 属性检测接口6 3 鸭式辨型接口7 */8 9 /*10 1 注释描述接口&#xff1a; 不推荐11 优点&#xff1a; 利用注解&#xff0c;给出参考12 缺点&#x…

eclipse启动tomcat不能正常访问问题

问题&#xff1a; 1、eclipse中配置好tomcat服务器后&#xff0c;启动tomcat查看控制台信息显示启动成功&#xff0c; 但访问tomcat首页报404异常 2、而从tomcat/bin目录中启动后&#xff0c;就能够正常访问首页&#xff0c;由此分析应该是eclipse配置错误 解决方案&#xff1a…

AD域

将网络中的计算机逻辑上组织到一起&#xff0c;将器视为一个整体进行集中管理&#xff0c;这种区别于工作组的逻辑环境叫做Windows域。windows管理模式有两种&#xff1a;工作组和与环境。活动目录的相关概念(1)域和域控制器(2)名称空间(3)对象和属性(4)容器(5)组策略活动目录的…