zoukankan      html  css  js  c++  java
  • 小波变换

    实信号小波变换

    转载自http://blog.sina.com.cn/s/blog_6163bdeb0102e219.html

    转自:http://blog.21ic.com/user1/5396/archives/2009/57134.html,稍作修改,方便理解。

    一、绘制原理:

    1.需要用到的小波工具箱中的三个函数cwt(),centfrq(),scal2frq()

    COEFS = cwt(S,SCALES,'wname')

    该函数实现连续小波变换,其中S为输入信号,SCALES为尺度,wname为小波名称。

    FREQ = centfrq('wname')

    该函数求以wname命名的母小波的中心频率。

    F = scal2frq(A,'wname',DELTA)

    该函数能将尺度转换为实际频率,其中A为尺度,wname为小波名称,DELTA为采样周期。

    2.尺度与频率之间的关系

    设a为尺度,fs为采样频率,Fc为小波中心频率,则a对应的实际频率Fa为

    Fa=Fc*fs/a

    显然,根据采样定理,为使小波尺度图的频率范围为(0,fs/2),尺度范围应为(2*Fc,inf),其中inf表示为无穷大。在实际应用中,只需取尺度足够大即可。

    3.尺度序列的确定

    由上式可以看出,为使转换后的频率序列是一等差序列,尺度序列必须取为以下形式:

    c/totalscal, c/(totalscal-1), ...,c/2,c

    其中,totalscal是对信号进行小波变换时所用尺度序列的长度(通常需要预先设定好),c为一常数。

    而尺度c/totalscal所对应的实际频率应为fs/2,于是可得

    c=2*Fc*totalscal

    于是可得到所需的尺度序列。

    4.时频图的绘制

    确定了小波基和尺度后,就可以用cwt求小波系数coefs(系数是复数时要取模),然后用scal2frq将尺度序列转换为实际频率序列f,最后结合时间序列t,用imagesc(t,f,abs(coefs))便能画出小波时频图。

    二、应用例子

    下面给出一实际例子来说明小波时频图的绘制。所取仿真信号是由频率分别为50Hz和100Hz的两个正弦分量所合成的信号。

    % 小波时频分析

    clc

    clear all

    close all

    % 原始信号

    fs=1000;

    f1=50;

    f2=100;

    t=0:1/fs:1;

    s=sin(2*pi*f1*t)+sin(2*pi*f2*t);

    figure

    plot(t, s)

    % 连续小波变换

    wavename='cmor3-3';

    totalscal=256;

    Fc=centfrq(wavename); % 小波的中心频率

    c=2*Fc*totalscal;

    scals=c./(1:totalscal);

    f=scal2frq(scals,wavename,1/fs); % 将尺度转换为频率

    coefs=cwt(s,scals,wavename); % 求连续小波系数

    figure

    imagesc(t,f,abs(coefs));

    set(gca,'YDir','normal')

    colorbar;

    xlabel('时间 t/s');

    ylabel('频率 f/Hz');

    title('小波时频图');

    image

    image

    说明:

    在这个例子中,最好选用复的morlet小波,其它小波的分析效果不好,而且morlet小波的带宽参数和中心频率取得越大,时频图上反映的时频聚集性越好。

    与其他时频分析对比,如短时傅里叶变换时频图

    image

    小结:

    image

    image

    image

    image

    高频时小波效果好,因为小波在高频处分辨率可以自动调整,分辨率高。

    代码:

    % 时频分析

    clc

    clear all

    close all

    % 原始信号

    fs=1000;

    f1=50;

    f2=100;

    t=0:1/fs:1;

    s = sin(2*pi*f1*t)+sin(2*pi*f2*t);%+randn(1, length(t));

    % s = chirp(t,20,0.3,300);

    s = chirp(t,20,1,500,'q');

    figure

    plot(t, s)

    % 连续小波变换时频图

    wavename='cmor3-3';

    totalscal=256;

    Fc=centfrq(wavename); % 小波的中心频率

    c=2*Fc*totalscal;

    scals=c./(1:totalscal);

    f=scal2frq(scals,wavename,1/fs); % 将尺度转换为频率

    coefs=cwt(s,scals,wavename); % 求连续小波系数

    figure

    imagesc(t,f,abs(coefs));

    set(gca,'YDir','normal')

    colorbar;

    xlabel('时间 t/s');

    ylabel('频率 f/Hz');

    title('小波时频图');

    % 短时傅里叶变换时频图

    figure

    spectrogram(s,256,250,256,fs);

    % 时频分析工具箱里的短时傅里叶变换

    f = 0:fs/2;

    tfr = tfrstft(s');

    tfr = tfr(1:floor(length(s)/2), :);

    figure

    imagesc(t, f, abs(tfr));

    set(gca,'YDir','normal')

    colorbar;

    xlabel('时间 t/s');

    ylabel('频率 f/Hz');

    title('短时傅里叶变换时频图');

  • 相关阅读:
    js循环添加事件
    [Swift]LeetCode1085. 最小元素各数位之和 | Sum of Digits in the Minimum Number
    [Swift]LeetCode1089. 复写零 | Duplicate Zeros
    [Swift]冒泡排序 | Bubble sort
    [Algorithm]巧用多项式系数与进制的联系
    [Swift]LeetCode1081. 不同字符的最小子序列 | Smallest Subsequence of Distinct Characters
    [Swift]LeetCode1080. 根到叶路径上的不足节点 | Insufficient Nodes in Root to Leaf Paths
    [Swift]LeetCode1079. 活字印刷 | Letter Tile Possibilities
    [Swift]LeetCode1078. Bigram 分词 | Occurrences After Bigram
    [Swift]快速反向平方根 | Fast inverse square root
  • 原文地址:https://www.cnblogs.com/xiaoxuesheng993/p/8728739.html
Copyright © 2011-2022 走看看