MATLAB 中的包络检测
此示例说明如何实现两种常见的包络检测方法。一种方法是使用平方和低通滤波。另一种是使用希尔伯特变换。有关 Simulink™ 中的类似示例,请参阅Envelope Detection in Simulink。
简介
信号包络等效于其轮廓,一个包络检测器会连接此信号中的所有峰值。包络检测在信号处理和通信领域有众多应用,其中之一是振幅调制 (AM) 检测。以下模块图显示使用这两种方法实现包络检测。

方法 1:平方和低通滤波
这种包络检测方法涉及对输入信号求平方并使其通过低通滤波器。对信号求平方通过将信号用作其自身的载波来有效解调输入,这意味着信号的一半能量推高到更高频率,另一半向 DC 下移。然后对此信号进行下采样以降低采样频率。如果信号没有任何可能导致混叠的高频,您可以进行下采样。否则您必须使用 FIR 抽取,它在对信号进行下采样之前应用低通滤波器。在此步骤后,使信号通过最小相位低通滤波器以消除高频能量,您将只剩下信号包络。
为了保持正确的幅值尺度,您必须执行两个额外的操作。首先,您必须将信号放大两倍。由于您只保留信号能量的下半部分,此增益使最终能量与其原始能量匹配。其次,您必须取信号的平方根,以反转因对信号求平方而产生的缩放失真。
这种包络检测方法易于实现,并且可以使用低阶滤波器执行,从而最大限度地减少输出的滞后。
方法 2:希尔伯特变换
这种包络检测方法涉及使用希尔伯特变换创建输入的解析信号。解析信号是复信号,其中实部是原始信号,虚部是原始信号的希尔伯特变换。
在数学上,信号 x(t) 的包络 e(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。包络的形状仍与实际信号的包络匹配。
另请参阅
dsp.SineWave | dsp.FIRFilter | timescope