这必须是 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));