低通滤波算法的数学原理和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.100 | 0.891 | 0.089 |
| 0.200 | 1.245 | 0.231 |
| 0.300 | 0.732 | 0.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-1Hz | 10Hz | 抑制工频干扰 |
| 电机转速检测 | 50-100Hz | 1kHz | 保留转速波动特征 |
| 心电信号处理 | 100-150Hz | 500Hz | 消除肌电噪声 |
| 语音信号处理 | 3.4kHz | 8kHz | 满足电话语音带宽 |
相关文章:
低通滤波算法的数学原理和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 抗溢出处理 …...
【BUUCTF杂项题】荷兰宽带数据泄露、九连环
一.荷兰宽带数据泄露 打开发现是一个.bin为后缀的二进制文件,因为提示宽带数据泄露,考虑是宽带路由器方向的隐写 补充:大多数现代路由器都可以让您备份一个文件路由器的配置文件,软件RouterPassView可以读取这个路由配置文件。 用…...
安全策略实验报告
1.实验拓扑图 2.实验需求 vlan2属于办公区,vlan3生产区 办公区pc在工作日时间可以正常访问OAserver,i其他时间不允许 办公区pc可以在任意时间访问Web server 生产区pc可以在任意时间访问OA server但不能访问web server 特例:生产区pc可以…...
Haproxy+keepalived高可用集群,haproxy宕机的解决方案
Haproxykeepalived高可用集群,允许keepalived宕机,允许后端真实服务器宕机,但是不允许haproxy宕机, 所以下面就是解决方案 keepalived配置高可用检测脚本 ,master和backup都要添加 配置脚本 # vim /etc/keepalived…...
亚博microros小车-原生ubuntu支持系列:20 ROS Robot APP建图
依赖工程 新建工程laserscan_to_point_publisher src/laserscan_to_point_publisher/laserscan_to_point_publisher/目录下新建文件laserscan_to_point_publish.py #!/usr/bin/env python3import rclpy from rclpy.node import Node from geometry_msgs.msg import PoseStam…...
Dockerfile构建容器镜像
Dockerfile 是一种文本格式的配置文件,用于自动化构建 Docker 镜像。它包含了一系列指令(命令),每个指令定义了容器镜像构建过程中的一步操作。通过Dockerfile,我们可以指定基础镜像、安装依赖、配置环境变量、复制文件…...
python 在包含类似字符\x16、\x12、\x某某的数组中将以\x开头的字符找出来的方法
话不多说直接看例子: import re# 原始列表 data [\x16, \x17, s, \x16, hello, \x1A]# 正则表达式匹配以 \x 开头的字符串 pattern r^\\x# 找出以 \x 开头的字符 result [item for item in data if isinstance(item, str) and re.match(pattern, repr(item)[1:-…...
Spring Bean 的生命周期介绍
Spring Bean 的生命周期涉及多个阶段,从实例化到销毁,在开发中我们可以通过各种接口和注解介入这些阶段来定制化自己的功能。以下是详细的生命周期流程: 1. Bean 的实例化(Instantiation) 方式:通过构造函…...
调用腾讯云批量文本翻译API翻译srt字幕
上一篇文章介绍了调用百度翻译API翻译日文srt字幕的方法。百度翻译API是get方式调用,参数都放在ur中,每次调用翻译文本长度除了接口限制外,还有url长度限制,而日文字符通过ur转码后会占9个字符长度,其实从这个角度来讲…...
车载软件架构 --- 软件定义汽车面向服务架构的应用迁移
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...
Baklib引领内容中台与人工智能技术的创新融合之路
内容概要 在数字化转型的浪潮中,各行业正在面临前所未有的挑战与机遇。内容中台作为一种新的概念,逐渐进入了企业的视野,它不仅是一个技术平台,更是提供了整合和管理内容的新思路。从根本上,内容中台旨在提升企业对信…...
想品客老师的第十一天:模块化开发
模块化概念 模块化开发可以提高代码的可维护性、可读性和复用性,同时降低开发和调试的复杂性,把业务根据功能分开写,解决变量命名的冲突,可以开放部分接口给类(例如调用模块里的一个函数)也更适合团队协作…...
接入DeepSeek大模型
接入DeepSeek 下载并安装Ollamachatbox 软件配置大模型 下载并安装Ollama 下载并安装Ollama, 使用参数ollama -v查看是否安装成功。 输入命令ollama list, 可以看到已经存在4个目录了。 输入命令ollama pull deepseek-r1:1.5b, 下载deepse…...
基于遗传算法的256QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率
目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): GA优化曲线: 优化前后星座图对比 优化前后误码率对比 仿真操作步骤…...
JavaScript系列(57)--工程化实践详解
JavaScript工程化实践详解 🏗️ 今天,让我们深入探讨JavaScript的工程化实践。良好的工程化实践对于构建可维护、高质量的JavaScript项目至关重要。 工程化基础概念 🌟 💡 小知识:JavaScript工程化是指在JavaScript开…...
Linux-CentOS的yum源
1、什么是yum yum是CentOS的软件仓库管理工具。 2、yum的仓库 2.1、yum的远程仓库源 2.1.1、国内仓库 国内较知名的网络源(aliyun源,163源,sohu源,知名大学开源镜像等) 阿里源:https://opsx.alibaba.com/mirror 网易源:http://mirrors.1…...
【大数据技术】案例03:用户行为日志分析(python+hadoop+mapreduce+yarn+hive)
用户行为日志分析(python+hadoop+mapreduce+yarn+hive) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 本机PyCharm远程连接虚拟机Python 搭建完全分布式高可用大数据集群(MySQL+Hive)...
LeetCode 0680.验证回文串 II:两侧向中间,不同就试删
【LetMeFly】680.验证回文串 II:两侧向中间,不同就试删 力扣题目链接:https://leetcode.cn/problems/valid-palindrome-ii/ 给你一个字符串 s,最多 可以从中删除一个字符。 请你判断 s 是否能成为回文字符串:如果能…...
第二十章 存储函数
目录 一、概述 二、语法 三、示例 一、概述 前面章节中,我们详细讲解了MySQL中的存储过程,掌握了存储过程之后,学习存储函数则肥仓简单,存储函数其实是一种特殊的存储过程,也就是有返回值的存储过程。存储函数的参数…...
架构规划之任务边界划分过程中承接分配
架构师在边界划分的过程中需要做什么事情呢?接下来,我们会讨论一些关于任务分配的 基础假设,以及由这些基础假设而带来的决策路径。 所谓任务边界划分,就是判定某个任务在多个承接方中,应该归属到哪个承接方的过程。…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
