主要内容

MATLAB 中的包络检测

此示例说明如何实现两种常见的包络检测方法。一种方法是使用平方和低通滤波。另一种是使用希尔伯特变换。有关 Simulink™ 中的类似示例,请参阅Envelope Detection in Simulink

简介

信号包络等效于其轮廓,一个包络检测器会连接此信号中的所有峰值。包络检测在信号处理和通信领域有众多应用,其中之一是振幅调制 (AM) 检测。以下模块图显示使用这两种方法实现包络检测。

方法 1:平方和低通滤波

这种包络检测方法涉及对输入信号求平方并使其通过低通滤波器。对信号求平方通过将信号用作其自身的载波来有效解调输入,这意味着信号的一半能量推高到更高频率,另一半向 DC 下移。然后对此信号进行下采样以降低采样频率。如果信号没有任何可能导致混叠的高频,您可以进行下采样。否则您必须使用 FIR 抽取,它在对信号进行下采样之前应用低通滤波器。在此步骤后,使信号通过最小相位低通滤波器以消除高频能量,您将只剩下信号包络。

为了保持正确的幅值尺度,您必须执行两个额外的操作。首先,您必须将信号放大两倍。由于您只保留信号能量的下半部分,此增益使最终能量与其原始能量匹配。其次,您必须取信号的平方根,以反转因对信号求平方而产生的缩放失真。

这种包络检测方法易于实现,并且可以使用低阶滤波器执行,从而最大限度地减少输出的滞后。

方法 2:希尔伯特变换

这种包络检测方法涉及使用希尔伯特变换创建输入的解析信号。解析信号是复信号,其中实部是原始信号,虚部是原始信号的希尔伯特变换。

在数学上,信号 x(t) 的包络 e(t) 定义为解析信号的幅值,如下式所示。

e(t)=x(t)2+xˆ(t)2

其中 xˆ(t)x(t) 的希尔伯特变换。

您可以使用 32 点帕克斯-麦克莱伦 FIR 滤波器得到信号的希尔伯特变换。然后,要形成解析信号,您需要将信号的希尔伯特变换乘以 sqrt(-1)(虚数单位),并将其添加到具有时滞的原始信号中。延迟输入信号是必要的,因为由 FIR 滤波器实现的希尔伯特变换会引入等于滤波器长度一半的延迟。

通过取解析信号的绝对值来找到信号的包络。与原始信号相比,包络是低频信号。为了降低其采样频率、消除振铃效应并对包络进行平滑处理,您对此信号进行下采样,并使结果通过低通滤波器。

初始化

指定采样率、采样数、下采样因子和帧大小。

Fs = 22050;
numSamples = 10000;
DownsampleFactor = 15;
frameSize = 10*DownsampleFactor;

在处理循环中使用 System object 之前创建并初始化它们对于获得最优性能至关重要。创建一个正弦波 System object™ 并设置其属性以生成两个正弦波。一个正弦波作为消息信号,另一个正弦波作为载波信号以产生振幅调制。

sine = dsp.SineWave([0.4 1],[10 200], ...
    SamplesPerFrame=frameSize, ...
    SampleRate=Fs);

创建一个低通 FIR 滤波器,用于对平方信号进行滤波以检测其包络。

lp1 = dsp.FIRFilter(Numerator=firpm(20,[0 0.03 0.1 1],[1 1 0 0]));

创建三个数字滤波器 System object。第一个实现希尔伯特变换器,第二个补偿希尔伯特变换器引入的延迟,第三个是用于检测信号包络的低通滤波器。

N = 60; % Filter order
hilbertTransformer = dsp.FIRFilter( ...
        Numerator=firpm(N,[0.01 .95],[1 1],"hilbert"));
delay = dsp.Delay(Length=N/2);
lp2 = dsp.FIRFilter(Numerator=firpm(20,[0 0.03 0.1 1],[1 1 0 0]));

创建并配置两个时间示波器 System object 以绘制输入信号及其包络。

scope1 = timescope( ...
  Name="Envelope detection using Amplitude Modulation", ...
  SampleRate=[Fs,Fs/DownsampleFactor], ...
  TimeDisplayOffset=[(N/2+frameSize)/Fs,0], ...
  TimeSpan=0.45, ...
  YLimits=[-2.5 2.5]);
pos = scope1.Position;

scope2 = timescope( ...
  Name="Envelope detection using Hilbert Transform", ...
  Position=[pos(1)+pos(3),pos(2:4)], ...
  SampleRate=[Fs,Fs/DownsampleFactor], ...
  TimeDisplayOffset=[(N/2+frameSize)/Fs,0], ...
  TimeSpan=0.45, ...
  YLimits=[-2.5 2.5]);

流处理循环

创建处理循环以对输入信号执行包络检测。此循环使用您在前一部分中实例化的 System object。

for i = 1:numSamples/frameSize
    sig = sine();
    sig = (1 + sig(:,1)) .* sig(:, 2);      % Amplitude modulation

    % Envelope detector by squaring the signal and lowpass filtering
    sigsq = 2 * sig .* sig;
    sigenv1 = sqrt(lp1(downsample(sigsq,DownsampleFactor)));

    % Envelope detector using the Hilbert transform in the time domain
    sige = abs(complex(0, hilbertTransformer(sig)) + delay(sig));
    sigenv2 = lp2(downsample(sige,DownsampleFactor));

    % Plot the signals and envelopes
    scope1(sig,sigenv1);
    scope2(sig,sigenv2);
end
release(scope1);

release(scope2);

包络检测器结果

在绘图中,对于使用希尔伯特变换的包络检测方法,包络振幅与实际信号不匹配,因为您使用 FIR 滤波器实现的希尔伯特变换并不理想,其幅值响应并非对所有频率都等于 1。包络的形状仍与实际信号的包络匹配。

另请参阅

| |

主题