Board logo

标题: Hilbert变换及谱分析 [打印本页]

作者: yuyang911220    时间: 2016-7-16 09:41     标题: Hilbert变换及谱分析

转自http://blog.sina.com.cn/s/blog_6163bdeb0102e1wv.html
                        Hilbert变换是一个很有用的变换,用它来做包络分析更是一种有效的数据处理方法。现用代码测试其变换效果
第一个程序效果如下


% 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)|')

第二个效果如下
第一个包络测试

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

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

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

% 包络分析(高中心频率的窄带信号分析)
% 基于:两个信号乘积的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)|')
作者: yuchengze    时间: 2016-8-19 22:03

很好的代码,不错




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0