记录
1、小波变换
引用:形象易懂讲解算法I——小波变换 - 知乎 (zhihu.com)
2、小波包分解
小波与小波包、小波包分解与信号重构、小波包能量特征提取 暨 小波包分解后实现按频率大小分布重新排列(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、延拓方法
点对称延拓方法