当前位置: 首页 > news >正文

低通滤波算法的数学原理和C语言实现

目录

概述

1 原理介绍

1. 1 基本概念

1.2 一阶RC低通滤波器模型

2 C语言完整实现

2.1 滤波器结构体定义

2.2 初始化函数

2.3 滤波计算函数

3 应用示例

3.1 噪声信号滤波

3.2 输出效果对比

3.3 关键参数选择指南

4 性能优化技巧

4.1 定点数优化

4.2  抗溢出处理

5 多阶滤波器扩展


概述

低通滤波是一种信号处理算法,用于滤除高频成分,只保留低频成分。其原理是将输入信号通过一个滤波器,滤除高于某个截止频率的频率成分,只保留低于该截止频率的成分。

低通滤波器通常使用滤波器的频率响应函数来实现,其中常用的滤波器包括有限脉冲响应(FIR)滤波器和无穷脉冲响应(IIR)滤波器。

FIR滤波器是一种线性相位滤波器,其频率响应函数可以由其系数确定。常见的FIR滤波器设计方法包括窗函数法、频率抽取法和最小最大法等。窗函数法通过选择不同的窗函数,确定滤波器的频率响应;频率抽取法则通过对原始信号进行抽取,得到低频信号;最小最大法则通过对滤波器的幅度响应进行最优化设计。

IIR滤波器是一种非线性相位滤波器,其频率响应函数由滤波器的差分方程确定。常见的IIR滤波器设计方法包括双线性变换法和脉冲响应逼近法等。双线性变换法通过将离散时间滤波器转换为连续时间滤波器设计;脉冲响应逼近法则通过最小化滤波器的幅频响应与目标响应之间的误差。

低通滤波在很多信号处理应用中都有广泛的应用,例如音频信号处理、图像处理和通信系统等。它可以滤除信号中的高频噪声,提高信号的质量和可靠性。

1 原理介绍

1. 1 基本概念

低通滤波器(Low Pass Filter, LPF)允许低于截止频率的信号通过,而衰减高频信号。常用于信号去噪、平滑处理等场景。

1.2 一阶RC低通滤波器模型

模拟域传递函数

  离散化(后向欧拉法)

2 C语言完整实现

2.1 滤波器结构体定义

#include <math.h>typedef struct {float input;        // 当前输入float output;       // 当前输出float last_output;  // 上次输出float a_coef;       // 系数αfloat b_coef;       // 系数(1-α)float dt;           // 采样时间(s)float fc;           // 截止频率(Hz)
} LowPassFilter;

2.2 初始化函数

void LowPassFilter_Init(LowPassFilter *lpf, float dt, float fc) 
{lpf->dt = dt;lpf->fc = fc;float RC = 1.0 / (2 * M_PI * fc);lpf->a_coef = dt / (RC + dt);lpf->b_coef = 1.0 - lpf->a_coef;lpf->last_output = 0.0;
}

2.3 滤波计算函数

float LowPassFilter_Update(LowPassFilter *lpf, float input) 
{lpf->input = input;lpf->output = lpf->a_coef * lpf->input + lpf->b_coef * lpf->last_output;lpf->last_output = lpf->output; // 更新历史值return lpf->output;
}

3 应用示例

3.1 噪声信号滤波

#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main() {LowPassFilter lpf;LowPassFilter_Init(&lpf, 0.01, 5); // 10ms采样周期,截止5Hzsrand(time(NULL));// 生成含噪声的正弦信号(2Hz信号 + 10Hz噪声)for(int i=0; i<500; i++) {float t = i * 0.01;float signal = sin(2 * M_PI * 2 * t); // 2Hz基波float noise = 0.5 * sin(2 * M_PI * 10 * t); // 10Hz噪声float raw_data = signal + noise;// 执行滤波float filtered = LowPassFilter_Update(&lpf, raw_data);printf("%.3f, %.3f, %.3f\n", t, raw_data, filtered);}return 0;
}

3.2 输出效果对比

时间(s)原始信号滤波后信号
0.1000.8910.089
0.2001.2450.231
0.3000.7320.412
.........
2.000-0.843-0.812

3.3 关键参数选择指南

4 性能优化技巧

4.1 定点数优化

对于资源受限的嵌入式系统,可将浮点运算转换为Q格式定点数:

typedef int32_t q31_t;
#define Q_SHIFT 28
q31_t a_coef_q = (q31_t)(lpf->a_coef * (1 << Q_SHIFT));

4.2  抗溢出处理

增加输出限幅保护:

lpf->output = (...);
if(lpf->output > 1e6) lpf->output = 1e6;
else if(lpf->output < -1e6) lpf->output = -1e6;

5 多阶滤波器扩展

实现二阶低通滤波器:

typedef struct {float a0, a1, a2, b1, b2;float x1, x2, y1, y2;
} BiquadFilter;

不同场景下的参数参考

应用场景推荐截止频率采样率特点
温度采集0.1-1Hz10Hz抑制工频干扰
电机转速检测50-100Hz1kHz保留转速波动特征
心电信号处理100-150Hz500Hz消除肌电噪声
语音信号处理3.4kHz8kHz满足电话语音带宽

http://www.lryc.cn/news/531435.html

相关文章:

  • 【BUUCTF杂项题】荷兰宽带数据泄露、九连环
  • 安全策略实验报告
  • Haproxy+keepalived高可用集群,haproxy宕机的解决方案
  • 亚博microros小车-原生ubuntu支持系列:20 ROS Robot APP建图
  • Dockerfile构建容器镜像
  • python 在包含类似字符\x16、\x12、\x某某的数组中将以\x开头的字符找出来的方法
  • Spring Bean 的生命周期介绍
  • 调用腾讯云批量文本翻译API翻译srt字幕
  • 车载软件架构 --- 软件定义汽车面向服务架构的应用迁移
  • Baklib引领内容中台与人工智能技术的创新融合之路
  • 想品客老师的第十一天:模块化开发
  • 接入DeepSeek大模型
  • 基于遗传算法的256QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率
  • JavaScript系列(57)--工程化实践详解
  • Linux-CentOS的yum源
  • 【大数据技术】案例03:用户行为日志分析(python+hadoop+mapreduce+yarn+hive)
  • LeetCode 0680.验证回文串 II:两侧向中间,不同就试删
  • 第二十章 存储函数
  • 架构规划之任务边界划分过程中承接分配
  • 【C++】线程池实现
  • vsnprintf的概念和使用案例
  • 解读隐私保护工具 Fluidkey:如何畅游链上世界而不暴露地址?
  • Linux环境Kanass安装配置简明教程
  • 数据分析常用的AI工具
  • 项目中常用中间件有哪些?分别起什么作用?
  • kaggle视频行为分析1st and Future - Player Contact Detection
  • 1. junit5介绍
  • (脚本学习)BUU18 [CISCN2019 华北赛区 Day2 Web1]Hack World1
  • Caxa 二次开发 ObjectCRX-1 踩坑:环境配置以及 Helloworld
  • 【自然语言处理(NLP)】生成词向量:GloVe(Global Vectors for Word Representation)原理及应用