• [转载]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)|')

  • 相关阅读:
    客户端配置文件tnsname.ora
    MVC3使用Area解耦项目
    系统中同时安装sql2005 和 sql2008 R2 提示要删除SQL Server 2005 Express
    sqlserver执行时间和自行效率
    sqlserver2008链接服务器中执行存储过程配置过程
    sqlserver中top 1 赋值的问题
    js跨域post请求
    uploadify 报http 302错误
    go 函数
    Node.js +Express+MongoDB+mogoose+ejs+bootstrap+jquery
  • 原文地址:https://www.cnblogs.com/gisalameda/p/12840524.html
Copyright © 2020-2023  润新知