IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言一阶低通、高通滤波器滤除截止频率外的杂波 -> 正文阅读

[C++知识库]C语言一阶低通、高通滤波器滤除截止频率外的杂波

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


理论推导

低通滤波器
一阶RC低通滤波器的数学模型及算法实现 —— 奔跑的chanchanchan
Y n = A ? X n + ( 1 ? A ) ? Y n ? 1 Y_n=A?X_n+(1?A)?Y_{n-1} Yn?=A?Xn?+(1?A)?Yn?1?
A = Δ T R C + Δ T = Δ T 1 2 π f + Δ T = 1 1 + 1 2 π f Δ T A=\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ΔT1?1?
高通滤波器
一阶RC高通滤波器详解(仿真+matlab+C语言实现)—— 小麦大叔
Y n = A ? Y n ? 1 + A ? ( X n ? X n ? 1 ) Y_n=A?Y_{n-1}+A?(X_n-X_{n-1}) Yn?=A?Yn?1?+A?(Xn??Xn?1?)
A = R C R C + Δ T = 1 2 π f 1 2 π f + Δ T = 1 1 + 2 π f Δ T A=\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;
	}
	else
		fof->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);	//低通滤波器,截止频率为1Hz
	fof_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,与 1 2 ≈ 0.707 \frac{1}{\sqrt{2}}≈0.707 2 ?1?0.707相差2.7%,
在这里插入图片描述
截止频率外的25Hz的信号经滤波已衰减至0.040
在这里插入图片描述

高通滤波器

在这里插入图片描述

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 11:40:56  更:2022-05-10 11:41:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 18:44:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码