Matlab的信封rms实现

信息处理 matlab 信封
2022-02-23 08:22:03

我正在尝试通过 Matlab 实现移动 RMS。

x = randn(50, 1);
xRMS = sqrt(movmean(x.^2, 21));
xRMSref = envelope(x, 21, 'rms');
plot(xRMSref,'DisplayName','xRMSref');hold on;plot(xRMS,'DisplayName','xRMS');hold off;
legend()

为什么我的估计与 Matlab 的不同?

在此处输入图像描述

1个回答

这是因为envelope在计算标准偏差之前将信号居中,然后对平均值进行校正。试试这个:

x = randn(50, 1);
xRMS = sqrt(movmean(x.^2, 21));
xRMS_centered = sqrt(movmean((x-mean(x)).^2, 21)) + mean(x);
xRMSref = envelope(x, 21, 'rms');
plot(xRMSref,'x-','DisplayName','xRMSref');hold on;plot(xRMS,'o-','DisplayName','xRMS');plot(xRMS_centered,'s-','DisplayName','xRMS centered');hold off;
legend()

*编辑:因为你问为什么信封会这样:我认为这是因为它试图返回信号的包络它实际上带有两个输出参数,一个下包络线和一个上包络线,其想法是信号应该介于两者之间。显然,如果这是我们想要的,我们需要考虑均值。请参见下图中的示例:

包络函数示例

如果您不居中,则不会相应地捕获平均值周围的局部变化。