希尔伯特变换(matlab)

1.什么是Hilbert Transform

百度百科
维基百科 (需要梯子科学上网)

2.Analytic Signal of a Sequence 解析序列

clear; clc; close all;
% 生成一个序列,用希尔伯特分析信号
xr = [1 2 3 4];
x = hilbert(xr)

% 其虚部
x_im = imag(x)
% 其实部
x_re = real(x)

% 快速傅里叶变换
x_dft = fft(x)
xr_dft = fft(xr)
x =

   1.0000 + 1.0000i   2.0000 - 1.0000i   3.0000 - 1.0000i   4.0000 + 1.0000i


x_im =

     1    -1    -1     1


x_re =

     1     2     3     4


x_dft =

  10.0000 + 0.0000i  -4.0000 + 4.0000i  -2.0000 + 0.0000i   0.0000 + 0.0000i


xr_dft =

  10.0000 + 0.0000i  -2.0000 + 2.0000i  -2.0000 + 0.0000i  -2.0000 - 2.0000i

3.Analytic Signal and Hilbert Transform 解析信号和希尔伯特变换

% 希尔伯特函数为有限长数据找到精确的解析信号
% 也可以通过使用FIR希尔伯特变换滤波器来生成解析信号,以计算虚部的近似
% 生成一组频率为2037211001Hz的正弦序列
% 采样频率为10kHz,时长为1秒
clear; clc; close all;
fs = 1e4;
t = 0:1/fs:1; 

x = 2.5 + cos(2*pi*203*t) + sin(2*pi*721*t) + cos(2*pi*1001*t);

y = hilbert(x);

plot(t,real(y),t,imag(y))
xlim([0.01 0.03])
legend('real','imaginary')
title('hilbert Function')
xlabel('Time (s)')

% 计算原始序列和解析信号的Welch估计功率谱密度
% 窗长为256,无重叠部分的汉明窗
% 验证解析信号在负频率处没有功率
pwelch([x;y].',256,0,[],fs,'centered')  % help pwelch
legend('Original','hilbert')

% 设计一个60阶希尔伯特变换FIR滤波器,过渡带宽为400Hz
fo = 60;

d = designfilt('hilbertfir','FilterOrder',fo, ...
       'TransitionWidth',400,'SampleRate',fs); 

freqz(d,1024,fs)

% 对正弦序列进行滤波以逼近解析信号的虚部
hb = filter(d,x)

% FIR Filter
grd = fo/2;
   
y2 = x(1:end-grd) + 1j*hb(grd+1:end);
t2 = t(1:end-grd);

plot(t2,real(y2),t2,imag(y2))
xlim([0.01 0.03])
legend('real','imaginary')
title('FIR Filter')
xlabel('Time (s)')

% 估计近似解析信号的功率谱密度(PSD),并与希尔伯特结果进行比较
pwelch([y;[y2 zeros(1,grd)]].',256,0,[],fs,'centered')
legend('hilbert','FIR Filter')

请添加图片描述上图为解析信号x(t)的实部与虚部;
请添加图片描述计算原始序列和解析信号的Welch估计功率谱密度;解析信号频率大于0
在这里插入图片描述设计一个60阶希尔伯特变换FIR滤波器,过渡带宽为400Hz;
请添加图片描述对比前面的图,对正弦序列进行滤波也可以逼近解析信号的虚部;
请添加图片描述估计近似解析信号的功率谱密度(PSD),并与希尔伯特结果进行比较,与前图效果相差不大。

希尔伯特变换是一种信号处理技术,用于计算信号的解析信号。在MATLAB中,可以使用hilbert函数来进行希尔伯特变换。该函数有两种用法: 1. x = hilbert(xr):这种用法适用于处理实数数据序列xr。返回的解析信号x,其实部为xr本身,虚部为xr的希尔伯特变换。 2. x = hilbert(xr, n):这种用法使用n点快速傅里叶变换(FFT)来计算希尔伯特变换。输入数据会根据需要进行零填充或截断到长度n。虚部x是xr的希尔伯特变换,而实部x为xr本身。 以下是一个示例代码,展示如何使用hilbert函数计算信号的希尔伯特变换: ```MATLAB 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变换信号') ylim([-1,1]) ``` 请注意,上述示例代码给出了一个使用sin信号进行希尔伯特变换的例子。原始信号的希尔伯特变换将得到一个cos信号。 以下是您提到的几个相关问题: 相关问题: 1. 希尔伯特变换的作用是什么? 2. 除了MATLAB,还有哪些软件或编程语言可以进行希尔伯特变换? 3. 希尔伯特变换在哪些领域中被广泛应用? 4. 希尔伯特变换和傅里叶变换有什么区别?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq-120

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值