滤波总结 波形处理原理 如何对一个规律的波形进行滤波 显现出真正的波形 如何设计滤波

需要用到的软件:waveserialport              vofa++  

1.波形想用MCU进行采集首先你要考虑到你的采集频率因为如果你的对象波形即你要采集的波形,他过于快速的话有一些MCU它是不能的比如说有一些它的主频才36兆72兆呢你如果遇到一个特别快的波形毫秒级别那他就检测不了

2.然后你得想个办法,调用定时器也好,或者使用固定延时也罢反正你就是要再定一个采样频率,因为不同波形它的频率是不一样的我们相应的采样频率也得不一样如果说你的采样频率不符合的话你是很难提取一个周期的波形当在数字信号系统中有一条定理它规定了我的采集频率一定要比我的波形的频率要是它频率的一半最少是一半不然的话你的波形就是不完整的,也就是说你的采样频率要比我的波形快2倍这样的话你才能采集到一个完整的波形周期如果说你比的波形的频率还要慢的话那你根本就采集不到一个完整的波形

3.接着你的采样方法去采集你的ADC波形成一个数组然后用串口输出符合你串口波形软件的协议的串口信息到我的串口显示软件里面看看我的波形长的是什么样子  采样频率怎么计算呢就是你点与点之间的间隔吗比如说我这个红光采样是每六毫秒采样一次那就是1秒除以我的六毫秒等于我的赫兹125

在这一步中因为你不知道你的波形大概是多少个点也就是你不知道你的波形在你的采样频率下是多少个数据为一个数组,也就是说你一个周期你不知道你有多少个采样点,那你的数组就要定的越大越好定到你的数组里面可以看得出我一个规律的波形出来,比如说我下面这张图片我订的是一个两百个点的一个数据集去采集我的ADC然后再输出串口然后显示成波形可以明显的看到他们是有一个很虽然说长得不像但是是有一个规律存在在里面的它们长得都十分足够大的足够包含我一个周期的点数的的相似那这就是我们这个数组

4.有了这个数组以后因为我们能从中看出我们一个完整规律的一个波形出来那我们就要把它拆成点然后用手去数一下到底一个周期的波形里面有多少个点呢那你这样那我们数出来的这个数就是我的一个周期以内在当前的采样频率下有多少个点为一个周期也就是我一个周期会包含多少一个采样点注意的是这个采样点的个数会随着我们的采样频率的变化而变化所以说一开始你的采样频率就需要确定好而且要比你的要测的波形的频率快两倍

你看虽然我定数组刚开始定两百,但是我这个两百的数组里面包含了两个周期的波形,那我就把这个连线拆成了点,因为我用的vofa++加这个串口波形显示软件,

我就可以把它切换成连线模式也好然后画点模式也好然后我就可以再这个话点模式下数一下我一个周期大概是有多少个点这里我就数出来了我一个周期大概是有八十个点那我定的数组就不应该是两百而是八十如果你不用模糊佳佳你需要怎么去呃知道你的这个周期大概包含了多少个采样点呢最完整的方法就是不断的下降直到你的波形不完整为止也就是说你从两百降到一百五降到一百四降到一百三然后降到八十看一下你的波形到底在哪一个值它是非常的稳定的非常的好看的准确的

5.所有的波都是可以用正弦波进行组合而成 你用不同频率的正弦波就能组成不同形状的波形,比如说一个血氧的波形就可能由两赫兹的正弦波三赫兹的正弦波和12赫兹的正弦波组成,只需要你把这些几赫兹几赫兹的波形进行拆分,就是把一个波形拆成它的组成正弦波就可以看出你哪一个频率的波形是最多最广泛的,比如说一个血氧的波形就是两赫兹三赫兹和12赫兹的正弦波,那你把它采集到的adc数据输入到某个软件中,让他去帮你提取里面的正弦波,那你的波形是有杂波的,你的杂波出现于六赫兹。十八赫兹或者二十赫兹等等,那这些赫兹它的波形因为只是噪声只是干扰,它不会有规律,所以在你的软件里面显现。出这些频率的波形,它在你传入的波形中出现的概率比较低,它没有那些规律的波形出现的概率比较高,所以你就会得到一种不同频率的波在你传入的波形中出现的频率。哪一个波形出现的哪一个频率波。正弦波出现的最多,那他就是你想要得到的规律波形被拆成的几种频率的正弦波,比如一个带噪声的血氧波形,它是由两赫兹6赫兹12,赫兹20,赫兹30,赫兹40,赫兹十八赫兹的正弦波组成,你把这个波形用adc提取了之后,把数字发到那个软件中一个周期里面他就会帮你分辨这个周期的波形是有多少这种频率的正弦波组成的,那在你显示的那个结果。中你就会看到两赫兹六赫兹十二赫兹的正弦波,它在你的这个周期波形里面出现的频率是最多的,那也就是说你这个新血氧的波形就是由这几种频率赫兹的波形组成的。那其他的18赫兹20赫兹的波形就是噪声,这样的话你就可以选择低通滤波器,高通滤波器带阻滤波器进行波形。频率的一个滤除,比如说我用低通滤波器截止频率为13赫兹那13赫兹以上的20赫兹18赫兹全部都滤掉了,等于是我的噪声被滤掉了

这个软件它有几个参数

波形点数:就是我要显示多少个串口传进来的波形数据点,也就是说你串口用单片机传数据到电脑之后它会先存储起来组成缓冲区,然后在这个串口波形显示框里面你要指定你要提取你这个缓冲区里面多少个点,把它转换到这个显示区里面,那其他没有转换的,那就还是保存在缓冲区,你显示的波形点越多呢,你这个重复出现的频率正弦波也就越准确,那这些重复出现的频率正弦波就是我这个波形真正组成该波形的频率正弦波,那其他那一些不常出现的频率正弦波就是杂波噪声,我们要做的就是保存我们这个真正组成规律波形的频率正弦波,也就是占比百分百占比百分百最常出现那一片波形要保存起来,其他的波形全部滤掉也就是这张图里面的二十到六十赫兹全部不要了,在严格来说就是十以上的全部波形都不要了,那我们就要使用低通滤波器来完成

FFT点数:自动填写

采样频率:你的mcu采样频率

信号频率:最多出现的频率正弦波  这里就是那个为占比为1的         也就是频率为2hz的正弦波

接下来是我用的滤波函数:

低通滤波器:滤除高于截止频率的波形

#include <stdio.h>
#include <math.h>
 
#define PI 3.14159265358979323846 
 
// 滤波器结构体 
typedef struct {
    // 滤波器系数 
    float b0, b1, b2;
    float a1, a2;
    
    // 状态变量 
    float x1, x2; // 输入延迟 
    float y1, y2; // 输出延迟 
} LowPassFilter;
 
// 初始化二阶低通滤波器 
void initLowPassFilter(LowPassFilter* filter, float cutoffFreq, float sampleRate) {
    float Q = 1.0f / sqrtf(2.0f); // 巴特沃斯滤波器Q值 
    float omega0 = 2 * PI * cutoffFreq / sampleRate;
    float alpha = sinf(omega0) / (2 * Q);
 
    // 计算系数 
    float b0 = (1 - cosf(omega0)) / 2;
    float b1 = 1 - cosf(omega0);
    float b2 = b0;
    float a0 = 1 + alpha;
    
    // 归一化系数 
    filter->b0 = b0 / a0;
    filter->b1 = b1 / a0;
    filter->b2 = b2 / a0;
    filter->a1 = -2 * cosf(omega0) / a0;
    filter->a2 = (1 - alpha) / a0;
 
    // 初始化状态 
    filter->x1 = filter->x2 = 0;
    filter->y1 = filter->y2 = 0;
}
 
// 处理单个样本 
float processSample(LowPassFilter* filter, float input) {
    float output = filter->b0 * input + filter->b1 * filter->x1 + filter->b2 * filter->x2 
                 - filter->a1 * filter->y1 - filter->a2 * filter->y2;
 
    // 更新状态 
    filter->x2 = filter->x1;
    filter->x1 = input;
    filter->y2 = filter->y1;
    filter->y1 = output;
 
    return output;
}

使用实例:

(1)

//实例波形数据message_RED[80]   message_IR[80]

LowPassFilter filter;
float output_IR[80];
float output_RED[80];
int main(void)
{	
	const float sampleRate = 125.0f;  // 采样率1kHz 
    const float cutoffFreq = 4.0f;    // 截止频率20Hz 
    const int numSamples = 80;       // 处理1000个样本 
	
    initLowPassFilter(&filter, cutoffFreq, sampleRate);
    for(int yy = 0; yy <79; yy++)
    {
	float input = message_RED[yy];
	 output_RED[yy] = processSample(&filter, input);                              
     //低通滤波器循环处理
	 input = message_IR[yy];
	 output_IR[yy] = processSample(&filter, input);
									
 }

(2)

#include <stdio.h>
#include <math.h>
 
#define PI 3.14159265358979323846 
 
// 滤波器结构体 
typedef struct {
    // 滤波器系数 
    float b0, b1, b2;
    float a1, a2;
    
    // 状态变量 
    float x1, x2; // 输入延迟 
    float y1, y2; // 输出延迟 
} LowPassFilter;
 
// 初始化二阶低通滤波器 
void initLowPassFilter(LowPassFilter* filter, float cutoffFreq, float sampleRate) {
    float Q = 1.0f / sqrtf(2.0f); // 巴特沃斯滤波器Q值 
    float omega0 = 2 * PI * cutoffFreq / sampleRate;
    float alpha = sinf(omega0) / (2 * Q);
 
    // 计算系数 
    float b0 = (1 - cosf(omega0)) / 2;
    float b1 = 1 - cosf(omega0);
    float b2 = b0;
    float a0 = 1 + alpha;
    
    // 归一化系数 
    filter->b0 = b0 / a0;
    filter->b1 = b1 / a0;
    filter->b2 = b2 / a0;
    filter->a1 = -2 * cosf(omega0) / a0;
    filter->a2 = (1 - alpha) / a0;
 
    // 初始化状态 
    filter->x1 = filter->x2 = 0;
    filter->y1 = filter->y2 = 0;
}
 
// 处理单个样本 
float processSample(LowPassFilter* filter, float input) {
    float output = filter->b0 * input + filter->b1 * filter->x1 + filter->b2 * filter->x2 
                 - filter->a1 * filter->y1 - filter->a2 * filter->y2;
 
    // 更新状态 
    filter->x2 = filter->x1;
    filter->x1 = input;
    filter->y2 = filter->y1;
    filter->y1 = output;
 
    return output;
}
 
int main() {
    const float sampleRate = 1000.0f;  // 采样率1kHz 
    const float cutoffFreq = 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PyQt组态软件 拖拽设计界面测试

PyQt组态软件测试 最近在研究PyQt,尝试写个拖拽设计界面的组态软件&#xff0c;目前实现的功能如下&#xff1a; 支持拖入控件&#xff0c;鼠标拖动控件位置 拖动控件边缘修改控件大小支持属性编辑器&#xff0c;修改当前选中控件的属性 拖动框选控件&#xff0c;点选控件 控…

算法学习笔记之贪心算法

导引&#xff08;硕鼠的交易&#xff09; 硕鼠准备了M磅猫粮与看守仓库的猫交易奶酪。 仓库有N个房间&#xff0c;第i个房间有 J[i] 磅奶酪并需要 F[i] 磅猫粮交换&#xff0c;硕鼠可以按比例来交换&#xff0c;不必交换所有的奶酪 计算硕鼠最多能得到多少磅奶酪。 输入M和…

把 DeepSeek1.5b 部署在显卡小于4G的电脑上

这里写自定义目录标题 介绍准备安装 Ollama查看CUDA需要版本安装CudaToolkit检查Cuda是否装好设置Ollama环境变量验证是否跑在GPU上ollama如何导入本地下载的模型安装及配置docker安装open-webui启动open-webui开始对话 调整gpu精度 介绍 Deepseek1.5b能够运行在只用cpu和gpu内…

第四十四篇--Tesla P40+Janus-Pro-7B部署与测试

环境 系统&#xff1a;CentOS-7 CPU: 14C28T 显卡&#xff1a;Tesla P40 24G 驱动: 515 CUDA: 11.7 cuDNN: 8.9.2.26创建环境 conda create --name trans python3.10torch 2.6.0 transformers 4.48.3克隆项目 git clone https:/…

「vue3-element-admin」Vue3 + TypeScript 项目整合 Animate.css 动画效果实战指南

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

LabVIEW太阳能制冷监控系统

在全球能源需求日益增长的背景下&#xff0c;太阳能作为一种无限再生能源&#xff0c;被广泛应用于各种能源系统中。本基于LabVIEW软件和STM32F105控制器的太阳能制冷监控系统的设计与实现&#xff0c;提供一个高效、经济的太阳能利用方案&#xff0c;以应对能源消耗的挑战。 项…

【openresty服务器】:源码编译openresty支持ssl,增加service系统服务,开机启动,自己本地签名证书,配置https访问

1&#xff0c;openresty 源码安装&#xff0c;带ssl模块 https://openresty.org/cn/download.html &#xff08;1&#xff09;PCRE库 PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式&#xff0c;那么在编译Nginx时就必须把PCRE库编译进Nginx&#xf…

迅为RK3568开发板篇Openharmony配置HDF控制UART-什么是串口

串口&#xff08;Serial Port&#xff09;也叫串行通信接口&#xff0c;通常也叫做 COM 接口&#xff0c;是通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输。 两个 UART 设备的连接示意图如下&#xff0c;UART 与其他模块一般用 2 线…

Anaconda +Jupyter Notebook安装(2025最新版)

Anaconda安装&#xff08;2025最新版&#xff09; Anaconda简介安装1&#xff1a;下载anaconda安装包2&#xff1a; 安装anaconda3&#xff1a;配置环境变量4&#xff1a;检查是否安装成功5&#xff1a;更改镜像源6&#xff1a;更新包7&#xff1a;检查 Jupyter Notebook一.Jup…

HtmlRAG:RAG系统中,HTML比纯文本效果更好

HtmlRAG 方法通过使用 HTML 而不是纯文本来增强 RAG 系统中的知识表示能力。通过 HTML 清洗和两步块树修剪方法&#xff0c;在保持关键信息的同时缩短了 HTML 文档的长度。这种方法优于现有基于纯文本的RAG的性能。 方法 其实主要看下围绕html提纯思路&#xff0c;将提纯后的…

Linux 文件系统:恢复已删除文件的挑战

如今&#xff0c;Linux 操作系统越来越受欢迎。它的明显优势首先是免费。此外&#xff0c;该操作系统提供了种类繁多的版本及其衍生产品&#xff0c;可满足从手机到超级计算机等设备的不同用户需求。 Linux 操作系统使用独有的文件系统&#xff0c;包括 Ext2、Ext3 和 Ext4、X…

三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab)

三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测&#xff08;Maltab&#xff09; 完整代码私信回复三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测&#xff08;Maltab&#xff09; 一、引言 1、研究背景和意义 在现代数据科学领域&#xff0c;时间序列…

提供可传递的易受攻击的依赖项

问题如图所示&#xff1a; 原因&#xff1a;okhttp3.version 3.14.9 版本存在部分漏洞&#xff0c;在 maven 仓库是可以看到的 maven 地址&#xff1a; maven 下图中 Vulnerabilities 即为漏洞 处理&#xff1a;换一个无漏洞的版本即可

使用pocketpal-ai在手机上搭建本地AI聊天环境

1、下载安装pocketpal-ai 安装github的release APK 2、安装大模型 搜索并下载模型&#xff0c;没找到deepseek官方的&#xff0c;因为海外的开发者上传了一堆乱七八糟的deepseek qwen模型&#xff0c;导致根本找不到官方上传的……deepseek一开源他们觉得自己又行了。 点击之…

头歌实验--面向对象程序设计

目录 实验五 类的继承与派生 第1关&#xff1a;简易商品系统 任务描述 答案代码 第2关&#xff1a;公司支出计算 任务描述 答案代码 第3关&#xff1a;棱柱体问题 任务描述 答案代码 实验五 类的继承与派生 第1关&#xff1a;简易商品系统 任务描述 答案代码 #incl…

卷积神经网络实战人脸检测与识别

文章目录 前言一、人脸识别一般过程二、人脸检测主流算法1. MTCNN2. RetinaFace3. CenterFace4. BlazeFace5. YOLO6. SSD7. CascadeCNN 三、人脸识别主流算法1.deepface2.FaceNet3.ArcFace4.VGGFace5.DeepID 四、人脸识别系统实现0.安装教程与资源说明1. 界面采用PyQt5框架2.人…

Spring IoC的实现机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Spring IoC的实现机制是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; Spring IoC的实现机制是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring IoC&#xff08;Inversion of Control…

关闭浏览器安全dns解决访问速度慢的问题

谷歌浏览器加载速度突然变慢了&#xff1f;检查安全DNS功能(DoH)是否被默认开启。 谷歌浏览器在去年已经推出安全DNS功能(即DoH) , 启用此功能后可以通过加密的DNS增强网络连接安全性。例如查询请求被加密后网络运营商将无法嗅探用户访问的地址&#xff0c;因此对于增强用户的…

【Spring AI】基于SpringAI+Vue3+ElementPlus的QA系统实现(前端)

整理不易&#xff0c;请不要吝啬你的赞和收藏。 1. 前言 这篇文章是 Spring AI Q&A 系统的前端实现。这篇文章将介绍如何快速搭建一个基于 vue3 ElementPlus 的前端项目&#xff0c;vue3 项目的目录结构介绍&#xff0c;如何在前端实现流式响应&#xff0c;如何高亮显示…

中望CAD c#二次开发 ——VS环境配置

新建类库项目&#xff1a;下一步 下一步 下一步&#xff1a; 或直接&#xff1a; 改为&#xff1a; <Project Sdk"Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>NET48</TargetFramework> <LangVersion>pr…