使用matlab希尔伯特函数进行包络检测

信息处理 matlab 过滤器 信号分析 希尔伯特变换
2022-02-22 23:34:31

我正在尝试使用 Matlab Hilbert 函数检测高频信号的包络(类似于下面)

在此处输入图像描述

这是我的输出

在此处输入图像描述

它通常遵循包络,但包络中有高频纹波,请参见下面的放大版本

在此处输入图像描述

这是我的代码:

t =out.tout';
x =out.Itxmod';
y = hilbert(x);
env = abs(y);
figure;
plot_param = {'Color', [0.6 0.1 0.2],'Linewidth',2};
plot(t,x)
hold on
plot(t,[-1;1]*env,plot_param{:})
hold off
xlim([0.001 0.002])
title('Hilbert Envelope')

问题:如何在没有这种高频纹波的情况下获得平滑的包络信号?

1个回答

这必须是 OP 生成波形的方式中的伪影(未提供所有这些细节),因为我使用 Matlab 中的函数得到了不同的结果,如下所述hilbert(要清楚的是不是希尔伯特变换,而是解析信号它由信号加上作为虚项的希尔伯特变换组成)。一般来说,这里有三个获得信封的建议:

方法 1:使用 FFT 确定解析信号:取原始信号的 FFT,将所有负频率设置为零(FFT 的上半部分),并将正频率加倍,使 bin 0 (DC) 保持原样(并且作为Overlord 在评论中指出,当 FFT 长度为偶数IFFT 将是分析信号,取该信号的绝对值将是所需的包络。(正如@aconcernedcitizen 在评论中指出的那样,这是 Octave 使用信号包中的函数专门实现的方法,我也假设使用 MATLAB。)N/2Nhilbert

方法 2:使用正交相位跟踪滤波器确定分析信号,其中滤波器长度与纹波可以进行交易。

方法 3:使用传统的 AM 解调器,将调制信号与相干载波相乘,然后对结果进行低通滤波。

方法 1 的演示如下所示,这是 OP 案例的合适解决方案:

信号和包络

放大信号的开始显示失真仅限于启动条件和之后的平滑包络。

放大

Matlab 代码如下:

OP 没有提供有关如何生成波形的完整详细信息。我通过执行以下操作通过观察图来复制它:

fs = 1e6; 
T = 2e-3; 
N = round(fs * T);
t = [0:N-1]*1/fs;
carrier = cos(2*pi*100e3*t); 
modulation = cos(2*pi*10e3*t);
sig = 8 * carrier .* (1 - 0.025 * modulation);

方法1的结果如下:

N = length(sig);
sig_spectrum = fft(sig);
hilbert_spectrum = zeros(1, N);
hilbert_spectrum(1) = sig_spectrum(1);
hilbert_spectrum(2: ceil(N/2) - 1) = 2 * sig_spectrum(2:ceil(N/2) - 1);
if mod(N, 2) == 0
  hilbert_spectrum(N/2) = sig_spectrum(N/2);
endif
hilbert_time = ifft(hilbert_spectrum);
envelope = abs(hilbert_time);

我随后确认hilbert函数的大小会产生相同的结果:

envelope2 = abs(hilbert(sig));