一阶RC低通滤波器详解(仿真+matlab+C语言实现)
如果本文帮到了你,帮忙点个赞;
如果本文帮到了你,帮忙点个赞;
如果本文帮到了你,帮忙点个赞;
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△Tyi−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 Value为0.005

Gain Value为0.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为采样时间;FilterTf为RC时间常数
具体参考下图;

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语言实现)的更多相关文章
- 一阶RC高通滤波器详解(仿真+matlab+C语言实现)
文章目录 预备知识 关于电容 HPF的推导 simulink 仿真 simulink 运行结果 matlab 实现 matlab 运行结果 C语言实现 如果本文帮到了你,帮忙点个赞: 如果本文帮到了你 ...
- 《算法详解:C++11语言描述》已出版
经过漫长的编写.修订和印刷过程,书籍<算法详解:C++11语言描述>终于出版了!目前本书已在各大电商平台上架,搜索书名即可找到对应商品.本书的特色在于: 介绍最新的C++11.C++14和 ...
- 机器学习笔记----Fuzzy c-means(FCM)模糊聚类详解及matlab实现
前言:这几天一直都在研究模糊聚类.感觉网上的文档都没有一个详细而具体的讲解,正好今天有时间,就来聊一聊模糊聚类. 一:模糊数学 我们大家都知道计算机其实只认识两个数字0,1.我们平时写程序其实也是这样 ...
- 遗传学详解及Matlab算法实现
遗传学算法概述 从之前转载的博客<非常好的理解遗传算法的例子>中可以知道,遗传学算法主要有6个步骤: 1. 个体编码 2. 初始群体 3. 适应度计算 4. 选择运算 5. 交叉运算 6. ...
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
一.关于全局变量的定义.声明.引用: (只要是在.h文件中定义的变量,然后在main.c中包含该.h文件,那么定义的变量就可以在main函数中作为全局变量使用) 方法1: 在某个c文件里定义全局变量后 ...
- 1、WWDC2014 详解OSX/iOS8/Swift语言
OS X 10新特性 1.系统图标扁平化. 2.系统菜单栏可定制. 3.新的通知中心. 4.新的Spotlight. 5.新的iCloud Drive,新增文档同步功能(学Windows). 6.新的 ...
- ESP8266使用详解--基于Lua脚本语言
这些天,,,,今天终于看到了希望,,,天道酬勤 先说实现的功能...让ESP8266连接无线网,然后让它建立服务器,,我的客户端连接上以后,发给客户端发数据模块打印到串口,,往ESP8266串口里发数 ...
- 【实验课选题详解】用C语言实现万年历
题目要求 编程实现万年历,要求: 可根据用户输入或系统日期进行初始化,如果用户无输入则显示系统日期所在月份的月历,并突出显示当前日期: 可根据用户输入的日期查询,并显示查询结果所在月份的月历,突出显示 ...
- 「实验课选题详解」用C语言实现万年历
题目要求 编程实现万年历,要求: 可根据用户输入或系统日期进行初始化,如果用户无输入则显示系统日期所在月份的月历,并突出显示当前日期: 可根据用户输入的日期查询,并显示查询结果所在月份的月历,突出显示 ...
随机推荐
- python基础:如何使用python pandas将DataFrame转换为dict
之前在知乎上看到有网友提问,如何将DataFrame转换为dict,专门研究了一下,pandas在0.21.0版本中是提供了这个方法的.下面一起学习一下,通过调用help方法,该方法只需传入一个参数, ...
- 详解 缓冲区(Buffer 抽象类)
在本篇博文中,本人主要讲解NIO 的两个核心点 -- 缓冲区(Buffer) 和 通道 (Channel)之一的 缓冲区(Buffer), 有关NIO流的其他知识点请观看本人博文<详解 NIO流 ...
- jmeter事务控制器
jmeter事务控制器常用于压力测试时如果一个功能包括多个请求时,需要测试这个功能的压力情况,则需要把多个请求放到一个事务控制器里面
- windows 系统查看NVIDIA显卡GPU情况,nvidia-smi在windows上使用
cd C:\Program Files\NVIDIA Corporation\NVSMI nvidia-smi 当batch_size设置越大的时候,GPU加速越明显,但是batch_size设置 ...
- Docker 中如何安装配置 Nginx
拉取 nginx 最新版镜像,然后简单启动一个 nginx 容器: docker pull nginx:latest docker run --name nginx01 -d -p 80:80 ngi ...
- 关于“xxx”object is not callable的异常
参考博文:https://blog.csdn.net/yitiaodashu/article/details/79016671 所谓callable对象是指一个后边可以加()的对象,比如函数, 所以这 ...
- Istio架构详解
Istio架构及其组件概述 Istio 架构总体来说分为控制面和数据面两部分.控制面是 Istio 的核心,管理 Istio 的所有功能,主要包括Pilot.Mixer.Citadel等服务组件;数据 ...
- beego rel/reverse
用户可以发布多个文章 对用户来说是一对多 对文章来说是多对一 用户是主表 文章是用户的从表 rel用在从表中,给主表结构体设置主键,也就是文章表对应用户表的外键 reverse用在主表中,指定主表与从 ...
- markdownPad常用功能示例
1.列表 无序列表 姓名 张三 李四 王五 有序列表 张三 李四 王五 2.超链接 百度 3.引用 锄禾日当午,汗滴禾下土.谁知盘中餐,粒粒皆辛苦. -- 李绅<古风二首> 4.简要修饰文 ...
- Vue-cli4脚手架搭建
一:要安装Node.js:安装路径要默认安装(node-v12.16.2-x64.msi-长支持 二:要安装cnpm 1)说明:npm(node package manager)是nodejs的包管理 ...