完全解读低通滤波,并且用其C语言实现

news2024/11/17 14:54:08

1、什么是低通滤波

低通滤波是一种信号处理技术,它可以用于去除高频信号成分,只保留低频信号成分。低通滤波器的本质是一个线性时不变系统,它可以通过差分方程或者频域响应的形式来描述。

在差分方程的形式下,低通滤波器可以表示为:

y [ n ] = b 0 x [ n ] + b 1 x [ n − 1 ] + b 2 x [ n − 2 ] − a 1 y [ n − 1 ] − a 2 y [ n − 2 ] y[n] = b_0 x[n] + b_1 x[n-1] + b_2 x[n-2] - a_1 y[n-1] - a_2 y[n-2] y[n]=b0x[n]+b1x[n1]+b2x[n2]a1y[n1]a2y[n2]

其中, x [ n ] x[n] x[n]是输入信号, y [ n ] y[n] y[n]是输出信号, b 0 , b 1 , b 2 b_0, b_1, b_2 b0,b1,b2是前向系数, a 1 , a 2 a_1, a_2 a1,a2是反馈系数。这个差分方程表示了一个一阶或二阶低通滤波器,它可以对输入信号进行滤波,输出信号是输入信号的低频成分。

在频域响应的形式下,低通滤波器可以表示为:

H ( f ) = 1 1 + j f f c H(f) = \frac{1}{1+j\frac{f}{f_c}} H(f)=1+jfcf1

其中, f f f是频率, f c f_c fc是截止频率。这个频域响应表示了一个一阶低通滤波器的幅度响应,它可以对输入信号进行滤波,输出信号是输入信号的低频成分。

低通滤波器的实现方式有很多种,包括RC滤波器、Butterworth滤波器、Chebyshev滤波器等。它们的特点和应用场景不同,需要根据具体的需求来选择合适的滤波器。

2、RC低通滤波

RC低通滤波器是一种简单的低通滤波器,它由一个电阻和一个电容组成。它的原理是通过电容器的充放电过程来实现低通滤波。

在RC低通滤波器中,输入信号通过电阻接到电容的一端,电容的另一端接地。当输入信号发生变化时,电容器开始充放电,电容器的电压随着时间的变化而变化。由于电容器对高频信号的响应较弱,所以高频信号会被滤除,只有低频信号能够通过电容器,输出信号就是输入信号的低频成分。

RC低通滤波器的截止频率可以通过下面的公式计算:

f c = 1 2 π R C f_c = \frac{1}{2\pi RC} fc=2πRC1

其中, f c f_c fc是截止频率, R R R是电阻的阻值, C C C是电容的电容值。当频率等于截止频率时,电容器的阻抗等于电阻的阻值,此时输入信号的功率被分成一半,输出信号的功率也被分成一半,即20dB的衰减。

RC低通滤波器的特点是简单、易于实现,但是截止频率的变化范围较小,只能用于处理低频信号。此外,它的输出信号存在相位延迟,会对信号的时间性能产生影响。

3、转化为差分方程

RC滤波器的输入输出关系可以表示为:

V o u t ( t ) = 1 R C ∫ 0 t V i n ( τ ) d τ V_{out}(t) = \frac{1}{RC}\int_{0}^{t} V_{in}(\tau) d\tau Vout(t)=RC10tVin(τ)dτ

为了将其转化为差分方程的形式,我们可以将积分符号替换为差分符号,即:

V o u t [ n ] = 1 R C ∑ k = 0 n V i n [ k ] Δ t V_{out}[n] = \frac{1}{RC}\sum_{k=0}^{n} V_{in}[k] \Delta t Vout[n]=RC1k=0nVin[k]Δt

其中, V i n [ k ] V_{in}[k] Vin[k]是输入信号在时刻 k k k的取值, Δ t \Delta t Δt是采样时间间隔。将上式进行变形,得到:

R C V o u t [ n ] = V i n [ n ] Δ t + V o u t [ n − 1 ] RCV_{out}[n] = V_{in}[n]\Delta t + V_{out}[n-1] RCVout[n]=Vin[n]Δt+Vout[n1]

这就是RC滤波器的差分方程形式。其中, R C RC RC是滤波器的时间常数,它等于电阻 R R R和电容 C C C的乘积。差分方程表示了一个一阶低通滤波器,可以用于去除输入信号的高频成分,保留低频成分,输出信号是输入信号的低通滤波结果。

4、C语言实现

C语言代码实现低通滤波器:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define PI 3.14159265358979323846

double filter(double input, double prev_output, double prev_input, double cutoff_freq, double sample_rate) {
    double RC = 1.0 / (2.0 * PI * cutoff_freq);
    double alpha = 1.0 / (1.0 + RC * sample_rate);
    double output = alpha * (input + prev_input) + (1 - alpha) * prev_output;
    return output;
}

int main() {
    double input_signal[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};
    double output_signal[10];
    double prev_output = 0.0;
    double prev_input = 0.0;
    double cutoff_freq = 1000.0; // 1 kHz
    double sample_rate = 44100.0; // 44.1 kHz
    int i;

    for (i = 0; i < 10; i++) {
        output_signal[i] = filter(input_signal[i], prev_output, prev_input, cutoff_freq, sample_rate);
        prev_output = output_signal[i];
        prev_input = input_signal[i];
    }

    for (i = 0; i < 10; i++) {
        printf("%f\n", output_signal[i]);
    }

    return 0;
}

这个代码实现了一个一阶低通滤波器,使用差分方程的形式实现。

其中,input是当前输入信号,prev_output是上一个输出信号,prev_input是上一个输入信号,cutoff_freq是截止频率,sample_rate是采样率。

这个滤波器对于输入信号进行滤波,输出信号作为下一个输入信号的prev_input,输出信号作为下一个输出信号的prev_output。最后,输出滤波后的信号序列。

低通滤波器在很多应用中都有广泛的应用,如音频处理、图像处理、通信系统等。在音频处理中,低通滤波器可以用来去除噪声和杂音,使音频更加清晰;在通信系统中,低通滤波器可以用来滤除高频噪声和干扰,使信号更容易被接收和解码。

【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库引擎(MyIsAm和InnoDB)

一、数据库引擎 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;所以存储引擎也可被称为表类型。MySQL5.5版本之后默认InnoDB&#xff0c;之前是MyIsAm。 PS&#xff1a; 设置引擎语句&#xff1…

计算机网络:RIP协议以及距离向量算法

RIP协议 RIP是一种分布式的基于适量向量的路由选择协议&#xff0c;最大优点是简单。要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的唯一最佳&#xff08;最短&#xff09;距离记录&#xff0c;最多包含15个路由器&#xff0c;距离为16就表示网络不可达&…

每天一道大厂SQL题【Day15】微众银行真题实战(五)

每天一道大厂SQL题【Day15】微众银行真题实战(五) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

DBT 收购 Transform,指标平台已成现代数据栈关键拼图

今年 2 月初&#xff0c;现代数据技术栈独角兽 DBT 宣布完成对 Transform 的并购。在现代数据栈的体系中&#xff0c;DBT 和 Transform 都扮演着重要角色&#xff0c;DBT 侧重于整个分析链路上的数据转换处理&#xff0c;而 Transform 则聚焦在以指标为中心搭建业务分析应用。 …

【java】Java 封装

文章目录Java 封装封装的优点实现Java封装的步骤实例Java 封装 在面向对象程式设计方法中&#xff0c;封装&#xff08;英语&#xff1a;Encapsulation&#xff09;是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障&#xff0c;防…

14个Python处理Excel的常用操作分享

自从学了Python后就逼迫用Python来处理Excel&#xff0c;所有操作用Python实现。目的是巩固Python&#xff0c;与增强数据处理能力。本文为大家整理了14个Python处理Excel的常用操作&#xff0c;非常好用&#xff0c;希望对大家有所帮助目录自从学了Python后就逼迫用Python来处…

[AI助力] 2023.3.9 考研英语学习 2013 英语二翻译

[AI助力] 2023.3.9 考研英语学习 2013 英语二翻译 文章目录[AI助力] 2023.3.9 考研英语学习 2013 英语二翻译2013 英语二 翻译真题总结Powered with AI用perfect prompt 生成 prompt然后让它们评价&#xff0c;翻译&#xff0c;并改进New Bing 的回答让它改进~ &#xff08;太惊…

06-CSS

学习目标&#xff1a;能够使用精灵图能够使用字体图标能够写出 CSS 三角能够写出常见的 CSS 用户界面样式能够说出常见的布局技巧1. 精灵图&#xff08;重点&#xff09;1.1 为什么需要精灵图一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&am…

Cloudflare自动检测恶意IP拉黑到防火墙和自动切换5秒盾防CC攻击

资源宝分享&#xff1a;www.httple.net Cloudflare很多朋友都在使用&#xff0c;如果你的网站服务器架设在国外&#xff0c;那Cloudflare是一个非常好的加速工具&#xff0c;一可以为你的网站进行加速&#xff0c;二可以给你的网站提供防护 网站遭遇非常强大的CC和DDoS攻击时&…

安装sqoop

解压 [rootguo147 install]# tar -zxvf sqoop-1.4.7.tar.gz -C ../soft/ 修改名称 [rootguo147 soft]# mv sqoop-1.4.7/ sqoop147 添加jar包 把sqoop-1.4.7.bin__hadoop-2.6.0/lib 下的avro-1.8.1.jar复制到/opt/soft/sqoop147/lib [rootguo147 lib]# pwd /opt/soft/sqoo…

基础05-TCP三次握手和四次挥手

TCP 连接 三次握手 四次挥手 题目 请描述 TCP 连接的 三次握手 和 四次挥手 建立连接 客户端和服务端通过 HTTP 协议发送请求&#xff0c;并获取内容。 在发送请求之前&#xff0c;需要先建立连接&#xff0c;确定目标机器处于可接受请求的状态。 就例如&#xff0c;你要请…

如何做SpringBoot单元测试?

前言单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对项目中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试&#xff0c;对于Java来说或者是在SpringBoot项目中&#xff0c;最小的可测试单元就是一个方法。做单元测试就是为了证明某段代码的执⾏结果是否符…

如何快速开发一套分布式IM系统

架构说明&#xff1a; 1&#xff09;CIM 中的各个组件均采用 SpringBoot 构建&#xff1b;2&#xff09;采用 Netty Google Protocol Buffer 构建底层通信&#xff1b;3&#xff09;Redis 存放各个客户端的路由信息、账号信息、在线状态等&#xff1b;4&#xff09;Zookeeper …

1110道Java面试题及答案(最新Java初级面试题大汇总)

开篇小叙 现在 Java 面试可以说是老生常谈的一个问题了&#xff0c;确实也是这么回事。面试题、面试宝典、面试手册......各种 Java 面试题一搜一大把&#xff0c;根本看不完&#xff0c;也看不过来&#xff0c;而且每份面试资料也都觉得 Nice&#xff0c;然后就开启了收藏之路…

nginx常用命令与简单转发配置

一、Nginx常用基本命令 1、启动Nginx服务器命令&#xff1a; 去到sbin路径&#xff1a;cd /usr/local/nginx/sbin 启动Nginx服务器: ./nginx2、查看Nginx 版本号命令&#xff1a; ./nginx -v 或 ./nginx -V3、查看Nginx进程命令&#xff1a; ps aux|grep nginx4、检查Nginx…

我又和redis超时杠上了

背景 经过上次redis超时排查&#xff0c;并联系云服务商解决之后&#xff0c;redis超时的现象好了一阵子&#xff0c;但是最近又有超时现象报出&#xff0c;但与上次不同的是&#xff0c;这次超时的现象发生在业务高峰期&#xff0c;在简单看过服务器的各项指标以后&#xff0…

虚拟化系列教程:创建 KVM 虚机的几种方式

虚拟化系列教程&#xff1a;创建虚拟机的几种方式[TOC](虚拟化系列教程&#xff1a;创建虚拟机的几种方式)创建 KVM 虚机的几种方式使用 virt-install 命令创建虚拟机参数说明一般选项安装方法存储配置网络配置其它常用的选项图形配置设备选项虚拟化平台其它创建虚拟机的操作演…

java25种设计模式之适配器模式

1、定义 适配器模式在java中是一中结构型设计模式。 在实际的java来发中&#xff0c;有时候我们会遇到一些不能直接调用&#xff0c;或者不是客户需要的接口&#xff0c;但是却需要使用时&#xff0c;我们就可以使用适配器设计模式。 适配器设计模式就是将一个原本不兼容的接口…

文件处理命令连接命令

ln 命令英文原意&#xff1a;link 命令所在路径&#xff1a;/bin/ln 执行权限&#xff1a;所有用户 语法&#xff1a;ln -n[原文件][目标文件] -s 创建软连接 功能描述&#xff1a;生成链接文件 由上图可以看到这是我们所创建的软链接文件 为什么要用软连接&#xff1f; 软…

记录 yarn的安装和使用

yarn简介&#xff1a; Yarn是facebook发布的一款取代npm的包管理工具。 yarn的特点&#xff1a; ◆ 速度快 npm 会等一个包完全安装完才跳到下一个包&#xff0c;但 yarn 会并行执行包 ◆离线模式。 Yarn 缓存了每个下载过的包&#xff0c;所以再次使用时无需重复下载。 同时…