【滤波专题-第8篇】ICA降噪方法——类EMD联合ICA降噪及MATLAB代码实现(以VMD-ICA为例)
今天来介绍一种效果颇为不错的降噪方法。(针对高频白噪声)
上一篇文章我们讲到了FastICA方法。在现实世界的许多情况下,噪声往往接近高斯分布,而有用的信号(如语音、图像特征等)往往表现出非高斯的特性。FastICA通过最大化输出信号的非高斯性来恢复这些有用的信号,从而有效地从噪声中分离出信号。
将类经验模态分解(EMD)方法与FastICA结合使用,可以创建一种巧妙的信号处理策略,这种结合利用了两种方法的互补优势:通过EMD分解得到的IMFs可以简化信号的结构,但单独使用EMD可能不足以有效分离信号中的噪声和有用信息,自适应得到的imf数量也可能存在冗余;FastICA则能够从imf信号中进一步提取独立成分,更有效地识别噪声成分。
下面将详细解释这种结合的算法流程、优势以及MATLAB代码实现。
一、算法流程
我们直接开门见山,通过案例来讲解算法流程。
首先生成一段待降噪信号。
rng(123456)
t = (0:0.001:(1-0.001))';
x1 = 0.6*sin(15*pi*t+pi/5);
x2 = cos(60*pi*t+sin(10*pi*t));
x3 = (1+0.3*cos(10*pi*t)).*sin(200*pi*t);
x4 = wgn(1000,1,-10);fs = 1000; %采样频率
ps = x1+x2+x3; %未加噪声的纯净信号
s = ps+x4;
figure('color','w')
subplot(2,1,1);plot(t,ps,'k');title('无噪声的仿真信号')
subplot(2,1,2);plot(t,s,'k');title('加入噪声的仿真信号')
这段信号加入噪声前后的图像如下,我们的任务就是将下边的含噪信号尽可能回复成上图中的无噪声信号。
1.类EMD分解
关注我的专栏的老读者们都知道,我将EMD、EEMD、CEEMD、CEEMDAN、ICEEMDAN、VMD等一系列模态方法统称为“类EMD”方法,在本篇文章中,该步骤也可以是上述分解方法中的任意一种,毕竟这一步的目的是将复杂信号分解为一定数量的模态分量。
此案例中我们使用VMD分解算法。
alpha=1000; % alpha - 惩罚因子
tol=1e-6; % tol - 收敛容差,是优化的停止准则之一,可以取 1e-6~5e-6
K=5; % K - 指定分解模态数
imf = pVMD(s,fs, alpha, K, tol);
上边代码中使用了pVMD函数,这是笔者封装的一个易用的VMD画图函数,其介绍可以看之前的文章。分解结果如下:
也可以在调用pVMDandFFT函数绘制imf分量与频谱对比图。
imf = pVMDandFFT(s,fs, alpha, K, tol); %函数见此处:https://zhuanlan.zhihu.com/p/396775790
当然使用MATLAB内置的vmd函数也是可以的,但是要注意输入FastICA的imf分量的行列方向,需要保证imf是每一行为一个分量。
2.FastICA盲源分离
以类EMD分解得到的imf分量作为输入,进行ICA混解。
在这里一定要算出混合矩阵A(忘记概念的同学可以看上一篇)。
%% 3.ICA混解并绘制混解后的图像
numOfIC = 0; % 需要提取的独立成分数目,如果不指定数目,则输入0
g = 'pow3'; % 使用的非线性函数类型,可选'pow3', 'tanh', 'gauss'
[icasig, A, W] = pFastICA(imf, numOfIC, g);
此时,我们将会得到如下分解结果:
从FastICA盲源分离结果可以推断独立成分5是噪声分量,但是在自动化实现降噪的代码中,我们自然希望对噪声分量的判断是不需要人为介入的。此时我们引入一个功率谱熵阈值判断方法来实现。
3.功率谱熵阈值判断
在之前的文章(Mr.看海:【熵与特征提取】基于“信息熵”的特征指标及其MATLAB代码实现(功率谱熵、奇异谱熵、能量熵))中讲到,信息熵越大,代表不确定性越大,信号中包含的信息量越少,信号越无秩序/越接近于白噪声,则信息熵越大。
由于盲源分离本身的特性,分离出来的独立成分中,最多包含一个高斯分量,也就是噪声分量。
所以我们只需要判断几个独立成分的功率谱熵中,是否有数值相较于其他分量大得多的成分,就是噪声分量。
也就是找到功率谱熵中的离群值。
这里我们阈值的计算标准是:阈值=功率谱熵均值+功率谱熵的标准差
我们将大于阈值的独立成分直接赋值为0。
计算结果如下图,可以看到噪声分量被识别了出来。
4.重构滤波信号
不知道大家是否还记得FastICA方法的重要性质之一:输出信号幅度的不确定性。FastICA分解得到的独立成分是不能像类EMD分解得到的imf那样直接相加进行重构的。
但是FastICA也有自己的重构方法,就是使用上边提到的混合矩阵A。重构公式为:
X=A∗icasig
上式中的icasig就是经过处理过后的独立成分,对于大于阈值的成分,我们已经将其幅值全部置0;X就是重构结果,也就是该方法中的滤波结果。
此时得到的滤波结果为:
可以看出,滤波效果还是颇为不错的,经计算此时的信噪比为15.9dB。
二、算法流程图
将上述算法梳理成流程图如下,当然vmd分解这步是可以替换成其他分解算法的,另外功率谱熵也可以换成其他熵值指标。
三、MATLAB实现
为了方便大家使用,按照惯例笔者对上述流程进行了封装。封装的流程就是上述流程图中红框内的部分,之所以没有将vmd也一并封装进去,是为了大家方便替换其他的模态分解算法。
封装后的函数只需要将分解好的imf变量导入,即可一行代码实现滤波:
reSig = filEMDsICA(imf); % 调用filEMDsICA函数实现滤波
经实测,这个方法的滤波效果还是很不错的。
我为大家提供了完整的演示案例,可以一键实现下述图像和滤波结果的输出:
要你做的,基本就只需替换数据啦!
需要上边这个函数文件以及测试代码的同学,可以在公众号 khscience(看海的城堡)中回复“ICA滤波”获取。
扩展阅读
Mr.看海:【滤波专题-第1篇】数字滤波器15分钟入门!——这可能是最简单的FIR有限冲激响应滤波讲解
Mr.看海:【滤波专题-第2篇】数字滤波器15分钟入门!——这可能是最简单的IIR无限冲激响应滤波讲解
Mr.看海:【滤波专题-第3篇】IIR无限冲激响应和FIR有限冲激响应数字滤波器有什么区别?
Mr.看海:【滤波专题-第4篇】滤波器滤波效果的评价指标(信噪比SNR、均方误差MSE、波形相似参数NCC)
Mr.看海:【滤波专题-第5篇】FIR、IIR滤波器设计及MATLAB实现
Mr.看海:【滤波专题-第6篇】小波阈值去噪方法看这一篇就明白了~(附MATLAB实现)
Mr.看海:【滤波专题-第7篇】“类EMD”算法分解后要怎样使用(3)——EMD降噪方法及MATLAB代码实现
Mr.看海:【盲源分离】快速理解FastICA算法(附MATLAB绘图程序)
相关文章:

【滤波专题-第8篇】ICA降噪方法——类EMD联合ICA降噪及MATLAB代码实现(以VMD-ICA为例)
今天来介绍一种效果颇为不错的降噪方法。(针对高频白噪声) 上一篇文章我们讲到了FastICA方法。在现实世界的许多情况下,噪声往往接近高斯分布,而有用的信号(如语音、图像特征等)往往表现出非高斯的特性。F…...

jeecg 启动 微服务 更改配置本地host地址
127.0.0.1 jeecg-boot-redis 127.0.0.1 jeecg-boot-mysql 127.0.0.1 jeecg-boot-nacos 127.0.0.1 jeecg-boot-gateway 127.0.0.1 jeecg-boot-system 127.0.0.1 jeecg-boot-sentinel 127.0.0.1 jeecg-boot-xxljob 127.0.0.1 jeecg-boot-rabbitmq1. windows系统下,在开…...

微服务day01 -- SpringCloud01 -- (Eureka , Ribbon , Nacos)
介绍微服务 1.认识微服务(p1-p5) 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#…...
AI推介-大语言模型LLMs论文速览(arXiv方向):2024.03.10-2024.03.15
文章目录~ 1.Large Language Models and Causal Inference in Collaboration: A Comprehensive Survey2.VisionGPT-3D: A Generalized Multimodal Agent for Enhanced 3D Vision Understanding3.MT-PATCHER: Selective and Extendable Knowledge Distillation from Large Langu…...

ThingsBoard Edge 安装部署
文章目录 一、概述1.官方文档2.部署说明3.安装准备3.1. 克隆服务器3.2.安装 Docker3.3.安装 Java 113.4.安装 PostgreSQL3.5.下载安装包 二、安装部署1.创建 Edge 实例2.创建数据库3.Edge 服务安装3.1.安装服务3.2.配置 Edge3.3.运行安装脚本3.4.重新启动服务 4.访问 Edge5.故障…...
CSS进阶空间转换和 less
<html> <head> <meta charset"UTF-8" /> <title>空间转换</title> </head> <body> <!-- 空间转换 空间:是从坐标轴角度定义的X,Y,和Z三条坐标轴构成一个立体空间 Z轴位置与视线方向相同 空间转换也叫3D转…...
C/C++ 知识点:| 与 || 的区别
文章目录 一、|与 || 的区别1、按位或运算符 |2、逻辑或运算符 ||3、区别4、总结 前言 在C编程语言中,逻辑或运算符用于连接两个条件表达式,当至少有一个条件为真时,整个表达式的结果为真。C提供了两种逻辑或运算符:按位或|和逻辑…...

CSS中如何设置单行或多行内容超出后,显示省略号
1. 设置超出显示省略号 css设置超出显示省略号可分两种情况: 单行文本溢出显示省略号…多行文本溢出显示省略号… 但使用的核心代码是一样的:需要先使用 overflow:hidden;来把超出的部分隐藏,然后使用text-overflow:ellipsis;当文本超出时…...

PFA烧杯透明聚四氟乙烯刻度量杯
PFA烧杯,刻度清晰,耐酸碱,和有机溶剂。...

Redis底层数据结构之String
文章目录 1. 前提回顾2. RedisObject三大数据类型简介3. SDS字符串4. SDS字符串源码分析5. 总结 1. 前提回顾 前面我们说到redis的String数据结构在底层有多种编码方式。例如我们执行下面两条语句 set k1 v1 set age 17我们查看类型,发现这类型都是String类型 我们…...

【Maven学习笔记】Maven入门教程(适合新手反复观看学习)
Maven学习笔记 Maven的简要介绍Maven的安装和配置Maven的安装Maven安装的常用配置 Maven的使用入门编写pom编写主代码编写测试代码打包和运行使用Archetype生成项目骨架 Maven核心概念的阐述坐标案例分析依赖依赖的范围传递性依赖依赖范围依赖调节可选依赖Maven依赖常用的技巧 …...

idea Springboot 在线考试管理系统开发mysql数据库web结构java编程计算机网页
一、源码特点 springboot 在线考试管理系统是一套完善的完整信息系统,结合mvc框架和bootstrap完成本系统springboot spring mybatis ,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有…...

Spring Cloud Alibab 入门搭建,包含Nacos中心,注册服务发现服务,Feign请求,GateWay网关,sentinel限流
源码在最后 一、安装Nacos注册中心 1.1查看Nacos官网,安装Nacos服务,下载源码或者安装包 1.2启动服务,默认端口为8848, 二、创建服务注册&发现 2.1使用脚手架,创建注册服务和发现服务项目,我用的版…...

ShardingSphere-SQL 解析 Issue 处理流程
ShardingSphere-SQL 解析 Issue 处理流程 这是之前给社区写的 SQL 解析 Issue 的处理流程,可以帮助社区用户快速参与到 ShardingSphere-SQL 解析任务当中。 ShardingSphere SQL 解析 issue 列表 Issue 背景说明 当前 Issue 使用自定义的爬虫脚本从对应的数据库官…...

【矩阵】48. 旋转图像【中等】
旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,…...
高质量 Git 仓库汇总(持续更新,方便查看)
Leetcode https://github.com/kamyu104/LeetCode-Solutions Cmake https://github.com/viva64/pvs-studio-cmake-examples 3D目标检测 Awesome-3D-Object-Detection Awesome-3D-Object-Detection-for-Autonomous-Driving Cuda Code dbscan https://github.com/l3lackc…...

学习笔记-华为IPD转型2020:1,IPD的重要意义
华为产品开发转型:IPD计划 大多数公司发现,当公司大幅增长时,在较小规模上有效的管理实践不再有效。产品开发过程也是如此。随着华为的发展,该公司遇到了产品故障率更高、开发周期更长和研发成本增加等问题。然后,它转…...

【阿里云系列】-基于云效构建部署NodeJS项目到ACK
准备工作 01、编写Dockerfile文件可以根据不同的环境,新建不同的Dockerfile文件,比如Dockerfile-PROD # Deliver the dist folder with NginxFROM nginx:stable-alpine ENV LANGC.UTF-8 ENV TZAsia/ShanghaiCOPY dist/ /usr/share/nginx/html COPY ngi…...

Jmeter入参问题小记
表单入参的时候,这个地方需要勾选,如果不☑️选的话,会提示errorMsg":"Required String parameter code is not present",...

【四 (2)数据可视化之 Matplotlib 常用图表及代码实现 】
目录 文章导航一、介绍二、安装Matplotlib三、导入Matplotlib四、设置可以中文显示四、常用图形1、散点图(Scatter Plot)2.1、线性图(Line Plot)2.2、堆叠折线图2.3、多图例折线图3.1、柱状图/条形图(Bar Chart&#x…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...