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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hilbert边际代码是一种用于信号处理的算法,主要用于提取信号的边际特征。这种算法基于Hilbert变换和矩阵乘法,可以快速地计算出信号的边际,并将其用于特征提取和分类。 具体而言,Hilbert边际代码包含了一系列的函数和子程序,其中包括Hilbert变换、矩阵乘法、傅里叶变换、滤波等基本操作。首先,程序会对输入信号进行预处理,包括去除DC分量、低通滤波和上采样等操作,以获得更好的可处理信号。然后,程序将信号进行Hilbert变换,并计算出其瞬时频率和瞬时幅度,并进一步计算出边际特征。 在应用中,Hilbert边际代码可以用于多种信号处理任务,包括语音识别、图像处理、医学信号分析等领域。其优点在于具有较高的计算速度和较好的特征提取能力,可以有效地提高信号处理的准确性和效率。 总之,Hilbert边际代码是一种重要的信号处理算法,可以用于各种领域的信号特征提取和分类。 ### 回答2: Hilbert边际是一种信号处理方法,常用于分析非定常信号。其基本思想是将信号分解为希尔伯特函数和小波分量,然后对这些分量进行能量分析,最终得到希尔伯特边际Hilbert边际的实现可以通过编写代码来完成。该代码通常涉及Matlab或Python等编程语言。代码通常包括引入相关的库和函数,读取需要进行Hilbert边际分析的信号,进行分解和分析,最终输出希尔伯特边际。为了能够更好地操作和使用该代码,需要具备一定的信号处理和编程基础。 总之,Hilbert边际代码是一种实现希尔伯特边际分析的具体方法和技术,是进行多尺度信号分析和处理的重要工具。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值