小波变换原理及matlab代码

一、什么是小波?

        小波是一种具有零均值的快速衰减的波浪状振荡,与扩展到无穷远的正弦波不同,小波存在的时间有限,小波有不同的大小和形状。下面是一些常见的示例,需要根据不同的应用领域来选择合适的小波。

         其中,缩放和平移是小波变换中的两个重要概念

        假如有一个信号f(t),缩放是指在时间上拉伸和收缩信号的过程,可以用下面的式子表示f(\frac{t}{s})s>0,其中s是尺度因子,他是一个正值,对应于信号在时间上的尺度,尺度因子与小波的频率成反比,尺度因子越大,小波就会被拉伸变长,那么小波的频率就会变小,反之,当尺度因子减小,小波就会被压缩,小波的频率就会变大;例如,将一个正弦波缩放2会导致其原始频率降低一半或一倍频程。所以对于小波,尺度和频率之间存在一个比例常数的倒数关系,其中这个比例常数被乘为小波的“中心频率”,小波的等效频率与中心频率之间存在下列关系:

F_{eq}=\frac{C_f}{s\Delta t}

其中,Feq为小波等效频率,Cf为中心频率,s为尺度因子,\Delta t是采样间隔。

 拉伸小波有助于捕获信号中缓慢变化的部分,而压缩小波有助于捕获信号中突变的部分。

平移是指沿着信号长度延迟或者提前小波的开始,可以表示为f(t-k),表示小波发生位移到t-k处,通常需要位移将小波与信号中寻找的特征对齐。

二、连续小波变换与离散小波变换

小波分析中两种主要的变换为连续小波变换和离散小波变换,这两种变换根据小波的缩放和位移有所不同。

(1)连续小波变换的主要应用场景是时频分析和时间局部化频率分量的过滤。

                                                              时频域分析

                                                  时间局部化频率分量的过滤

 可以使用此转换来获得信号的同步时频分析,而解析小波最适合于时频分析,因为这些小波(Morse Wavelets, Bump Wavelets, Analytic Morlet Wavelet)没有负的频率分量。连续小波变换输出的是系数,这些系数将用作对信号的尺度,频率和时间

 对于连续小波变换,可以在每两个整数尺度内以中间尺度分析信号,如下图

在2的1次尺度和2的2次尺度之间还可以有更多的尺度去分析(精细尺度分析),也即对应于将应用更多个不同频率的小波对信号进行分析,这个参数称为每倍频程的尺度数,每倍频程的长度数越大,尺度离散化越精细,这个参数的典型值有10,12,16,32,(即上图中指数项的分母)。

分析过程:每个缩放的小波沿信号的整个长度进行时间偏移,并与原始信号进行比较,对所有的尺度重复此过程,从而生成作为小波尺度和移位参数函数的系数。例如,一个包含1000个样本的信号用20格尺度分析会产生20000个系数,这样,可以使用连续小波变换更好的表征信号中的震荡行为。

连续小波变换可以在Matlab中可以用cwt函数进行;

No = 10;
Nv = 32;
figure
cwt(f,Fs,'NumOctaves',No,'VoicesPerOctave',Nv);
%f为信号,Fs为采样频率,No为倍频带数量,Nv为倍频带声音数量

(2)离散小波变换的主要应用是信号和图像的去噪和压缩。

                                                                             去噪

                                                                            压缩

离散小波变换有助于用较少的系数表示许多自然发生的信号和图像,这使得表示更为稀疏,离散小波变换的基本尺度设置为2,则尺度变换为2的指数形式2^{j},(j = 1,2,3,4...),而位移发生在前面等式的整数倍处为2^{j}m,(m=1,2,3,4...),这个过程通常被称为二元缩放和移位,这种方法消除了系数的冗余,变换的输出会生成与输入信号长度相等数量的系数,因此他需要更少的内存。

离散小波变换过程相当于将信号通过一个带通滤波器,如下图(S为信号)

下面是离散小波变换的基本过程:

  1. 选择小波函数:首先需要选择适当的小波函数作为变换的基函数。常用的小波函数有Daubechies小波、Haar小波、Symlet小波等。选择合适的小波函数决定了变换的性能。

  2. 信号分解:将待处理的信号分解成低频部分(近似系数)和高频部分(细节系数)。分解可以使用滤波器组来实现,其中一个滤波器用于提取低频部分,另一个滤波器用于提取高频部分。低频部分表示信号的平滑部分,而高频部分表示信号的细节或边缘信息。

  3. 重复分解:对于得到的低频部分(近似系数),可以再次进行分解(分解得到的系数数量是上一级的一半)得到更低频和更高频的子带。这个过程可以迭代多次,直到达到所需的频带分解层数。

  4. 重构:在完成信号分解后,可以通过逆过程对子带进行重构,以还原原始信号。重构过程使用逆滤波器组来进行,其中一个逆滤波器用于恢复低频部分,另一个逆滤波器用于恢复高频部分。

值得注意的是,离散小波变换是一种多尺度分析方法,可以提取信号的时间和频率特征,并具有良好的局部特性。通过选择不同的小波函数和分解层数,可以根据需求对信号进行不同精度的变换和重构。

离散小波的去噪过程大概为以下几步:

1.获得近似系数和细节系数。

2.分析细节并确定合适的阈值技术。

3.对细节系数进行阈值处理并重构信号。

对于非平稳信号,高频成分里面一般会包含噪声,但是注意有用的信号突变也会是高频成分,那么就需要使用阈值去计算高频成分里面的有用信号和噪声信号,Matlab提供四种计算阈值的方法和两种应用阈值的方法(软阈值和硬阈值:幅值小于阈值的系数都设为0,不同的是软阈值将大于阈值的系数减去阈值,而硬阈值处理则对于大于阈值的系数不做操作)。下面可以给出小波降噪的一段代码

level = 5;%小波分解级数
wname = 'sym6'; %指定小波
fd= wden(f,'rigrsure','s','sln',level,wname) ;
figure:
subplot(2,1,1);
plot(f);axis tignt; grid on;title('Noisy Signal') ;
subplot(2,1.2)
plot(fd); axis tight; grid on;
title(sprintf('Denoised Signal SNR: %0.2f dB',-20*1og10 (norm(abs(fO-fd) ) /norm(f0))));
%函数wden对输入信号进行多级分解,计算阈值并将其应用于细节系数,使用新的细节系数重构信号
%f是含噪信号
%'rigrsure'指定阈值技术
%'s'表示软阈值处理
%'sln'表示使用第一级的单个噪声估计值进行阈值重缩放

  • 10
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
f1=50; % 频率1 f2=100; % 频率2 fs=2*(f1+f2); % 采样频率 Ts=1/fs; % 采样间隔 N=120; % 采样点数 n=1:N; y=sin(2*pi*f1*n*Ts)+sin(2*pi*f2*n*Ts); % 正弦波混合 figure(1) plot(y); title('两个正弦信号') figure(2) stem(abs(fft(y))); title('两信号频谱') %% 2.小波滤波器谱分析 h=wfilters('db30','l'); % 低通 g=wfilters('db30','h'); % 高通 h=[h,zeros(1,N-length(h))]; % 补零(圆周卷积,且增大分辨率变于观察) g=[g,zeros(1,N-length(g))]; % 补零(圆周卷积,且增大分辨率变于观察) figure(3); stem(abs(fft(h))); title('低通滤波器图'); figure(4); stem(abs(fft(g))); title('高通滤波器图') %% 3.MALLET分解算法(圆周卷积的快速傅里叶变换实现) sig1=ifft(fft(y).*fft(h)); % 低通(低频分量) sig2=ifft(fft(y).*fft(g)); % 高通(高频分量) figure(5); % 信号图 subplot(2,1,1) plot(real(sig1)); title('分解信号1') subplot(2,1,2) plot(real(sig2)); title('分解信号2') figure(6); % 频谱图 subplot(2,1,1) stem(abs(fft(sig1))); title('分解信号1频谱') subplot(2,1,2) stem(abs(fft(sig2))); title('分解信号2频谱') %% 4.MALLET重构算法 sig1=dyaddown(sig1); % 2抽取 sig2=dyaddown(sig2); % 2抽取 sig1=dyadup(sig1); % 2插值 sig2=dyadup(sig2); % 2插值 sig1=sig1(1,[1:N]); % 去掉最后一个零 sig2=sig2(1,[1:N]); % 去掉最后一个零 hr=h(end:-1:1); % 重构低通 gr=g(end:-1:1); % 重构高通 hr=circshift(hr',1)'; % 位置调整圆周右移一位 gr=circshift(gr',1)'; % 位置调整圆周右移一位 sig1=ifft(fft(hr).*fft(sig1)); % 低频 sig2=ifft(fft(gr).*fft(sig2)); % 高频 sig=sig1+sig2; % 源信号 %% 5.比较 figure(7); subplot(2,1,1) plot(real(sig1)); title('重构低频信号'); subplot(2,1,2) plot(real(sig2)); title('重构高频信号'); figure(8); subplot(2,1,1) stem(abs(fft(sig1))); title('重构低频信号频谱'); subplot(2,1,2) stem(abs(fft(sig2))); title('重构高频信号频谱'); figure(9) plot(real(sig),'r','linewidth',2); hold on; plot(y); legend('重构信号','原始信号') title('重构信号与原始信号比较') f1=50; % 频率1 f2=100; % 频率2 fs=2*(f1+f2); % 采样频率 Ts=1/fs; % 采样间隔 N=120; % 采样点数 n=1:N; y=sin(2*pi*f1*n*Ts)+sin(2*pi*f2*n*Ts); % 正弦波混合 figure(1) plot(y); title('两个正弦信号') figure(2) stem(abs(fft(y))); title('两信号频谱') %% 2.小波滤波器谱分析 h=wfilters('db30','l'); % 低通 g=wfilters('db30','h'); % 高通 h=[h,zeros(1,N-length(h))]; % 补零(圆周卷积,且增大分辨率变于观察) g=[g,zeros(1,N-length(g))]; % 补零(圆周卷积,且增大分辨率变于观察) figure(3); stem(abs(fft(h))); title('低通滤波器图'); figure(4); stem(abs(fft(g))); title('高通滤波器图') %% 3.MALLET分解算法(圆周卷积的快速傅里叶变换实现) sig1=ifft(fft(y).*fft(h)); % 低通(低频分量) sig2=ifft(fft(y).*fft(g)); % 高通(高频分量) figure(5); % 信号图 subplot(2,1,1) plot(real(sig1)); title('分解信号1') subplot(2,1,2) plot(real(sig2)); title('分解信号2') figure(6); % 频谱图 subplot(2,1,1) stem(abs(fft(sig1))); title('分解信号1频谱') subplot(2,1,2) stem(abs(fft(sig2))); title('分解信号2频谱') %% 4.MALLET重构算法 sig1=dyaddown(sig1); % 2抽取 sig2=dyaddown(sig2); % 2抽取 sig1=dyadup(sig1); % 2插值 sig2=dyadup(sig2); % 2插值 sig1=sig1(1,[1:N]); % 去掉最后一个零 sig2=sig2(1,[1:N]); % 去掉最后一个零 hr=h(end:-1:1); % 重构低通 gr=g(end:-1:1); % 重构高通 hr=circshift(hr',1)'; % 位置调整圆周右移一位 gr=circshift(gr',1)'; % 位置调整圆周右移一位 sig1=ifft(fft(hr).*fft(sig1)); % 低频 sig2=ifft(fft(gr).*fft(sig2)); % 高频 sig=sig1+sig2; % 源信号 %% 5.比较 figure(7); subplot(2,1,1) plot(real(sig1)); title('重构低频信号'); subplot(2,1,2) plot(real(sig2)); title('重构高频信号'); figure(8); subplot(2,1,1) stem(abs(fft(sig1))); title('重构低频信号频谱'); subplot(2,1,2) stem(abs(fft(sig2))); title('重构高频信号频谱'); figure(9) plot(real(sig),'r','linewidth',2); hold on; plot(y); legend('重构信号','原始信号') title('重构信号与原始信号比较')
抱歉,我是一名语言模型,无法编写代码。但是,我可以为您提供LMS算法和小波变换的基本原理和流程。 LMS算法: LMS算法是一种自适应滤波算法,它的目标是通过对输入信号和期望输出信号之间的误差进行反馈控制,使滤波器的系数逐步调整,从而最小化误差。该算法的基本思想是:根据误差信号的大小和方向调整滤波器系数,使误差信号逐渐减小,从而达到滤波的目的。 小波变换小波变换是一种数学变换,它将信号分解成不同频率的小波分量,从而实现信号的压缩和去噪。小波变换是一种局部变换,它将信号分解成不同尺度的小波函数,从而可以精确地定位信号中的各种变化。 LMS算法与小波变换的结合: 将LMS算法与小波变换相结合,可以将小波变换的分解系数作为输入信号,然后对其进行自适应滤波。这样可以在保证信号特征不丢失的情况下,去除信号中的噪声和干扰。小波变换的多分辨率特性可以将信号分解成多个频率带,从而可以在不同的频率带上采用不同的自适应滤波器,提高滤波器的性能。 以下是LMS算法和小波变换的基本流程: 1. 初始化滤波器系数。 2. 将输入信号进行小波变换,得到小波分解系数。 3. 将小波分解系数作为输入信号,将期望输出信号与实际输出信号的误差作为反馈信号,通过LMS算法调整滤波器系数。 4. 将滤波器系数应用于小波分解系数,得到滤波后的小波分解系数。 5. 将滤波后的小波分解系数进行重构,得到滤波后的信号。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值