zoukankan      html  css  js  c++  java
  • [转载]Hilbert变换及谱分析

    Hilbert变换是一个很有用的变换,用它来做包络分析更是一种有效的数据处理方法。现用代码测试其变换效果

    第一个程序效果如下

    image

    image

    % Hilbert变换测试
    clc
    clear all
    close all

    ts = 0.001;
    fs = 1/ts;
    N = 200;
    f = 50;
    k = 0:N-1;
    t = k*ts;

    % 信号变换
    % 结论:sin信号Hilbert变换后为cos信号
    y = sin(2*pi*f*t);
    yh = hilbert(y);    % matlab函数得到信号是合成的复信号
    yi = imag(yh);      % 虚部为书上定义的Hilbert变换

    figure
    subplot(211)
    plot(t, y)
    title('原始sin信号')
    subplot(212)
    plot(t, yi)
    title('Hilbert变换信号')

    % 检验两次Hilbert变换的结果(理论上为原信号的负值)
    % 结论:两次Hilbert变换的结果为原信号的负值
    yih = hilbert(yi);
    yii = imag(yih);
    max(y + yii)

    % 信号与其Hilbert变换的正交性
    % 结论:Hilbert变换后的信号与原信号正交
    sum(y.*yi)

    % 谱分析
    % 结论:Hilbert变换后合成的复信号的谱没有大于奈氏频率的频谱,即其谱为单边的
    NFFT = 2^nextpow2(N);
    f = fs*linspace(0,1,NFFT);
    Y = fft(y, NFFT)/N;
    YH = fft(yh, NFFT)/N;

    figure
    subplot(211)
    plot(f,abs(Y))
    title('原信号的双边谱')
    xlabel('频率f (Hz)')
    ylabel('|Y(f)|')
    subplot(212)
    plot(f,abs(YH))
    title('信号Hilbert变换后组成的复信号的双边谱')
    xlabel('频率f (Hz)')
    ylabel('|YH(f)|')

     

    第二个效果如下

    第一个包络测试

    image

    可以看到,此包络分析得到的包络信号频率为20Hz,包络信号的波形为余弦信号的绝对值信号,这是因为计算包络时是取绝对值得到的,从而使信号频率加倍。解决方法是把包络提升,远离0,如下第二个包络。

    第二个包络测试

    image

    可以看到Hilbert包络分析可以有效提取包络和调制信号频率,和检波有一样的效果,而且更实用。

    第三个包络测试

    image

    这是尝试一个任意形状的包络,可以看到除在边缘处有误差外,整体效果很好。

     

    % 包络分析(高中心频率的窄带信号分析)
    % 基于:两个信号乘积的Hilbert变换取决于高频信号的Hilbert变换
    clc
    clear all
    close all

    ts = 0.001;
    fs = 1/ts;
    N = 200;
    k = 0:N-1;
    t = k*ts;

    % 原始信号
    f1 = 10;
    f2 = 70;
    % a = cos(2*pi*f1*t);       % 包络1
    a = 2 + cos(2*pi*f1*t);     % 包络2
    % a = 1./(1+t.^2*50);       % 包络3
    m = sin(2*pi*f2*t);         % 调制信号
    y = a.*m;  % 信号调制

    figure
    subplot(241)
    plot(t, a)
    title('包络')
    subplot(242)
    plot(t, m)
    title('调制信号')
    subplot(243)
    plot(t, y)
    title('调制结果')

    % 包络分析
    % 结论:Hilbert变换可以有效提取包络、高频调制信号的频率等
    yh = hilbert(y);
    aabs = abs(yh);                 % 包络的绝对值
    aangle = unwrap(angle(yh));     % 包络的相位
    af = diff(aangle)/2/pi;         % 包络的瞬时频率,差分代替微分计算

    % NFFT = 2^nextpow2(N);
    NFFT = 2^nextpow2(1024*4);      % 改善栅栏效应
    f = fs*linspace(0,1,NFFT);

    YH = fft(yh, NFFT)/N;           % Hilbert变换复信号的频谱
    A = fft(aabs, NFFT)/N;          % 包络的频谱

    subplot(245)
    plot(t, aabs, t, a, '.')
    title('包络的绝对值')
    legend('包络分析结果', '真实包络')
    subplot(246)
    plot(t, aangle)
    title('调制信号的相位')
    subplot(247)
    plot(t(1:end-1), af*fs)
    title('调制信号的瞬时频率')
    subplot(244)
    plot(f,abs(YH))
    title('原始信号的Hilbert谱')
    xlabel('频率f (Hz)')
    ylabel('|YH(f)|')
    subplot(248)
    plot(f,abs(A))
    title('包络的频谱')
    xlabel('频率f (Hz)')
    ylabel('|A(f)|')

  • 相关阅读:
    基于Python的人脸动漫转换
    let 与 var的区别
    【LeetCode】汇总
    【HDU】4632 Palindrome subsequence(回文子串的个数)
    【算法】均匀的生成圆内的随机点
    【LeetCode】725. Split Linked List in Parts
    【LeetCode】445. Add Two Numbers II
    【LeetCode】437. Path Sum III
    【LeetCode】222. Count Complete Tree Nodes
    【LeetCode】124. Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/gisalameda/p/12840524.html
Copyright © 2011-2022 走看看