Python:谈谈常规滤波器(带通、低通、高通、带阻)的用法

news2024/11/22 15:49:16

一、滤波器的作用

        滤波器在信号处理中用于移除或减少信号中的噪声,同时保持信号的某些特性。滤波器通常用于音频、视频和图像处理等领域。滤波器根据其 designed for different purposes and can be divided into several types, such as lowpass filters, highpass filters, bandpass filters, and bandstop filters.

        (1)低通滤波器(Lowpass Filters): 低通滤波器用于通过高频信号,去除或减少低频信号,从而减少噪声。

        (2)高通滤波器(Highpass Filters): 高通滤波器用于去除或减少低频信号,通过高频信号,从而减少噪声。

        (3)带通滤波器(Bandpass Filters): 带通滤波器用于通过指定频率范围内的信号,去除或减少其他频率范围内的信号,从而减少噪声。

        (4)带阻滤波器(Bandstop Filters): 带阻滤波器用于去除指定频率范围内的信号,通过其他频率范围内的信号,从而减少噪声。

二、滤波器的设计

        滤波器设计是一种将信号从复杂噪声中提取出有用的信号的过程。滤波器设计通常包括以下几个步骤:

        Step1: 确定滤波器类型:根据信号的类型和应用场景,确定需要设计的滤波器类型。例如,低通滤波器、高通滤波器、带通滤波器等。

        Step2:选择滤波器参数:根据滤波器类型和应用场景,选择合适的滤波器参数,例如滤波器带宽、截止频率等。

        Step3:设计滤波器网络:根据滤波器类型和参数,设计滤波器网络。通常使用线性代数、信号处理和系统理论等知识来设计滤波器网络。

        Step4:测试和优化:使用测试信号对滤波器进行测试,并根据测试结果对滤波器进行优化。

三、Python代码实现

        (1)以下为低通(高通滤波器类似这样设计)滤波器的一个demo:

import numpy as np
from scipy.signal import butter, filtfilt
import matplotlib.pyplot as plt

def butter_lowpass_filter(data, cutoff, fs, order=4):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='low', analog=False) #高通滤波器btype='high'
    filtered_data = filtfilt(b, a, data)
    return filtered_data

# main
fs = 2000  # 采样频率
dt = 1.0 / fs  # 时间间隔
t = np.arange(0, 1, dt)  # 时间向量
ff = np.linspace(0, fs//2, t.size//2)
n = len(t)  # 信号长度

# 生成一个包含噪声的信号
np.random.seed(0)
noise = 0.1 * np.random.randn(n)
freq = 150  # 信号频率
x = np.sin(2 * np.pi * freq * t) + np.sin(2 * np.pi * 500 * t) + noise  # 带噪声的信号

# 设置滤波器参数
cutoff = 200  # 滤波器截止频率
order = 4  # 滤波器阶数

# 应用滤波器
filtered_data = butter_lowpass_filter(x, cutoff, fs, order)

# 绘制原始信号和滤波后的信号
plt.figure()
plt.subplot(2, 1, 1)
plt.plot(t, x, 'b-', label='Noisy signal')
plt.plot(t, filtered_data, 'r-', linewidth=2, label='Filtered signal')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')
plt.legend()
plt.grid()

plt.subplot(2, 1, 2)
plt.plot(ff, np.abs(np.fft.ifft(x))[0:fs//2], 'b-', label='Noisy signal')
plt.plot(ff, np.abs(np.fft.ifft(filtered_data))[0:fs//2], 'r-', linewidth=2, label='Filtered signal')
plt.xlabel('Frequency (Hz)')
plt.ylabel('|P1(f)|')
plt.legend()
plt.grid()

plt.show()

        低通滤波器代码运行后的结果如图1所示。

图1

       (2) 以下为带通滤波器的一个demo:

import numpy as np
from scipy.signal import butter, filtfilt
import matplotlib.pyplot as plt

def butter_bandpass_filter(data, lowcut, highcut, fs, order=4):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    b, a = butter(order, [low, high], btype='band')
    filtered_data = filtfilt(b, a, data)
    return filtered_data

# main
fs = 2000  # 采样频率
dt = 1.0 / fs  # 时间间隔
t = np.arange(0, 1, dt)  # 时间向量
ff = np.linspace(0, fs//2, t.size//2)
n = len(t)  # 信号长度

# 生成一个包含噪声的信号
np.random.seed(0)
noise = 0.1 * np.random.randn(n)
freq = 150  # 信号频率
x = np.sin(2 * np.pi * freq * t) + np.sin(2 * np.pi * 500 * t) + noise  # 带噪声的信号

# 设置滤波器参数
lowcut = 400  # 滤波器下限频率
highcut = 600  # 滤波器上限频率
order = 4  # 滤波器阶数

# 应用滤波器
filtered_data = butter_bandpass_filter(x, lowcut, highcut, fs, order)

# 绘制原始信号和滤波后的信号
plt.figure()
plt.subplot(2, 1, 1)
plt.plot(t, x, 'b-', label='Noisy signal')
plt.plot(t, filtered_data, 'r-', linewidth=2, label='Filtered signal')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')
plt.legend()
plt.grid()

plt.subplot(2, 1, 2)
plt.plot(ff, np.abs(np.fft.ifft(x))[0:fs//2], 'b-', label='Noisy signal')
plt.plot(ff, np.abs(np.fft.ifft(filtered_data))[0:fs//2], 'r-', linewidth=2, label='Filtered signal')
plt.xlabel('Frequency (Hz)')
plt.ylabel('|P1(f)|')
plt.legend()
plt.grid()

plt.show()

         带通滤波器代码运行后的结果如图2所示。

图2

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

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

相关文章

【Unity设计模式】✨使用 MVC 和 MVP 编程模式

前言 最近在学习Unity游戏设计模式,看到两本比较适合入门的书,一本是unity官方的 《Level up your programming with game programming patterns》 ,另一本是 《游戏编程模式》 这两本书介绍了大部分会使用到的设计模式,因此很值得学习 本…

Linux rpm与yum

一、rpm包管理 rpm用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。RPM是RedHat Package Manager (RedHat软件包管理工具)的缩写,类似windows的setup.exe,这一文件格式名称虽然打上了R…

Python pip install模块时C++编译环境问题

pip install模块时C编译环境问题 在接触和使用python后,常常会通过pip install命令安装第三方模块,大多数模块可以直接安装,但许多新同学仍会遇见某些模块需要实时编译后才能安装,如报错信息大概是缺乏C编译环境,本文则…

Golang-GMP

GMP调度 golang-GMP语雀笔记整理 GMP调度设计目的,为何设计GMP?GMP的底层实现几个核心数据结构GMP调度流程 设计目的,为何设计GMP? 无论是多进程、多线程目的都是为了并发提高cpu的利用率,但多进程、多线程都存在局限性。比如多进程通过时…

Python变量的命名规则与赋值方式

第二章:Python 基础语法 第一节:变量的命名规则与赋值方式 2.1.1 引言 在编程中,变量是存储数据的基本单元。变量的命名和赋值是编程语言中表达和操作数据的基础。了解和遵循变量命名规则对于编写清晰、可维护的代码至关重要。 2.1.2 变量…

嵌入式Linux系统编程 — 5.2 Linux系统时间与日期

目录 1 了解Linux系统时间 1.1 几种常用的时间 1.2 如何查看几种常用的时间 1.3 Linux 系统中的时间 2 time、gettimeofday获取时间 2.1 time函数 2.2 ​​​​​​​gettimeofday函数: 2.3 示例程序 3 时间转换函数 3.1 ctime与ctime_r函数 3.2 localti…

小白学python(第四天)顺序与分支篇

这几天因为个人原因,python篇会更新比较慢,还望大家谅解,那么废话不多说,我们现在就进入正题 顺序篇 这个没啥好说的,就是自上而下,依次执行 分支篇 条件(if)语句语法格式&#…

Listary(Windows 文件搜索工具)专业版值得购买吗?

说到经典的国货软件,有一款 Win 软件是一定绕不过去的。它就是知名的本地文件搜索工具 Listary! 便捷的文件搜索窗口;快捷操作的体验;与系统更匹配的外观设计;更智能的排序和更可靠的索引。 便捷的文件搜索窗口 紧凑…

百亿级存储架构: ElasticSearch+HBase 海量存储架构与实现

百亿级存储架构: ElasticSearchHBase 海量存储架构与实现 尼恩:百亿级数据存储架构起源 在40岁老架构师 尼恩的读者交流群(50)中,经常性的指导小伙伴们改造简历。 经过尼恩的改造之后,很多小伙伴拿到了一线互联网企业如得物、阿…

AI大模型API:驱动人工智能创新的核心引擎

在当今快速发展的人工智能领域,AI大模型API成为了开发者必备的利器。这些API为开发者提供了强大的人工智能模型和算法,使他们能够轻松地构建智能化应用和解决方案。作为开发者,我们可以借助AI大模型API实现自然语言处理、图像识别、声音合成等…

windows电脑使用netsh添加端口转发、设置端口转发和删除端口转发

目录 1. 添加端口转发 2. 查看是否添加成功 3. 设置端口转发 4. 删除端口转发 除查看命令外,其他命令需要以管理员方式运行。 1. 添加端口转发 命令: netsh interface portproxy add v4tov4 listenaddress你的外部IP listenport你的外部端口 conne…

Winform使用Flurl调用WebApi的基本用法

微信公众号“CSharp编程大全"的文章《.NET超简单轻量级的HTTP请求组件Flurl》介绍了便捷构建URL及创建HTTP请求的.NET模块Flurl。与HttpClient相比,Flurl封装的更简捷易用,代码量更少。本文学习并测试基于Fluri调用WebApi的基本用法。   基于Fluri调用WebApi…

DIY智能音箱:基于STM32的低成本解决方案 (附详细教程)

摘要: 本文详细介绍了基于STM32的智能音箱的设计与实现过程,包括硬件设计、软件架构、语音识别、音乐播放等关键技术。通过图文并茂的方式,结合Mermaid流程图和代码示例,帮助读者深入理解智能音箱的工作原理,并提供实际操作指导。…

51单片机第11步_在C语言中插入汇编语言

本章重点介绍如何在C语言中插入汇编语言。要不是有记录,真不知道怎么搞。 /* 你在 Project Workspace窗口中,将光标移到DELAY.c处,点下鼠标右键,选择"Options for file DELAY.c", 点击右边的"Generate Assembler SRC File"和“Assemble SRC …

recogito-js:用于文本注释/图像注释的前端插件

创建批注: 继续批注: 右侧批注列表: 1、功能与应用: 文本注释:recogito-js可以将注释功能添加到网页上,或者作为构建完全自定义注释应用程序的工具箱。图像注释:除了文本注释外,它还…

ros笔记01--初次体验ros2

ros笔记01--初次体验ros2 介绍安装ros2测试验证ros2说明 介绍 机器人操作系统(ROS)是一组用于构建机器人应用程序的软件库和工具。从驱动程序和最先进的算法到强大的开发者工具,ROS拥有我们下一个机器人项目所需的开源工具。 当前ros已经应用到各类机器人项目开发中…

python sklearn机械学习模型-回归

🌈所属专栏:【机械学习】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您…

可编程定时计数器8253/8254 - 8253入门

时钟-给设备打拍子 概述 在计算机系统中,为了使所有设备之间的通信井然有序,各通信设备间必须有统一的节奏,不能各干各的,这个节奏就被称为定时或时钟 时钟并不是计算机处理速度的衡量,而是一种使设备间相互配合而避…

从需求是如何最终抽象成最基本的传参入参

第一层:出参和入参 用通俗的话讲,就是给客户提供服务的一种方式,需要包含入参和出参 。入口参数就是程序执行时会调用的参数,出口参数就是程序执行完会返回的参数。入参的值是被调函数需要, 出参的值是主调函数需要的…

Suno: AI音乐创作的新时代

名人说:一点浩然气,千里快哉风。 ——苏轼 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、什么是Suno?1、Suno2、应用场景 二、如何使用Suno制作音乐?步骤1:注册…