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

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

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

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. 如何让一张图片变成二值图像?python+opencv图像处理

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:张熹熹 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...

  2. ASE课程总结 by 冯晓云

    开始的开始,采访往届ASE班的blog:http://www.cnblogs.com/legs/p/4894362.html 和北航软工M1检查:http://www.cnblogs.com/legs ...

  3. Ubuntu安装Elasticsearch6.3

    本文使用的 Ubuntu 版本信息: Distributor ID: Ubuntu Description: Ubuntu LTS Release: 16.04 Codename: xenial 1. ...

  4. 远程登录redis

    没想到吧,我居然已经摸到了redis. 远程登录redis redis-cli -h 127.0.0.1 -p 6379 ip地址和端口记得换成自己的

  5. java第八周课后作业

    1.系统小练习 package homework; import java.util.Random; import java.util.Scanner; public class Menu { pub ...

  6. 页面性能分析-Chrome Dev Tools

    一.分析面板介绍 进行页面性能快速分析的主要是图中圈出来的几个模块功能: Network : 页面中各种资源请求的情况,这里能看到资源的名称.状态.使用的协议(http1/http2/quic...) ...

  7. [QT] QProcess finished 信号,关联的 slot 必须检查返回码

    void QProcess::finished(int exitCode, QProcess::ExitStatus exitStatus)

  8. 虚拟化KVM之优化(三)

    KVM的优化 1.1 cpu的优化 inter的cpu的运行级别,(Ring2和Ring1暂时没什么用)Ring3为用户态,Ring0为内核态 Ring3的用户态是没有权限管理硬件的,需要切换到内核态 ...

  9. eclipse安装Axis2插件和简单的webservice发布

    2019独角兽企业重金招聘Python工程师标准>>> Axis2与CXF是现在很主流的WebService开发框架(java6也已经支持了),项目上还都是基本上用前两种做开发,今天 ...

  10. mac OS Apache Tomcat 启动/停止服务

    进入Tomcat下的bin目录 启动Tomcat命令 ./startup.sh Tomcat 默认端口 8080 停止Tomcat服务命令 ./shutdown.sh 执行tomcat ./shutd ...