如果本文帮到了你,帮忙点个赞;

如果本文帮到了你,帮忙点个赞;

如果本文帮到了你,帮忙点个赞;

HPF 一阶RC高通滤波器详解(仿真+matlab+C语言实现)

LPF 一阶RC低通滤波器详解(仿真+matlab+C语言实现)

1 预备知识

低通滤波器(LPF)可以滤除频率高于截止频率的信号,类似的还有高通滤波器,带通滤波器,带阻滤波器。一阶RC低通滤波器的电路如下图所示;



参考了Wiki了,然后推导了一遍;首先输入输出的关系如下;

Vin(t)−Vout(t)=Ri(t)
V_{in} (t)- V_{out}(t) = Ri(t)
Vin​(t)−Vout​(t)=Ri(t)

所以电容的Qc(t)Q_{c}(t)Qc​(t)的充电时间为 ttt因此满足以下条件;

{Qc(t)=CVout(t)⋯①i(t)=dQcdt⋯②
\begin{cases}
Q_{c}(t) = CV_{out}(t) \cdots ①\\
\\
i(t) = \cfrac{dQ_{c}}{dt} \cdots ②
\end{cases}
⎩⎪⎪⎨⎪⎪⎧​Qc​(t)=CVout​(t)⋯①i(t)=dtdQc​​⋯②​

所以由①,②可得:

Vin(t)−Vout(t)=RCdVoutdt⋯③
V_{in} (t)- V_{out}(t) = RC\cfrac{dV_{out}}{dt} \cdots ③
Vin​(t)−Vout​(t)=RCdtdVout​​⋯③

将方程进行离散化,如果输入VinV_{in}Vin​和输出输入VoutV_{out}Vout​按照 △T\bigtriangleup_{T}△T​的时间采样,那么可以将输入和输出序列化,则

VinV_{in}Vin​序列化为:

(x1,x2,x3⋯ ,xn−1,xn)(x_{1},x_{2},x_{3}\cdots,x_{n-1},x_{n})(x1​,x2​,x3​⋯,xn−1​,xn​)

VoutV_{out}Vout​序列化为:

(y1,y2,y3⋯ ,yn−1,yn)(y_{1},y_{2},y_{3}\cdots,y_{n-1},y_{n})(y1​,y2​,y3​⋯,yn−1​,yn​)

因此可以将③式转化为:

xi−yi=RCyi−yi−1△T⋯④
x_{i} - y_{i} = RC\cfrac{y_{i}-y_{i-1}}{\bigtriangleup_{T}}\cdots④
xi​−yi​=RC△T​yi​−yi−1​​⋯④

因此最终滤波输出的序列 yiy_{i}yi​ 如下所示;



同样进行简化之后可以得到;

yi=α∗xi+(1−α)∗yi−1
y_{i} = \alpha*x_{i} + (1-\alpha)*y_{i-1}
yi​=α∗xi​+(1−α)∗yi−1​

后面可以根据这个公式进行程序设计;

另外,截止频率fcf_{c}fc​满足;

fc=12πRC⋯⑤
f_{c} = \cfrac{1}{2\pi RC} \cdots ⑤ \\
fc​=2πRC1​⋯⑤

2 simulink 仿真

这里直接根据公式③构建一搞Subsystem

Vin(t)−Vout(t)=RCdVoutdt
V_{in} (t)- V_{out}(t) = RC\cfrac{dV_{out}}{dt}
Vin​(t)−Vout​(t)=RCdtdVout​​

Subsystem



整体的仿真图如下:



其中Sine Wave频率设置为2*pi*50



其中Sine Wave1频率设置为2*pi



所以这里需要使得2*pi*50的信号衰减,所以根据,截止频率fcf_{c}fc​的计算公式,可以改变增益的值,具体如下所示;

3 simulink 运行结果

最终的仿真的运行结果如下图所示;

Gain Value0.005



Gain Value0.0318

4 matlab实现

根据公式yi=α∗xi+(1−α)∗yi−1
y_{i} = \alpha*x_{i} + (1-\alpha)*y_{i-1}
yi​=α∗xi​+(1−α)∗yi−1​

实现数字一阶RC低通滤波器,具体matlab程序如下;


Serial = 0:0.1:100;
Fs = 1;
Phase = 0;
Amp = 1; % 高频信号
N0 = 2*pi*Fs*Serial - Phase;
X0 = Amp*sin(N);
subplot(4,1,1);
plot(X0); % 低频信号
Fs = 0.02;
N1 = 2*pi*Fs*Serial - Phase;
X1 = Amp*sin(N1);
subplot(4,1,2);
plot(X1); % 高频低频叠加的信号
X2=X0+X1;
subplot(4,1,3);
plot(X2); %Xi-Yi=RC*(Yi - Yi-1)/DetalT
len = length(X2);
X3=X2;
p=0.05; % 一阶RC滤波得到X3
for i=2:len
X3(i) = p*X2(i)+(1-p)*X3(i-1);
end subplot(4,1,4);
plot(X3);

5 matlab运行结果

运行结果如下所示;

6 C语言实现

low_filter.h

typedef struct
{
int16_t Input;
int16_t Output[2];
int32_t FilterTf;
int32_t FilterTs;
int32_t Kr;
int32_t Ky; } low_filter; void low_filter_init(low_filter *v);
int16_t low_filter_calc(low_filter *v);

其中;

  • FilterTs为采样时间;
  • FilterTfRC时间常数

具体参考下图;



low_filter.c

void low_filter_init(low_filter *v){

     v->Kr = v->FilterTs*1024/(v->FilterTs + v->FilterTf);
v->Ky = v->FilterTf*1024/(v->FilterTs + v->FilterTf);
} int16_t low_filter_calc(low_filter *v){ int32_t tmp = 0; tmp = ((int32_t)v->Kr*v->Input + v->Ky*v->Output[1])/1024; if(tmp>32767){
tmp = 32767;
} if( tmp < -32768){
tmp = -32768;
} v->Output[0] = (int16_t)tmp;
v->Output[1] = v->Output[0];
return v->Output[0];
}

7 C语言运行结果

实际测试结果



一阶RC低通滤波器详解(仿真+matlab+C语言实现)的更多相关文章

  1. 一阶RC高通滤波器详解(仿真+matlab+C语言实现)

    文章目录 预备知识 关于电容 HPF的推导 simulink 仿真 simulink 运行结果 matlab 实现 matlab 运行结果 C语言实现 如果本文帮到了你,帮忙点个赞: 如果本文帮到了你 ...

  2. 《算法详解:C++11语言描述》已出版

    经过漫长的编写.修订和印刷过程,书籍<算法详解:C++11语言描述>终于出版了!目前本书已在各大电商平台上架,搜索书名即可找到对应商品.本书的特色在于: 介绍最新的C++11.C++14和 ...

  3. 机器学习笔记----Fuzzy c-means(FCM)模糊聚类详解及matlab实现

    前言:这几天一直都在研究模糊聚类.感觉网上的文档都没有一个详细而具体的讲解,正好今天有时间,就来聊一聊模糊聚类. 一:模糊数学 我们大家都知道计算机其实只认识两个数字0,1.我们平时写程序其实也是这样 ...

  4. 遗传学详解及Matlab算法实现

    遗传学算法概述 从之前转载的博客<非常好的理解遗传算法的例子>中可以知道,遗传学算法主要有6个步骤: 1. 个体编码 2. 初始群体 3. 适应度计算 4. 选择运算 5. 交叉运算 6. ...

  5. 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法

    一.关于全局变量的定义.声明.引用: (只要是在.h文件中定义的变量,然后在main.c中包含该.h文件,那么定义的变量就可以在main函数中作为全局变量使用) 方法1: 在某个c文件里定义全局变量后 ...

  6. 1、WWDC2014 详解OSX/iOS8/Swift语言

    OS X 10新特性 1.系统图标扁平化. 2.系统菜单栏可定制. 3.新的通知中心. 4.新的Spotlight. 5.新的iCloud Drive,新增文档同步功能(学Windows). 6.新的 ...

  7. ESP8266使用详解--基于Lua脚本语言

    这些天,,,,今天终于看到了希望,,,天道酬勤 先说实现的功能...让ESP8266连接无线网,然后让它建立服务器,,我的客户端连接上以后,发给客户端发数据模块打印到串口,,往ESP8266串口里发数 ...

  8. 【实验课选题详解】用C语言实现万年历

    题目要求 编程实现万年历,要求: 可根据用户输入或系统日期进行初始化,如果用户无输入则显示系统日期所在月份的月历,并突出显示当前日期: 可根据用户输入的日期查询,并显示查询结果所在月份的月历,突出显示 ...

  9. 「实验课选题详解」用C语言实现万年历

    题目要求 编程实现万年历,要求: 可根据用户输入或系统日期进行初始化,如果用户无输入则显示系统日期所在月份的月历,并突出显示当前日期: 可根据用户输入的日期查询,并显示查询结果所在月份的月历,突出显示 ...

随机推荐

  1. The equation SGU - 106

    题目链接:https://codeforces.com/problemsets/acmsguru/problem/99999/106 这个题是关于EXGCD特别好的一个题目.题目大意:有一个等式ax+ ...

  2. beanshell 常用的内置变量与函数

    官方详细文档:https://github.com/beanshell/beanshell/wiki log:用来记录日志文件 log.info("jmeter"); vars - ...

  3. java 多线--静态代理模式

    我们使用 java 多线程时,都需要通过线程代理对象来启动线程,常见的写法: new Thread(target).start(); 这在设计模式中叫静态代理模式,静态代理模式组成; 1.公共接口 2 ...

  4. Spiking-YOLO : 前沿性研究,脉冲神经网络在目标检测的首次尝试 | AAAI 2020

    论文提出Spiking-YOLO,是脉冲神经网络在目标检测领域的首次成功尝试,实现了与卷积神经网络相当的性能,而能源消耗极低.论文内容新颖,比较前沿,推荐给大家阅读   来源:晓飞的算法工程笔记 公众 ...

  5. 来自BAT大厂前端工程师的自白-怎么才能学好前端

    如果说理解学好web前端是先能找到一份工作,那么你应该这样做: 1.制定好一下系统的web前端学习规划,每天定量,学完什么知识点就掌握,能自己应用,而不是能看懂,写不出来东西. 2.不要自己一个人闷头 ...

  6. Python selenium Chrome正在受到自动软件的控制 disable-infobars无效 的解决方法

    问题解决 前两天更新了google浏览器版本,今天运行以前的脚本,发现options一个参数的配置不生效了. 运行了几次都发现该参数没有生效,也检查了自己的代码参数,没有写错,于是就有了这一波“网中寻 ...

  7. JavaScript学习笔记(1)字符串方法

    字符串方法 length 属性返回字符串的长度 var txt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var sln = txt.length; inde ...

  8. 2019-2020-1 20199326《Linux内核原理与分析》第五周作业

    第五周学习内容 庖丁解牛Linux内核分析第四章:系统调用的三层机制(上) Linux内核分析实验四 学到的一些知识 4.1用户态.内核态.中断 宏观上Linux操作系统的体系架构分为用户态和内核态 ...

  9. Python 删除含有只读文件(夹)的文件夹

    def rm_read_only(fn, tmp, info): if os.path.isfile(tmp): os.chmod(tmp, stat.S_IWRITE) os.remove(tmp) ...

  10. MFC之动态调用自己写的类库中的类的成员方法

    第一步:创建一个要调用的类库 如果是MFC程序使用,可以创建一个MFC的类库,不过依然可以创建一个win32类库.我所知道的,MFC的类库可以分为常规MFC DLL和MFC扩展DLL关于它们之间的区别 ...