信号处理-小波

记录

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博客

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信号处理中的小分解是一种常用的方法,用于将信号分解为不同频率的子信号。在Matlab中,可以使用Wavelet Toolbox来进行信号的小分解。以下是一个简单的示例代码,展示了如何使用Matlab进行信号处理的小分解: ```matlab % 加载信号 load('signal.mat'); % 假设信号保存在名为'signal.mat'的文件中 % 设置小分解参数 wavelet = 'db4'; % 选择小基函数,这里使用db4小 nLevels = 5; % 设置分解的层数 % 执行小分解 [c, l = wavedec(signal, nLevels, wavelet); % 提取各个频率分量 approximation = appcoef(c, l, wavelet, nLevels); % 近似分量 details = detcoef(c, l, nLevels); % 细节分量 % 可以根据需求对近似分量和细节分量进行进一步处理 % 重构信号 reconstructedSignal = waverec(c, l, wavelet); % 可以对重构的信号进行进一步的分析或处理 ``` 以上代码使用了`wavedec`函数进行小分解,将信号分解为不同频率的分量。`appcoef`函数提取近似分量,`detcoef`函数提取细节分量。最后,使用`waverec`函数对分解后的分量进行重构,得到重构的信号。你可以根据实际需求,对分解和重构后的信号进行进一步的分析或处理。详细的用法和更多示例可以参考提供的博客链接。<span class="em">1</span> #### 引用[.reference_title] - *1* [【Matlab代码】一维信号分解和重构实例演示.m](https://download.csdn.net/download/m0_70745318/85383518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值