目前,项目需要处理信号。目标信号是特定频率范围内的信号。高频视为干扰。而一阶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可以得到传递函数的波特图:

fcut =1000;
RC=1/2/pi/fcut;
%pkg load control   %Octave用的读取control包
y1 = tf(1,[RC,1])
bode(y1)

以上波特图可见,在截止频率处(,代入f=1k,可得截至角频率是6283 rad/s),信号会衰减到原来的0.707。这电路对频率大于截止频率的高频信号,具有比较强的衰减作用,同时对该信号有比较大的相位移动。

1.3 用C语言实现
C语言的实现1

/**
  * @brief  implement 1 order RC low pass filter
  *         raw data filtered by a simple RC low pass filter@cufoff=5Hz
  * @param  Vi         :     Vi(k)
  * @param  Vi_p     :     Vi(k-1)
  * @param  Vo         :     Vo(k)
  * @param  Vo_p     :     Vo(k-1)
  * @note   This example shows a simple way to report end of conversion
  *         and get conversion result. You can add your own implementation.
  * @retval None
  */
void LowPassFilter_RC_1order(float *Vi, float *Vo, float *Vo_p, float sampleFrq )
{
    float CutFrq, RC, Cof1, Cof2;
        
    //low pass filter @cutoff frequency = 5 Hz        
    CutFrq = 5;
    RC = (float)1.0/2.0/PI/CutFrq;
    Cof1 = 1/(1+RC*sampleFrq);
    Cof2 = RC*sampleFrq/(1+RC*sampleFrq);
    *Vo = Cof1 * (*Vi) + Cof2 * (*Vo_p);        
    
    //update     
    *Vo_p = *Vo;        
}
调用例子:

float b_ADCLoad1Volt, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;
 
 
LowPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);
C语言实现2:

//*********** Structure Definition ********//
typedef struct {
    float  Vi;
    float  Vo_prev;
    float  Vo;
    float  Fcutoff;
    float  Fs;
} LPF_1orderRC_F;
//*********** Structure Init Function ****//
void LPF_1orderRC_F_init(LPF_1orderRC_F *v)
{
    v->Vi=0;
    v->Vo_prev=0;
    v->Vo=0;
 
    //low pass filter @cutoff frequency = 5 Hz        
    v->Fcutoff=5;
 
    // execute 1000 every second
    v->Fs=1000;
}
 
//*********** Function Definition ********//
float LPF_1orderRC_F_FUNC(LPF_1orderRC_F *v)
{
    float RC, Cof1, Cof2;
        
    RC = (float)1.0/2.0/PI/v->Fcutoff;
    Cof1 = 1/(1+RC*v->Fs);
    Cof2 = RC*v->Fs/(1+RC*v->Fs);
 
    v->Vo = Cof1 * v->Vi + Cof2 * v->Vo_prev;
 
    v->Vo_prev = v->Vo;
    
    return v->Vo;
}
 
LPF_1orderRC_F lpf_1orderrc_handle;
 
调用方式:

...
int main(void)
{
    ...
    LPF_1orderRC_F_init(&lpf_1orderrc_handle);    //初始化
    while(1)
    {
        ...
        if(flag_1ms==1)
        {
            lpf_1orderrc_handle.Vi = ADCresult;        //假设ADCresult是ADC采样结果
            LPF_1orderRC_F_FUNC(&lpf_1orderrc_handle);    //usage
        FilteredResult = lpf_1orderrc_handle.Vo;    //FilteredResult存放滤波结果
        }
    }
}

2、一阶RC高通滤波器的原理以及实现
2.1 原理推导
这是一节RC高通滤波器的原理图:

截止频率

写成时域上的表达式:

离散化后得到:

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

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

Octave绘制波特图:

fcut =0.5;
RC=1/2/pi/fcut;
pkg load control
y1 = tf([RC,0],[RC,1])
bode(y1)

高通滤波器对截至频率以上的信号无大影响,信号能正常经过滤波器。但是该滤波器对截至频率以下的信号,具有较大的影响。和截至频率相比,频率越小,衰减作用越明显。同时在相位图中可见,对频率越低的信号,相位移动也越大。

2.3 用C语言实现
C语言的实现1:

void HighPassFilter_RC_1order(float *Vi, float *Vi_p, float *Vo, float *Vo_p, float sampleFrq )
{
    float CutFrq, RC, Coff;
        
    //high pass filter @cutoff frequency = 0.5 Hz        
    CutFrq = 0.5;
    RC = (float)1.0/2.0/PI/CutFrq;
    Coff = RC/(RC + 1/sampleFrq);
    *Vo = ((*Vi) - (*Vi_p) +(*Vo_p) )*Coff ;        
    
    //update     
    *Vo_p = *Vo;    
    *Vi_p = *Vi;        
}
调用例子:

float b_ADCLoad1Volt, b_ADCLoad1VoltPrv, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;
 
 
HighPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltPrv, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);
调用时,1000是指每秒需要执行这个函数1000次。

C语言实现2:

#define PI 3.1415
 
 
//*********** Structure Definition ********//
typedef struct {
    float  Vi;
    float  Vi_prev;
    float  Vo_prev;
    float  Vo;
    float  Fcutoff;
    float  Fs;
} HPF_1orderRC_F;
//*********** Structure Init Function ****//
void HPF_1orderRC_F_init(HPF_1orderRC_F *v)
{
    v->Vi=0;
    v->Vi_prev=0;
    v->Vo_prev=0;
    v->Vo=0;
 
    //high pass filter @cutoff frequency = 0.05 Hz        
    v->Fcutoff=0.05;
 
    // execute 1000 every second
    v->Fs=1000;
}
 
//*********** Function Definition ********//
float HPF_1orderRC_F_FUNC(HPF_1orderRC_F *v)
{
    float RC, Coff;
 
    RC = (float)1.0/2.0/PI/v->Fcutoff;
    Coff = RC/(RC + 1/v->Fs);
    v->Vo = (v->Vi - v->Vi_prev + v->Vo_prev ) * Coff;
 
    //update     
    v->Vo_prev = v->Vo;
    v->Vi_prev = v->Vi;    
    
    return v->Vo;
}
 
HPF_1orderRC_F hpf_1orderrc_handle;
调用例子:

...
int main(void)
{
    ...
    HPF_1orderRC_F_init(&hpf_1orderrc_handle);    //初始化
    while(1)
    {
        ...
        if(flag_1ms==1)
        {
            hpf_1orderrc_handle.Vi = ADCresult;        //假设ADCresult是ADC采样结果
            
            FilteredResult = HPF_1orderRC_F_FUNC(&hpf_1orderrc_handle);//FilteredResult存放滤波结果  
        }
    }
}

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

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

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

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

可以看到,滤波器对直流信号有衰减作用。
--------------------- 
作者:xx健 
来源:CSDN 
原文:https://blog.csdn.net/qq_27158179/article/details/82661297 
版权声明:本文为博主原创文章,转载请附上博文链接!

一阶RC滤波器,数字滤波器相关推荐

  1. 一阶RC滤波器的算法实现(低通和高通)

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

  2. 一阶rc matlab,matlab – 一阶RC滤波器的时间离散实现

    我试图通过实现一阶RC滤波器的时间离散版本来确保我理解我的(数字)信号处理知识. (背景是我正在尝试在软件中实现用于SDR目的的PLL,但这是一个不同的故事--) 我的问题是我认为我理解如何为这样的滤 ...

  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低通滤波器杂记 关于一阶滤波器的种种有很多资料可查,像截止频率啊,相移啊什么的,这些在这里就不再重复了.本文主要阐述一下阿呆在学习过程中曾被困扰的地方,及本人的简要分析. 本文从无源R ...

  6. 级联rc滤波_了解无源RC滤波器,看完这篇你就懂了(二)

    在上一篇文章"了解无源RC滤波器,看完这篇你就懂了(一)"中,我们已经讨论了滤波器修改信号中各种频率分量振幅的方式.然而,除了振幅效应之外,电抗性电路元件总是引入相移. 低通滤波器 ...

  7. c++低通数字滤波器_快速扫盲之一阶RC低通数字滤波器算法实现

    低通滤波器(LPF)可以滤除频率高于截止频率的信号,类似的还有高通滤波器,带通滤波器,带阻滤波器.一阶RC低通滤波器的电路如下图所示: 参考了Wiki了,然后推导了一遍:首先输入输出的关系如下: 所以 ...

  8. 【滤波器学习笔记】一阶RC低通滤波

    一阶RC低通滤波 从模拟到数字 本文整理自网络.<匠人手记>等书籍文章 模拟电路低通滤波时域.频域 软件低通滤波 典型电路 图1 典型RC电路 直流.交流.脉冲信号都可以用它 时域 电容电 ...

  9. 博途1200/1500PLC信号处理之RC滤波器(一阶滞后滤波器)

    RC滤波器的其它详细讲解请大家参看下面的博文,这里主要给出博途的RC_Filter的FC代码,由于代码过于简单,这里也不做过多讲解.本文讲的主要是一阶递归离散时间滤波器(也叫一阶滞后滤波器).后面有空 ...

最新文章

  1. SAP PM 入门系列 - IL03显示Function Location主数据
  2. [deviceone开发]-do_Dialog的基本使用示例
  3. CVPR 2015 papers
  4. Spring MVC实现文件下载
  5. fst java_java快速序列化库FST
  6. 晚上八点半,一起来聊聊
  7. J2EE 快速开发框架 Wabacus 3.3 版功能列表
  8. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcd in position 0: invalid continuation byte
  9. 在vb连接mysql数据库_VB连接Mysql数据库
  10. c# RestSharp(http请求)
  11. Oracle数据脱敏REPLACE()和SUBSTR()
  12. 不想使用Windows自带远程桌面客户端的另外一种选择
  13. 2022年11月编程语言流行度排名
  14. 使用大白菜U盘启动盘制作工具去除预装软件(安装纯净系统)
  15. 区块链是什么通俗解释?
  16. 寄存器、缓存、内存之间的关系和区别
  17. 【java实现100以内加减法口算练习程序】
  18. 万能码码上付给你一个惊喜(安全扫码专业委员会)
  19. springboot flowable 工作流
  20. 不安分的 Go 语言开始入侵 Web 前端领域了!

热门文章

  1. 限制对比度自适应直方图均衡(Contrast Limited Adaptive histgram equalization/CLAHE)
  2. 张小庆,在路上(28)-中年危机
  3. 今天是今年的的第几天
  4. AcWing 790.数的三次方根
  5. 【面试招聘】CampusShame:校招污点公司名单
  6. 前端新玩具——webGL简介
  7. 【Mendax1234】ThinkpadX390 完美Big Sur(附详细安装教程)
  8. 如何重启或重置HomePod或HomePod mini?
  9. 故障转移群集(MSCS)搭建部署-图文详解
  10. python股票编程入门_Python股票量化投资-3.python基础