首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在MATLAB中求取上、下包络的信号

在MATLAB中求取上、下包络的信号
EN

Stack Overflow用户
提问于 2016-07-11 07:37:11
回答 2查看 1.3K关注 0票数 2

我有一个信号会在一些值附近回弹。如下图所示,我想将从上到下的信号封装起来:

如果信号只增加或减少,则使用运行中的maxima脚本工作得很好:

代码语言:javascript
运行
复制
function [out] = rMax(X)
    Y=X;
    maximum=X(1);
    for k=1:length(X)
        if X(k)<=maximum
        Y(k)=maximum;
        else
            maximum=X(k);
        end
    end
    out=Y;
end

然而,当信号交替时,我不能再使用该方法了。是否有办法在MATLAB或Mathematica中实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-12 12:37:24

您可以结合使用movmaxmovmin以及适当的窗口大小( n1 > n2 ),这取决于您的需要。这两个功能是在R2016a中引入的。看一看我的答案的底部,一个自我书写的替代者,在R2016a之前起作用。

要获得上界,可以使用:

代码语言:javascript
运行
复制
xMax = movmax(x,[n1,n1]);
xMax = movmin(xMax,[n2,n2]);

对于下界,只需切换movminmovmax

代码语言:javascript
运行
复制
xMin = movmin(x,[n1,n1]);
xMin = movmax(xMin,[n2,n2]);

结果如下所示:

如果选择n2=n1,则当数据x中有峰值时,边界非常紧。如果您通过使n2小于n1来选择更大的差异,您将在峰值处得到一条较长的直线。一个副作用是,当信号从1跳到-1时,边界开始偏移,反之亦然。如果选择的n1太高,大约100左右的信号的一小部分将不会被提取。

以下是生成上述图形的完整代码,其中包含一些与您问题中的图相匹配的示例数据。只需使用n1n2值来查看它们的效果。

代码语言:javascript
运行
复制
n1 = 20;        % for first window
n2 = 18;        % for second window

% generate sample data
t = 20:0.1:220;
x = -ones(size(t));
x(t>60&t<100) = 1;
x(t>105&t<135) = 1;
x(t>145&t<155) = 1;
x = x + 0.4*randn(size(x));

% get upper bounds
xMax = movmax(x,[n1,n1]);
xMax = movmin(xMax,[n2,n2]);

% get lower bounds
xMin = movmin(x,[n1,n1]);
xMin = movmax(xMin,[n2,n2]);

% draw figure for illustration
figure; hold on;
plot(t,x);
xlim([20,220]);
ylim([-3,3]);
plot(t,xMax,'r','LineWidth',1.1);
plot(t,xMin,'Color',[0,0.5,0],'LineWidth',1.1);

在R2016a之前

为了使movminmovmax在R2016a之前的版本中具有基本的功能,我们可以实现自己的功能。因此,我们需要应用一个移动-最小(或移动-最大值分别),可以很容易地实现。为了与R2016a中的函数保持兼容性,我们将实现第二个参数是标量和两个元素的向量的情况。这涵盖了与看到的这里类似的语法,但x需要成为向量。

代码语言:javascript
运行
复制
y = movingmax(x,k)
y = movingmax(x,[kb kf])

下面是取代movingmaxmovmax代码

代码语言:javascript
运行
复制
function y = movingmax(x,n)
if length(n) > 1
    a=n(1); b=n(2);
else
    b=floor((n-1)/2); a=b+mod(n-1,2);
end
s = size(x);
xp = [ones(a,1)*x(1);x(:);ones(b,1)*x(end)];
y = zeros(size(x));
for k = 1:length(x)
    y(k) = max(xp(k:k+a+b));
end
y = reshape(y,s);

下面是取代movingminmovmin代码

代码语言:javascript
运行
复制
function y = movingmin(x,n)
if length(n) > 1
    a=n(1); b=n(2);
else
    b=floor((n-1)/2); a=b+mod(n-1,2);
end
s = size(x);
xp = [ones(a,1)*x(1);x(:);ones(b,1)*x(end)];
y = zeros(size(x));
for k = 1:length(x)
    y(k) = min(xp(k:k+a+b));
end
y = reshape(y,s);
票数 4
EN

Stack Overflow用户

发布于 2016-07-12 23:49:15

我在运行的maxima/minima函数中添加了第二个条件

代码语言:javascript
运行
复制
function [out] =rMin(X)

Y=X;

minimum=X(1);

for k=2:length(X)

    if X(k)>=minimum
        Y(k)=minimum;
    else
        minimum=X(k);
    end

    if X(k)>=(Y(k-1)+3)
        minimum=X(k);
        Y(k)=minimum; 
    end
end 

out=Y;

end

我明白了,但是信号的某些部分仍然失效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38301504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档