将时间序列转成图像——小波变换方法 Matlab实现

目录

1 方法

2 Matlab代码实现

3 结果


【若觉文章质量良好且有用,请别忘了点赞收藏加关注,这将是我继续分享的动力,万分感谢!】

其他:

1.时间序列转二维图像方法及其应用研究综述_vm-1215的博客-CSDN博客

2.将时间序列转成图像——短时傅里叶方法 Matlab实现_vm-1215的博客-CSDN博客

3.将时间序列转成图像——希尔伯特-黄变换方法 Matlab实现_vm-1215的博客-CSDN博客

1 方法

小波变换(Wavelet Transform, WT)是1984年由Morlet和Grossman提出的概念,该方法承袭了短时间窗变换的局部化思想,且克服了时间-窗口大小不变的缺陷,提供了一个窗口宽度可随频率变化而变宽变窄的时频窗,从而充分突出信号的某些特征。其基本思想是:先构造一个有限长或快速衰减的母小波,然后通过缩放和平移生成多个子小波,再叠加以匹配输入信号。将其缩放尺度和平移参数对应频率和时间参数,最终得到信号的时频图。

W_{f}(a, b)=<f, \psi_{a, b}>=\frac{1}{\sqrt{|a|}} \int_{-\infty}^{+\infty} f(t) \psi\left(\frac{t-b}{a}\right) d t

其中, \psi_{a, b}​ 为母小波函数(Morlet、Ricker 等), a​为尺度給数,b​为平移給数。 根据小波变换的定义, 给定时变信号f(t)​, 其编码步骤如下:

  1. 确定参数:信号长度f_{len}​, 采样频率sample_{rate}​, 母小波函数, 中心频率滑动步长cenfre_{step}​;
  2. 计算最大中心频率cenfre_{\max}=\frac{sample_{rate}}{2}​,设置当前中心频率cenfre_{now}=1​,初始化时频矩阵S​;
  3. 根据中心频率和小波函数,构造小波曲线,再与原信号卷积,得到当前频率的时间分布向量,更新时频矩阵;
  4. 判断当前中心频率是否大于最大中心频率,若是,输出时频矩阵S​;否则,更新当前频率cenfre_{now}=cenfre_{now}+cenfre_{step}​,然后跳回步骤2。

小波变换相较于短时傅里叶变换,具有较好的时频分辨率自适应能力,更能突出实际信号的局部特征,即高频处采用低频率分辨率和高时间分辨率,低频处采用高频率分辨率和低时间分辨率。因而,小波变换在信号处理、语音处理、图像处理等领域得到广泛应用。

2 Matlab代码实现

clear, close all

%% initialize parameters
samplerate=500; % in Hz

fstep=1;   % frequency step for wavelet

%% generate simulated signals with step changes in frequency
data = csvread('3_1_link6_28_5_30min.csv');     %  input the signal from the Excle

data = data';   % change the signal from column to row

N = length(data);   % calculate the length of the data

taxis = [1:N]/samplerate;   % time axis for whole data length

figure, 
plot(taxis,data),xlim([taxis(1) taxis(end)])
xlabel('Time (s)')

%% Time-frequency analysis (CWT, morlet wavelet)
spec = tfa_morlet(data, samplerate, 1, 250, fstep);
faxis=[1:fstep:250];
Mag=abs(spec);     % get spectrum magnitude

im = figure('color',[1 1 1]);
imagesc(taxis,faxis,Mag)   % plot spectrogram as an image
colorbar
axis([taxis(1) taxis(end) faxis(1) faxis(end)])
xlabel('Time (s)')
ylabel('Frequency (Hz)')
title('Time-frequency analysis (CWT)')

saveas(im,'CWT_1.bmp')

function TFmap = tfa_morlet(td, fs, fmin, fmax, fstep)
TFmap = [];
for fc=fmin:fstep:fmax
    MW = MorletWavelet(fc/fs);  % calculate the Morlet Wavelet by giving the central freqency
    cr = conv(td, MW, 'same');  % convolution
    
    TFmap = [TFmap; abs(cr)];
end

function MW = MorletWavelet(fc)

F_RATIO = 7;    % frequency ratio (number of cycles): fc/sigma_f, should be greater than 5
Zalpha2 = 3.3;  % value of Z_alpha/2, when alpha=0.001

sigma_f = fc/F_RATIO;
sigma_t = 1/(2*pi*sigma_f);
A = 1/sqrt(sigma_t*sqrt(pi));
max_t = ceil(Zalpha2 * sigma_t);

t = -max_t:max_t;

%MW = A * exp((-t.^2)/(2*sigma_t^2)) .* exp(2i*pi*fc*t);
v1 = 1/(-2*sigma_t^2);
v2 = 2i*pi*fc;
MW = A * exp(t.*(t.*v1+v2));

3 结果

【若觉文章质量良好且有用,请别忘了点赞收藏加关注,这将是我继续分享的动力,万分感谢!】​

  • 17
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
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('重构信号与原始信号比较')
Matlab实现小波变换,可以使用一维小波分析函数来进行操作。常用的函数有wavedec、waverec、appcoef和detcoef。 首先,使用wavedec函数进行小波分解,将信号进行分解为多个尺度的近似系数和细节系数。通过设置小波类型和分解层数,可以得到相应的近似系数和细节系数。 接下来,可以使用appcoef函数来提取某个尺度的近似系数,使用detcoef函数来提取某个尺度的细节系数。这些系数可以用于进一步的分析或处理。 最后,使用waverec函数进行小波重建,将近似系数和细节系数合并起来,得到重建后的信号。 下面是一个具体的例子,假设我们有一个名为sumsin的信号,可以按照以下步骤来实现小波变换: 1. 使用wavedec函数对sumsin进行小波分解,设置小波类型为'db2',分解层数为3。得到近似系数和细节系数。 2. 使用appcoef函数提取近似系数,传入分解得到的系数和层数。可以得到近似系数approx。 3. 使用detcoef函数提取细节系数,传入分解得到的系数和层数的向量[1,2,3]。可以得到三个层次的细节系数cd1、cd2和cd3。 4. 使用plot函数绘制近似系数和细节系数的图像,并分别设置标题。 5. 使用waverec函数进行小波重建,传入分解得到的系数和层次。可以得到重建后的信号x。 6. 使用plot函数绘制重建后的信号的图像。 这样就完成了在Matlab实现小波变换的过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MATLAB小波变换工具箱 Wavelet Toolbox 实际操作与训练](https://blog.csdn.net/qq_24598387/article/details/84977504)[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_2"}}] [.reference_item style="max-width: 50%"] - *3* [Matlab实现小波变换](https://blog.csdn.net/m0_52316372/article/details/129354486)[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_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vm-1215

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值