稀疏最大谐波噪声比解卷积算法MATLAB实战

news2024/11/27 2:27:39

稀疏最大谐波噪声比解卷积(SMHD)算法是一种信号处理方法,特别是在处理含有噪声和谐波分量的复杂信号时表现出色。在信号处理领域,经常需要从被噪声和谐波干扰的信号中提取出有用的信息。传统的解卷积方法可能需要预先设定故障周期等参数,这在实际应用中往往难以实现。而SMHD算法则无需设定这些参数,能够自适应地从信号中估计出故障周期,并有效地抑制噪声和谐波分量,从而恢复出更清晰的信号。

一、算法原理

SMHD算法首先通过滤波信号的包络来计算谐波噪声比,算法不断迭代估计信号的谐波成分和噪声成分,并计算相应的谐波噪声比。基于谐波噪声比的计算结果,SMHD算法能够自适应地估计出信号的故障周期。在估计出故障周期后,SMHD算法会利用这一信息对信号进行解卷积处理来消除信号中的传递路径衰减和噪声干扰,从而恢复出原始的信号成分。

算法的优点:

1.无需设定故障周期:与传统的解卷积方法相比,SMHD算法无需预先设定故障周期等参数,能够自适应地从信号中估计出这些参数。

2.有效抑制噪声和谐波:通过计算谐波噪声比并自适应地估计故障周期,SMHD算法能够有效地抑制信号中的噪声和谐波分量。

3.提高信号恢复质量:由于能够准确地估计出故障周期并进行解卷积处理,SMHD算法能够恢复出更清晰、更准确的信号成分。

二、代码实战

SMHD算法不仅克服了传统解卷积方法如最小熵解卷积(MED)和最大相关峰态解卷积(MCKD)的局限性,而且在没有提前提供故障周期的情况下也能进行有效的故障特征检测。

通过模拟和不同测试台的轴承数据验证,SMHD算法在检测各种轴承故障方面表现出了有效性,与传统的MED和MCKD方法相比,SMHD在视觉检查和效率上都有更好的表现。具体代码如下所示:

clear
close all
clc

%%
load sig3
x = x - mean(x);
addpath('..\00 subfunction\')

%%
fs = 20000;
N = length(x);
t = (0:N - 1) / fs;
t = t(:);
BPFI = 38;

%% Raw data
figure;
plot(t, x, 'b');
xlabel('Time [s]')
ylabel('Amplitude')
title('Raw data')
legend(['Kurtosis=', num2str(kurtosis(x))])
setfontsize(20);
set(gcf, 'position', [100, 100, 800, 400])
axis tight
ylim([-2 2.5])

envelope_x = abs(hilbert(x)) - mean(abs(hilbert(x)));
ff = 0:fs / N:fs - fs / N;
amp_envelope_x = abs(fft(envelope_x, N)) * 2 / fs;
figure;
plot(ff, amp_envelope_x, 'b')
xlabel('Frequency [Hz]')
ylabel('Amplitude')
setfontsize(20);
set(gcf, 'position', [100, 100, 800, 400])
axis tight
xlim([0, 200]);
ylim([0 0.025])

%% SMHD

[y_final, f_final, kurtIter] = smhd(fs, x, 100, 30, 1.5 * rms(x), [], 0);

%% Filtered signal
figure;
plot(t, y_final, 'b');
xlabel('Time [s]')
ylabel('Amplitude')
title('Filtered signal by SMHD')
legend(['Kurtosis=', num2str(kurtosis(y_final))])
setfontsize(20);
set(gcf, 'position', [100, 100, 800, 400])
axis tight
ylim([-3.5 4.5])

envelope_y = abs(hilbert(y_final)) - mean(abs(hilbert(y_final)));
amp_envelope_y = abs(fft(envelope_y, N)) * 2 / fs;
figure;
plot(ff, amp_envelope_y, 'b')
xlabel('Frequency [Hz]')
ylabel('Amplitude')
setfontsize(20);
set(gcf, 'position', [100, 100, 800, 400])
axis tight
xlim([0, 200]);
ylim([0 0.3])

function [y_final, f_final, kurtIter] = smhd(fs, x, filterSize, termIter, mu, T, plotMode)
    if isempty(filterSize)
        filterSize = 100;
    end

    if isempty(termIter)
        termIter = 30;
    end

    if isempty(mu)
        mu = mean(x);
    end

    %% SMHD
    x = x(:);
    N = length(x);
    L = filterSize;

    %%%%%%%%% Initialize the fault signal period %%%%%%%%%
    if isempty(T)
        xxenvelope = abs(hilbert(x)) - mean(abs(hilbert(x)));
        [T, ~] = TT(xxenvelope, fs);
    end

    T = round(T);

    autoCorr = zeros(1, L);

    for k = 0:L - 1
        x2 = zeros(N, 1);
        x2(k + 1:end) = x(1:end - k);
        autoCorr(k + 1) = autoCorr(k + 1) + sum(x .* x2);
    end

    A = toeplitz(autoCorr);
    A_inv = inv(2 .* A);

    f = zeros(L, 1);
    y1 = zeros(size(x));
    kurtIter = [];
    hnr = [];
    deltah = [];
    deltak = [];

    % Initialize the filter coefficients
    f(round(L / 2)) = 1;
    f(round(L / 2) + 1) = -1;

    n = 1;
    %%%%%%%%% Iterate to solve the optimal filter coefficients %%%%%%%%%
    while n == 1 || (n <= termIter)
        y = filter(f, 1, x);
        kurtIter(n) = kurtosis(y);
        yenvelope = abs(hilbert(y)) - mean(abs(hilbert(y)));
        [~, hnr(n)] = TT(yenvelope, fs);
        y = y .* (1 - exp(-y.^2 / (2 * mu^2)));
        weightedCrossCorr = zeros(L, 1);

        for k = 0:L - 1
            x2 = zeros(N, 1);
            x3 = zeros(N, 1);
            x2(k + 1:end - T) = x(T + 1:end - k);
            x3(k + 1:end) = x(1:end - k);
            y1(1:end - T) = y(T + 1:end);
            weightedCrossCorr(k + 1) = weightedCrossCorr(k + 1) + ((sum(y .* x2) + sum(y1 .* x3)) .* sum(y.^2)) ./ sum(y .* y1);
        end

        f = A_inv * weightedCrossCorr;
        f = f / sqrt(sum(f.^2));

        n = n + 1;
        %%%%%%%%% Update the sparse threshold  %%%%%%%%%
        [~, temp_hnr] = TT(y, fs);
        deltah(n) = (temp_hnr - hnr(n - 1));
        deltak(n) = (kurtosis(filter(f, 1, x)) / kurtIter(n - 1));

        if deltak(n) > 1
            deltak(n) = 1 + 0.02 * (deltak(n) + 1) / deltak(n);
        else
            deltak(n) = 1 - 0.02 * (deltak(n) + 1) / deltak(n);
        end

        mu = mu * deltak(n);
        % update
        xyenvelope = abs(hilbert(y)) - mean(abs(hilbert(y)));
        [T, ~] = TT(xyenvelope, fs);

        %%%%%%%%%  Determine the maximum number of iterations  %%%%%%%%%
        if n == 2
            hnrmax = hnr(1);
        elseif hnr(n - 1) > hnrmax
            hnrmax = hnr(n - 1);
            y_final = y;
            f_final = f;
        end

    end

    disp(['The number of iteration is ', num2str(n - 1)])
    %%%%%%%%% Display the processed signal %%%%%%%%%
    if plotMode == 1
        figure
        plot((0:length(y_final) - 1) / fs, y_final, 'r')
        title('Filtered signal by SHMD')
        xlabel('Times[s]')
        ylabel('Amplitude[g]')
        set(gcf, 'position', [400, 400, 800, 400])
        legend(['Kurtosis=', num2str(kurtosis(y_final))])

        if n - 1 == termIter
            disp('Terminated for iteration condition.')
        else
            disp('Terminated for minimum change in kurtosis condition.')
        end

    end

end

function [T, HNR] = TT (y, fs)
    %find the maximum lag M
    M = fs;

    NA = xcorr(y, y, M, 'coeff');
    NA = NA(ceil(length(NA) / 2):end);

    % find first zero-crossing
    sample1 = NA(1);

    for lag = 2:length(NA)
        sample2 = NA(lag);

        if ((sample1 > 0) && (sample2 < 0))
            zeroposi = lag;
            break;
        elseif ((sample1 == 0) || (sample2 == 0))
            zeroposi = lag;
            break;
        else
            sample1 = sample2;
        end

    end

    % Cut from the first zero-crossing
    NA = NA(zeroposi:end);
    % Find the max position (time lag)
    % corresponding the max aside from the first zero-crossing
    [max_value, max_position] = max(NA);
    % Give the extimated period by autocorrelation
    T = zeroposi + max_position;
    % Calculate the harmonic energy
    HR = max_value;
    % Calculate the harmonic-to-noise ratio
    HNR = (HR / (1 - HR));

end

进而可以得到SMHD算法的仿真结果,通过在每个迭代步骤中使用稀疏因子,SMHD算法进一步抑制噪声,提高滤波信号的信噪比。

图片

图片

图片

 综上所述,稀疏最大谐波噪声比解卷积算法是一种强大的工具,它通过最大化HNR和利用信号的稀疏性,有效地从噪声中提取出微弱的故障特征,特别适用于故障诊断和信号处理领域。

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

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

相关文章

UE5肉鸽游戏教程学习

学习地址推荐&#xff1a;UE5肉鸽项目实战教程_哔哩哔哩_bilibili

从Full-Text Search全文检索到RAG检索增强

从Full-Text Search全文检索到RAG检索增强 时光飞逝&#xff0c;转眼间六年过去了&#xff0c;六年前铁蛋优化单表千万级数据查询性能的场景依然历历在目&#xff0c;铁蛋也从最开始做CRUD转行去了大数据平台开发&#xff0c;混迹包装开源的业务&#xff0c;机缘巧合下做了实时…

Jmeter的组件执行顺序

在 Apache JMeter 中&#xff0c;组件的加载和执行顺序遵循一定的规则&#xff0c;但有些组件在同一层级中可能会根据它们在测试计划中的位置来决定具体的执行顺序。以下是这些组件的大致加载和执行顺序&#xff0c;以及哪些组件属于同一层级&#xff1a; 线程组&#xff08;Th…

Flutter:启动屏逻辑处理02:启动页

启动屏启动之后&#xff0c;制作一个启动页面 新建splash&#xff1a;view 视图中只有一张图片sliding.png就是我们的启动图 import package:flutter/material.dart; import package:get/get.dart; import index.dart; class SplashPage extends GetView<SplashController…

分布式kettle调度平台v6.4.0新功能介绍

介绍 Kettle&#xff08;也称为Pentaho Data Integration&#xff09;是一款开源的ETL&#xff08;Extract, Transform, Load&#xff09;工具&#xff0c;由Pentaho&#xff08;现为Hitachi Vantara&#xff09;开发和维护。它提供了一套强大的数据集成和转换功能&#xff0c…

一个高度可扩展的 Golang ORM 库【GORM】

GORM 是一个功能强大的 Golang 对象关系映射&#xff08;ORM&#xff09;库&#xff0c;它提供了简洁的接口和全面的功能&#xff0c;帮助开发者更方便地操作数据库。 1. 完整的 ORM 功能 • 支持常见的关系模型&#xff1a; • Has One&#xff08;一对一&#xff09; • …

反向代理服务器的用途

代理服务器在网络中扮演着重要的角色&#xff0c;它们可以优化流量、保护服务器以及提高安全性。在代理服务器中&#xff0c;反向代理服务器是一种特殊类型&#xff0c;常用于Web服务器前&#xff0c;它具备多种功能&#xff0c;能够确保网络流量的顺畅传输。那么&#xff0c;让…

idea怎么打开两个窗口,运行两个项目

今天在开发项目的时候&#xff0c;前端希望运行一下以前的项目&#xff0c;于是就需要开两个 idea 窗口&#xff0c;运行两个项目 这里记录一下如何设置&#xff1a;首先依次点击&#xff1a; File -> Settings -> Appearance & Behavior ->System Settings 看到如…

2024亚太杯数学建模C题【Development Analyses and Strategies for Pet Industry 】思路详解

11.22日晚重磅更新&#xff01;&#xff1a;C题完整论文已出&#xff0c;代码及论文讲解视频&#xff1a; 2024APMCM亚太杯数学建模C题宠物行业原创论文及结果保姆级高质量教学&#xff01;_哔哩哔哩_bilibili C&#xff1a;宠物行业及相关产业的发展分析与战略 随着人们消费观…

SpringBoot(9)-Dubbo+Zookeeper

目录 一、了解分布式系统 二、RPC 三、Dubbo 四、SpringBootDubboZookeeper 4.1 框架搭建 4.2 实现RPC 一、了解分布式系统 分布式系统&#xff1a;由一组通过网络进行通信&#xff0c;为了完成共同的任务而协调工作的计算机节点组成的系统 二、RPC RPC&#xff1a;远程…

五种创建k8s的configMap的方式及configmap使用

configmap介绍 Kubernetes 提供了 ConfigMap 来管理应用配置数据&#xff0c;将配置信息从容器镜像中解耦&#xff0c;使应用更灵活、可移植。 1、基于一个目录来创建ConfigMap ​ 你可以使用 kubectl create configmap 基于同一目录中的多个文件创建 ConfigMap。 当你基于目…

(原创)Android Studio新老界面UI切换及老版本下载地址

前言 这两天下载了一个新版的Android Studio&#xff0c;发现整个界面都发生了很大改动&#xff1a; 新的界面的一些设置可参考一些博客&#xff1a; Android Studio新版UI常用设置 但是对于一些急着开发的小伙伴来说&#xff0c;没有时间去适应&#xff0c;那么怎么办呢&am…

贵州茅台[600519]行情数据接口

贵州茅台&#xff1a;实时行情 Restful API # 测试接口&#xff1a;可以复制到浏览器打开 https://tsanghi.com/api/fin/stock/XSHG/realtime?tokendemo&ticker600519获取股票实时行情&#xff08;开、高、低、收、量&#xff09;。 请求方式&#xff1a;GET。 Python示例…

MacOS系统上Jmeter 录制脚本遇到的证书坑位

一、JMeter介绍与安装 1&#xff0c;下载及安装 jmeter官网地址 二、录制百度链接https请求时&#xff0c;需要导入jmeter相关证书到macos系统的更目录中. 导入方式&#xff0c;直接拖入mac的系统中&#xff0c;始终新人就可以&#xff1b; 三、jmeter 创建相关的录制组件…

【ArcGISPro】Sentinel-2数据处理

错误 默认拉进去只组织了4个波段,但是实际有12个波段 解决方案 数据下载 Sentinel-2 数据下载-CSDN博客 数据处理 数据查看 创建镶嵌数据集 在数据管理工具箱中找到创建镶嵌数据集

音视频处理PCM相关概念:帧(Frame)、周期(Period Size)、量化、 声道数(Channels)、采样位数(Sample Bits)、采样频率

文章目录 引言I PCM相关图表原始模拟音频数据:模拟信息按照固定频率进行采样对采样后的数据选择合适精度进行量化PCM数据流II PCM相关概念采样频率:单位时间内对模拟信号的采样次数采样位数(Sample Bits)声道数(Channels)音频数据大小计算量化编码III 其他相关参数帧(Fra…

小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译

本文主要说android5 整体思路 android 5.1 twrp magisk Zygisk(Riru) Dreamland(xposed) Riru不支持android5.1, 因此只能选择Zygisk : 如果你正在使用 Android 5&#xff0c;你必须使用 Zygisk 因为 Riru 并不支持 Android 5. 基于magisk之上的xposed 其中提到的 作者…

React表单联动

Ant Design 1、dependencies Form.Item 可以通过 dependencies 属性&#xff0c;设置关联字段。当关联字段的值发生变化时&#xff0c;会触发校验与更新。 一种常见的场景&#xff1a;注册用户表单的“密码”与“确认密码”字段。“确认密码”校验依赖于“密码”字段&#x…

【AIGC】如何准确引导ChatGPT,实现精细化GPTs指令生成

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;准确引导ChatGPT创建爆款小红书文案GPTs指令案例&#x1f4af; 高效开发GPTs应用的核心原则明确应用场景和目标受众构建多样化风格模板提问与引…

Easyexcel(6-单元格合并)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09;Easyexcel&#xff08;5-自定义列宽&#xff09;Easyexcel&#xff08;6-单…