一阶数字高通滤波器

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

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.mzph.cn/bicheng/14120.shtml

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

相关文章

从原理上解决 uniapp (含第三方插件)打包 iOS APP 失败的问题

最近一段时间&#xff0c;我的团队基于uniapp开发的平台型APP因平台资金合规的要求&#xff0c;需要对接中金支付&#xff0c;uniapp的插件市场有一个别人做好的中金支付插件&#xff0c;但前端开发同事在引用这个 插件时&#xff0c;出现了 iOS APP 打包不成功的情况&#xff…

Pantera 合伙人简谈 Morpho:更高效、适应性更强的 DeFi 解决方案

原文标题&#xff1a;《Pioneering Peer-to-Peer Lending in the DeFi Revolution》撰文&#xff1a;Pantera Capital 合伙人 Paul Veradittakit编译&#xff1a;Chris&#xff0c;Techub News 文章来源&#xff1a;香港Web3媒体Techub News Morpho 正在超越 Compound 等传统…

Redis主从、哨兵、cluster集群的部署和细节

目录 1. 主从模式 为什么需要主从&#xff1f; 搭建主从架构 2. Sentinel(哨兵)模式 为什么需要哨兵模式&#xff1f; 搭建哨兵集群 哨兵集群 Go语言编程redis哨兵模式 有了哨兵&#xff0c;客户端连接谁&#xff1f; test1&#xff1a;redis节点主从切换 test2&am…

webgl入门-矩阵变换

矩阵变换 前言 变换有三种状态&#xff1a;平移、旋转、缩放。 当我们变换一个图形时&#xff0c;实际上就是在移动这个图形的所有顶点。 课堂目标 掌握图形变换的三种方式。可以对图像进行复合变换。 知识点 平移旋转缩放 第一章 平移 对图形的平移就是对图形所有顶点…

如何快速从手动测试转向自动化测试

寻求具有无缝持续集成和持续交付 (CI/CD) 的高效 DevOps 管道比以往任何时候都更加重要。想象一下这样一个场景&#xff1a;您的软件组织显著减少了人工工作量、降低了成本&#xff0c;并更加自信地发布了软件更新。换句话说&#xff0c;通过将 Web UI 和 API 测试结合在一起&a…

【小白课程】如何在openKylin上个性化定制开关机动画

开关机动画是Linux系统的重要组成部分&#xff0c;其主要功能是在Linux内核启动的早期遮盖内核打印日志&#xff0c;并在内核刷新屏幕分辨率时保证屏幕显示的流畅性。 其中&#xff0c;openKylin操作系统使用plymouth组件作为开关机动画显示程序。Linux系统在启动时&#xff0…

计算机SCI期刊,中科院2区,收稿范围非常广泛!

一、期刊名称 Journal of Web Semantics 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;2.5 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$1600 三、期刊征稿范围 《网络语义学杂志》…

【软件测试】5.测试用例

目录 1.测试用例 1.1概念 1.2测试的要素 2.测试用例的万能公式 2.1常规思考逆向思维发散性思维 2.2万能公式 2.2.1功能测试 2.2.2界面测试 2.2.3性能测试 2.2.4兼容性测试 2.2.5易用性测试 2.2.6安全测试 2.3弱网测试 1.测试用例 1.1概念 什么是测试用例&#xf…

Jenkins 构建 Web 项目:构建服务器和部署服务器分离的情况

构建命令 #!/bin/bash node -v pnpm -v pnpm install pnpm build:prod # 将dist打包成dist.zip zip -r dist.zip dist

软件项目运维方案-word原件2024

1. 文档介绍 1.1 文档目的 1.2 文档范围 1.3 读者对象 1.4 参考文献 1.5 术语与缩写解释 2. 人员与责任 2.1 项目建设管理机构 2.2 驻场人员工作时间 2.3 人员培训 2.3.1. 培训需求管理 2.3.2. 培训内容管理 2.4 绩效考核 3. 运维过程内容 3.1. 运维模型 3.2. P…

LangChain - 概念指南

文章目录 一、Architecture1、langchain-core2、partner-packages3、langchain4、langchain-community5、langgraph6、langserve7、langsmith 二、浪链表达语言&#xff08;LCEL &#xff09;可运行界面 runnable-interface 三、组件 components1、聊天模型 chat-models2、 LLM…

工程机械租赁平台数字化平台系统油耗与排放管理创新与应用

在快速发展的城市建设和基础设施项目中&#xff0c;工程机械扮演着举足轻重的角色。随着工程规模的扩大和施工技术的不断进步&#xff0c;工程机械租赁平台应运而生&#xff0c;为建设项目提供了灵活高效的解决方案。然而&#xff0c;随着租赁机械数量的增加&#xff0c;如何有…

【GO基础】GO基础语法一

GO基础语法一 一、编写第一个Go程序1、基本程序结构2、应用程序入口3、退出返回值4、获取命令行参数 二、变量&#xff0c;常量以及与其他语言的差异1、编写测试程序2、实现Fibonacci数列3、变量赋值4、常量定义 三、数据类型1、类型转化2、类型的预定义值3、指针类型 四、运算…

微信小程序仿胖东来轮播和背景效果(有效果图)

效果图 .wxml <view class"swiper-index" style"--width--:{{windowWidth}}px;"><image src"{{swiperList[(cardCur bgIndex -1?swiperList.length - 1:cardCur bgIndex > swiperList.length -1?0:cardCur bgIndex)]}}" clas…

【四数之和】python,排序+双指针

四层循环&#xff1f;&#xff08;doge) 和【三数之和】题目很类似 class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:nums.sort()#a,b,c,d四个数&#xff0c;先固定两个数&#xff0c;那就是双指针问题了&#xff0c;令ba1&#xff…

关于搜索引擎链路

一、搜索引擎的的链路 简单流程如下&#xff0c;一般都包括query理解&#xff0c;召回&#xff0c;粗排&#xff0c;精排&#xff0c;重排。 二、query理解&#xff0c;查询词处理 对于进来的query需要有很多道工序做处理。才能让搜索引擎的效果更好、更智能。 2.1 分词 分词…

Ubuntu18.04 OpenSSH升级

升级前版本&#xff1a; rootecs-m2eqyb:/opt# ll total 20912 drwxr-xr-x 2 root root 4096 May 10 16:23 ./ drwxr-xr-x 24 root root 4096 May 10 14:38 ../ -rw-r--r-- 1 root root 1848766 May 10 16:23 openssh-9.7p1.tar.gz -rw-r--r-- 1 root root 18038…

离散数学--图论

目录 1.简单概念 2.握手定理 3.点割集 4.边割集 5.点连通度和边连通度 6.Dijstra算法&&最短路径 7.有向图的连通性 8.图的矩阵表示 9.欧拉图问题 10.哈密尔顿图 1.简单概念 &#xff08;1&#xff09;这个里面的完全图比较重要&#xff0c;完全图是例如k3,k5这…

JMETER工具:以录制手机app为例

JMETER工具&#xff1a;以录制手机app为例子 JMETER安装和环境配置 pc需要安装jdk&#xff0c;并进行jdk的环境配置&#xff0c;安装好jdk并配置好后&#xff0c;通过命令行输入java –version出现以下界面就表示安装成功&#xff1a; &#xff08;对应的jdk版本不可太低&…

selenium环境安装和web自动化基础

webUI自动化背景 因为web页面经常会变化&#xff0c;所以UI自动化测试的维护成本很高。不如接口的适用面广&#xff0c;所以大部分公司会做接口自动化测试&#xff0c;但是未必会做UI自动化测试&#xff1b; UI自动化测试要做也是覆盖冒烟测试&#xff0c;不会到很高的覆盖率&a…