信号处理-小波

本文详细介绍了小波变换的各种类型,如小波包分解、连续与离散小波变换,以及经验小波变换中的希尔伯特变换和包络计算。还探讨了傅里叶变换与逆变换,并涉及信号处理中的点对称延拓方法。通过实例代码展示了如何在Matlab和Python中实现这些技术。
摘要由CSDN通过智能技术生成

记录

1、小波变换

引用:形象易懂讲解算法I——小波变换 - 知乎 (zhihu.com)

2、小波包分解

小波包分解、重构、去噪与matlab函数使用-CSDN博客

小波与小波包、小波包分解与信号重构、小波包能量特征提取 暨 小波包分解后实现按频率大小分布重新排列(Matlab 程序详解)_小波与小波包的区别-CSDN博客

上边两个组合理解小波包分解

2.1、小波包变换:

3、连续小波变换 CWT

4、离散小波变换

引用:python小波变换3-代码实现(pywt库,cwt-2D/3D时频图绘制,dwt-信号分解及重建)_菜鸟提刑官的博客-CSDN博客

5、经验小波变换

经验小波变换(EWT)理论基础_cofisher的博客-CSDN博客

5.1、用求包络谱

用希尔伯特求包络:

clear all; clc; close all;

n=-5000:20:5000;            % 样点设置
% 程序第一部分:直接做做希尔伯特变换
N=length(n);                % 信号样点数
nt=0:N-1;                   % 设置样点序列号
x=120+96*exp(-(n/1500).^2).*cos(2*pi*n/600); % 设置信号
Hx=hilbert(x);              % 希尔伯特变换
% 作图
plot(nt,x,'k',nt,abs(Hx),'r');
grid; legend('信号','包络');
xlabel('样点'); ylabel('幅值')
title('信号和包络')
set(gcf,'color','w');

原因是由于直流分量的影响,早生了包络的不理想,下面对信号进行去直流分量的处理,再进行希尔伯特变换。代码如下所示

clear all; clc; close all;
n=-5000:20:5000;            % 样点设置
% 程序第一部分:直接做做希尔伯特变换
N=length(n);                % 信号样点数
nt=0:N-1;                   % 设置样点序列号
x=120+96*exp(-(n/1500).^2).*cos(2*pi*n/600); % 设置信号
y=detrend(x);                    % 消除直流分量
Hy=hilbert(y);              % 希尔伯特变换
plot(nt,y,'k',nt,abs(Hy),'r');
grid; legend('信号','包络');
xlabel('样点'); ylabel('幅值')
title('信号和包络')
set(gcf,'color','w');

去直流画出包络后,还要再加上直流分量:

clear all; clc; close all;
n=-5000:20:5000;            % 样点设置
% 程序第一部分:直接做做希尔伯特变换
N=length(n);                % 信号样点数
nt=0:N-1;                   % 设置样点序列号
x=120+96*exp(-(n/1500).^2).*cos(2*pi*n/600); % 设置信号
y=detrend(x);                    % 消除直流分量
Hy=hilbert(y);              % 希尔伯特变换
plot(nt,x,'k',nt,abs(Hy)+120,'g');
grid; legend('信号','包络'); hold on;
xlabel('样点'); ylabel('幅值')
title('信号和包络')
set(gcf,'color','w');

用极大值极小值方法计算信号的包络

clear all; clc; close all;
xx=load('pulsedata0.txt');   % 读入信号
N=length(xx);                % 数据长度
n=1:N;                       % 设置样点序列
% 作图
plot(n,xx,'k'); grid;
xlabel('样点'); ylabel('幅值');
title('原始信号波形图')
set(gcf,'color','w');
% 程序第一部分用hilbert计算信号的包络
x=detrend(xx)
z=hilbert(x);                % 进行希尔伯特变换
plot(n,x,'k'); hold on; grid;
plot(n,abs(z),'r');
xlabel('样点'); ylabel('幅值');
title('消除直流分量用求取包络曲线图')
set(gcf,'color','w');

可以看到虽然已经去掉了直流分量,但包络曲线并不理想

此时可采用找极大值和极小值的方法来取上下包络线,利用v_findpeaks函数。代码如下:

clear all; clc; close all;
xx=load('pulsedata0.txt');   % 读入信号
N=length(xx);                % 数据长度
n=1:N;                       % 设置样点序列
x=detrend(xx)
[K1,V1]=v_findpeaks(x,'q',120); % 求极大值位置和幅值
up=spline(K1,V1,n);          % 内插,获取上包络曲线
[K2,V2]=v_findpeaks(x,'v',120);% 求极小值位置和幅值
down=spline(K2,V2,n);        % 内插,获取下包络曲线
plot(n,x,'k'); hold on; grid;
plot(n,up,'r');
plot(n,down,'r');
xlabel('样点'); ylabel('幅值');
title('用求取极大极小值方法获取包络曲线图')
set(gcf,'color','w');

5.2、

envelope函数:

clear all; clc; close all;
n=-5000:20:5000;            % 样点设置
N=length(n);                % 信号样点数
nt=0:N-1;                   % 设置样点序列号
x=120+96*exp(-(n/1500).^2).*cos(2*pi*n/600); % 设置信号
[up,down] = envelope(n,x,'pchip');
% 作图
plot(nt,x,'k',nt,up,'r',nt,down,'g');
xlabel('样点'); ylabel('幅值'); grid;
title('调用envelope函数求取上下包络曲线图')
set(gcf,'color','w');

5.2、傅里叶变换与逆变换

代码:

Fs = 8; % 采样频率
Ts = 1 / Fs; % 采样时间间隔
L = 32; % length of signal
t = (0 : (L - 1)) * Ts; % discrete time
x = 2 + 3 * cos(2 * pi * 1 * t - 30 * pi / 180); % original signal

N = 2 ^ nextpow2(L); % 采样点数
X = fft(x, N); 
f = Fs / N * (0 : (N - 1)); % 频率
x_hat = ifft(X, N);
subplot(311)
stem(t, x);
title('original signal'),xlabel('time'),ylabel('amplitude')

subplot(312)
X(1) = X(1) / 2;
stem(f, abs(X / N * 2));
title('amplitude spectrum'),xlabel('frequency'),ylabel('amplitude')

subplot(313)
stem(t, x_hat);
title('recovered signal'),xlabel('time'),ylabel('amplitude')

5.3、延拓方法

点对称延拓方法

小波变换之点对称边界延拓(Symmetric boundary extension)_小波分析 边界延拓-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值