一阶数字高通滤波器

本文的主要内容包含一阶高通滤波器公式的推导和数字算法的实现以及编程和仿真

1 计算公式推导

1.1.2 算法实现及仿真

利用python实现的代码如下:

import numpy as np
# from scipy.signal import butter, lfilter, freqz
import matplotlib.pyplot as plt
#2pifWc = 2*np.pi*30Tsw = 0.00314           #采样时间
halfdigiW=np.tan(Wc/2*Tsw )b10=1/(halfdigiW+1)
b11=-b10
a10=(1-halfdigiW)/(halfdigiW+1)x=np.linspace(-np.pi,np.pi,2000)    #在[-pi,pi]区间上分割正2000个点  可以理解为信号采样时间为 2*pi/2000s
data=np.zeros_like(x)               #输入信号 保存被干扰的信号
data1=np.zeros_like(x)              #输入信号,保存未被干扰的信号,方便与滤波后的波形进行比较
y1=np.zeros_like(x)                 #一阶滤波输出
y2=np.zeros_like(x)                 #二阶滤波输出 陷波:对希望滤除的特定频率有很好的滤除作用
for i in range(len(x)):data[i] =np.sin( 2 * np.pi * x[i])+0.5*np.sin(30* 2 * np.pi * x[i])  #幅值为1频率为 1Hz的低频信号  + 幅值为0.5 频率为30hz的高频信号data1[i]=0.5*np.sin(130* 2 * np.pi * x[i])# y2[i] = b0*data[i]+b1*data[i-1]+a0*y2[i-1]y1[i] = b10 * data[i] + b11 * data[i - 1] + a10 * y1[i - 1]
y2[0] = 0
y2[1] = 0
y1[0] = 0
y1[1] = 0
#绘原始信号  + 滤波后的信号
plt.subplot(2, 1, 1)
plt.plot(x,data ,label='sig+noise')
plt.plot(x,y1,   'r',label='first order HP')#绘制理想信号  + 滤波后的信号
plt.subplot(2, 1, 2)
plt.plot(x,data1 ,label='sig')
plt.plot(x,y1,   'r',label='first order HP')
plt.grid()
plt.legend()
plt.show()

以下是在python中仿真的波形图:

图1-2 fc=0.5Hz

图1-3 fc=2Hz

图1-4 fc=5Hz

图1-5 fc=10Hz

图1-6 fc=20Hz

图1-7 fc=30Hz

图1-8 fc=40Hz

图1-9 fc=60Hz

图1-10 fc=159Hz

输入的信号是幅值为1 频率为 1Hz的低频信号  加上 幅值为0.5 频率为30Hz的高频信号,采样时间为0.003s,从图1-2到图1-10的仿真波形可以看出,当fc为0.5Hz时,滤后的波形有微小的衰减作用,但几乎和原波形一致,当逐渐增大截止频率fc,对低频的滤除结果越来越强,高频越来越接近高频本身的波形,当截止频率高于高频频率时,高频本身也会被滤掉。当截止频率大于等于1/2采样频率时,输出的是一条直线。

利用C语言实现的代码如下:

#ifndef _MHPF1W_F_H_
#define _MHPF1W_F_H_#include <stdint.h>
struct MHpf1W_F
{/*初始化*/struct{void (*Set)(struct MHpf1W_F *self, float cutFreq, int samFreq);  //设置截止和采样频率void (*VaryCutFreq)(struct MHpf1W_F *self, float cutFreq);       //改变截止频率float cutFreq;                                                   //截止频率float samFreq;                                                   //采样频率} Init;/*采样计算*/struct{int (*In)(struct MHpf1W_F *self, int Xn);int out_y;                                                        //输出值} Prd;/*变量 中间变量  系数等,由初始参数 初始化计算得出*/struct{float Ts;                                                         //采样周期int a0, b0, b1;                                                   //差分系数int Xn_1, Yn_1;} pri;
};
void MHpf1W_F_Create(struct MHpf1W_F *self);
#endif
//创建方式
// struct MHpf1W_F mlp;
// MHpf1W_F_Create(&mlp);
// mlp.Init.Set(&mlp,2, 1000);  fc=20Hz  fs=1000Hz#include "MHpf1W_F.h"
#include <string.h>
#include "math.h"static const float PI = 3.1415926535897932384626f;
#define MID(a,min,max) (a= (a<min)?min:(a<max)?a:max)
#define Q15M(a,b)  ((a*b)>>15)
/******************************************************************************** 函 数 名         : _Update* 函数功能         : 各系数计算,参数更新* 输入参数         : 滤波器对象 struct MHpf1W_F *self* 返 回 值         : 无*******************************************************************************/
static void _Update(struct MHpf1W_F *self)
{float halfdigiW,tgAnaWT ;halfdigiW = PI *  self->Init.cutFreq * self->pri.Ts;tgAnaWT = tan(halfdigiW);                       //ignore the 1/Tself->pri.b0 = 1/(tgAnaWT+1)*32768;             //转成Q15格式self->pri.b1 = -self->pri.b0;                   //转成Q15格式self->pri.a0 =((1-tgAnaWT)/(tgAnaWT+1))*32768;  //转成Q15格式self->pri.Xn_1 = 0;self->pri.Yn_1 = 0;
}
/******************************************************************************** 函 数 名         : InitSet* 函数功能         : 初始化* 输入参数         : cutFreq----截至频率*                   samFreq----计算机采样频率* 返 回 值         : 无*******************************************************************************/
static void InitSet(struct MHpf1W_F *self, float cutFreq, int samFreq)
{self->Init.cutFreq = MID(cutFreq  , 0.0f , samFreq*0.5f);;                       //截止频率self->Init.samFreq = samFreq;                       //采样频率self->pri.Ts = 1.0f / self->Init.samFreq;           //采样周期    1/Ts_Update(self);
}
/******************************************************************************** 函 数 名         : InitVaryCutF* 函数功能         : 改变截止频率* 输入参数         : cutFreq----截至频率* 返 回 值         : 无*******************************************************************************/
static void InitVaryCutF(struct MHpf1W_F *self, float cutFreq)
{self->Init.cutFreq = cutFreq;_Update(self);
}
/******************************************************************************** 函 数 名         : PrdIn* 函数功能         : 本次输出结果计算* 输入参数         : Xn----本次输入值* 返 回 值         :   本次滤波后的值* 计算公式         :Y(n)=b0*X(n)+b1*X(n-1)+a0*Y(n-1)*******************************************************************************/
static int PrdIn(struct MHpf1W_F *self, int Xn)
{/*Y(n)=b0*X(n)+b1*X(n-1)+b2*X(n-2)+a0*Y(n-1)+a2*Y(n-2)*/self->Prd.out_y = Q15M(self->pri.b0 , Xn ) + \Q15M(self->pri.b1 , self->pri.Xn_1 ) + \Q15M(self->pri.a0 , self->pri.Yn_1 ) ;self->pri.Yn_1 = self->Prd.out_y;self->pri.Xn_1 = Xn;return self->Prd.out_y;
}
/******************************************************************************** 函 数 名         : MHpf1W_F_Create* 函数功能         : 创建对象 初始化* 输入参数         : self对象* 返 回 值         : 无*******************************************************************************/
void MHpf1W_F_Create(struct MHpf1W_F *self)
{memset(self, 0, sizeof(struct MHpf1W_F));self->Init.Set = InitSet;self->Init.VaryCutFreq = InitVaryCutF;self->Prd.In = PrdIn;
}

单片机+匿名科创地面站的软件输出波形如下:

图1-11 fc=0.5Hz

图4-12 fc=2Hz

图1-13 fc=5Hz

图1-14 fc=10Hz

图1-15 fc=20Hz

图1-16 fc=30Hz

图1-17 fc=40Hz

图1-18 fc=60Hz

图1-18 fc=100Hz

图1-18 fc=200Hz

                                  图1-18 fc=500Hz

单片机模拟输入的信号是幅值为1000 频率为 1Hz的低频信号加上幅值为500 频率为30Hz的高频信号,采样时间为0.001s,从图1-11到图1-18的波形可以看出,输出变化的规律现象和python仿真的规律和现象是一致的,同样当截止频率大于等于1/2采样频率时,输出的是一条直线。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…

视频监控管理平台LntonCVS监控视频汇聚融合云平台主要功能应用场景介绍

随着网络技术的不断发展和万物互联时代的到来&#xff0c;视频融合在一些系统集成项目及综合管理应用中变得日益重要。本文以LntonCVS视频融合云平台为案例&#xff0c;探讨视频融合的对象及其应用场景。 1. 视频监控设备 视频监控摄像设备是各种视频应用项目的基础部分。在视…

亚马逊卖家账号注册复杂吗?需要什么辅助工具吗?

在当今数字化的商业世界中&#xff0c;亚马逊作为全球最大的电商平台之一&#xff0c;吸引着无数的卖家和买家。对于想要进入亚马逊销售市场的卖家来说&#xff0c;首先要完成的一项重要任务就是注册亚马逊卖家账号。本文将详细介绍亚马逊注册的步骤、所需时间&#xff0c;以及…

入门四认识HTML

一、HTML介绍 1、Web前端三大核心技术 HTML&#xff1a;负责网页的架构 CSS&#xff1a;负责网页的样式、美化 JS&#xff1a;负责网页的行动 2、什么是HTML HTML是用来描述网页的一种语言。 3、Html标签 单标签<html> 双标签<h>内容</h> 4、标…

【译】组复制和 Percona XtraDB 集群: 常见操作概述

原文地址&#xff1a;Group Replication and Percona XtraDB Cluster: Overview of Common Operations 在这篇博文中&#xff0c;我将概述使用 MySQL Group Replication 8.0.19&#xff08;又称 GR&#xff09;和 Percona XtraDB Cluster 8 (PXC)&#xff08;基于 Galera&…

服务器数据恢复—EVA存储多块硬盘离线导致部分LUN丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 1台某品牌EVA4400控制器3台EVA4400扩展柜28块FC硬盘。 服务器故障&#xff1a; 由于两块磁盘掉线导致存储中某些LUN不可用&#xff0c;某些LUN丢失&#xff0c;导致存储崩溃。 服务器数据恢复过程&#xff1a; 1、由于EVA4400存储故障是某些磁…

Java 对外API接口开发 java开发api接口如何编写

Java API API&#xff08;Application Programming Interface&#xff09;是指应用程序编程接口&#xff0c;的JavaAPI是指JDK提供的各种功能的Java类 String类 String类的初始化&#xff1a; &#xff08;1&#xff09;使用字符串常量直接初始化 初始化&#xff1a;String s…

闲话 .NET(4):为什么要跨平台?

前言 .NET Core 有一个关键词就是跨平台&#xff0c;为什么要跨平台呢&#xff1f;Windows 操作系统不香吗&#xff1f;今天我们来聊聊这个 原因一&#xff1a;安全考虑 Windows OS 是闭源的&#xff0c;而 Linux 是开源的&#xff0c;因此有些公司的技术负责人就认为 Linux…

笔记:weblogic配置内存启动参数

可以在控制台配置 参数值 -Xms2048m -Xmx2048m -XX:PermSize512m -XX:MaxPermSize512m -Xss128k激活更改。修改完之后&#xff0c;节点需要重启才能生效。 参数说明&#xff1a; -Xms 为JVM启动时分配的内存 -Xmx 为JVM运行过程中分配的最大内存 -XX:PermSize 为JVM初始分配…

Qt笔记:动态处理多个按钮点击事件以更新UI

问题描述 在开发Qt应用程序时&#xff0c;经常需要处理多个按钮的点击事件&#xff0c;并根据点击的按钮来更新用户界面&#xff08;UI&#xff09;&#xff0c;如下图。例如&#xff0c;你可能有一个包含多个按钮的界面&#xff0c;每个按钮都与一个文本框和一个复选框相关联…

python从0开始学习(十二)

目录 前言 1、字符串的常用操作 2、字符串的格式化 2.1 格式化字符串的详细格式&#xff08;针对format形式&#xff09; ​编辑 总结 前言 上一篇文章我们讲解了两道关于组合数据类型的题目&#xff0c;本篇文章我们将学习新的章节&#xff0c;学习字符串及正则表达式。 …

react实现把pc网站快捷添加到桌面快捷方式

文章目录 1. 需求2. 实现效果3. 核心逻辑4. 完整react代码 1. 需求 这种需求其实在国外一些游戏网站和推广网站中经常会用到&#xff0c;目的是为了让客户 快捷方便的保存网站到桌面 &#xff0c;网站主动尽量避免下次找不到网站地址了&#xff0c;当然精确的客户自己也可以使…

打印安全:防止打印过程中的商业机密泄露

在数字化办公日益普及的今天&#xff0c;打印安全常常成为企业信息保护中被忽视的一环。商业机密在打印过程中泄露&#xff0c;可能会给企业带来巨大的损失。本文将探讨如何通过一系列措施&#xff0c;确保打印过程中的商业机密安全。 一、打印安全的重要性 打印设备作为企业中…

hbase版本从1.2升级到2.1 spark读取hive数据写入hbase 批量写入类不存在问题

在hbase1.2版本中&#xff0c;pom.xml中引入hbase-server1.2…0和hbase-client1.2.0就已经可以有如下图的类。但是在hbase2.1.0版本中增加这两个不行。hbase-server2.1.0中没有mapred包&#xff0c;同时mapreduce下就2个类。版本已经不支持。 <dependency><groupId>…

两步将 CentOS 6.0 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文介绍如何将一个 CentOS 6.0 的系统升级并转换迁移到 RHEL 7.9。 本文是《在离线环境中将 CentOS 7.X 原地升级并迁移至 RHEL 7.9》阶进篇。 所有被测软件的验证操作可参见上述前文中对应章节的说明。 准备 CentOS 6.…

数据量较小的表是否有必要添加索引问题分析

目录 前言一、分析前准备1.1、准备测试表和数据1.2、插入测试数据1.3、测试环境说明 二、具体业务分析2.1、单次查询耗时分析2.2、无索引并发查询服务器CPU占用率分析2.3、添加索引并发查询服务器CPU占用率分析 三、总结 前言 在一次节日活动我们系统访问量到达了平时的两倍&am…

SAP PRD覆盖QAS 替代方案构想

随着时间的推移&#xff0c;SAP PRD的数据跟QAS的差异会越来越大&#xff0c;一般是定期PRD覆盖QAS。但是在没有BASIS的情况下&#xff0c;没有这块经验的情况下&#xff0c;也没有外部支持的情况下&#xff0c;贸然做这个事情也是有风险的&#xff0c;有没有替代方案&#xff…

算法2:滑动窗口(上)

文章目录 长度最小子数组无重复字符的最长子串[最大连续 1 的个数III](https://leetcode.cn/problems/max-consecutive-ones-iii/description/)将x减到0的最小操作数 长度最小子数组 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {in…

vue3中基于element-plus封装一个表格弹框组件,要求可以单选和多选table数据

单选&#xff1a; <template><SelectMaterialref"selectMaterialRef"check"checkbox"select"selectMaterial"></SelectMaterial><el-button type"primary" size"small" icon"el-icon-plus"…

Web API——获取DOM元素

目录 1、根据选择器来获取DOM元素 2.、根据选择器来获取DOM元素伪数组 3、根据id获取一个元素 4、通过标签类型名获取所有该标签的元素 5、通过类名获取元素 目标&#xff1a;能查找/获取DOM对象 1、根据选择器来获取DOM元素 语法&#xff1a; document.querySelector(css选择…