【问题标题】:Applying median filter to data with 2 axes将中值滤波器应用于具有 2 个轴的数据
【发布时间】:2017-02-23 09:02:52
【问题描述】:

我有以下代码:

x = VarName3;
y = VarName4;
x = (x/6000)/60;
plot(x, y)

其中VarName3VarName43000x1。我想在 MATLAB 中对此应用中值滤波器。但是,我遇到的问题是,如果我使用medfilt1,那么我只能输入一个变量数组作为第一个参数。而对于medfilt2,我只能输入一个矩阵作为第一个参数。但是如果我将xy 转换为矩阵,数据看起来非常模糊。

x 是时间,y 是整数列表。我希望能够过滤掉尖峰和下降。我该怎么做呢?我正在考虑通过直接操作数据文件来消除错误的数据点。但是,我并没有真正得到中值滤波器的效果。

【问题讨论】:

  • 您的问题中提到了 2 个过滤器。中值过滤器不会过滤掉高于和低于某个范围的值。你需要哪一个?
  • 但是中值过滤器不能帮助我摆脱数据中的尖峰吗?
  • 是,但不是“高于或低于某个范围的值”
  • 抱歉,措辞错误。我想要的是摆脱异常值。我已经编辑了 OP。
  • medfilt1 有什么问题?似乎是正确的选择

标签: matlab filter signal-processing


【解决方案1】:

我找到了使用sort 的解决方案。

中位数是中心元素,所以可以对三个元素进行排序,取中间元素作为中位数。
sort函数也返回前面语法的索引。
我用索引信息恢复X的匹配值。

这是我的代码示例:

%X - simulates time.
X = [1 2 3 4 5 6 7 8 9 10];

%Y - simulates data
Y = [0 1 2 0 100 1 1 1 2 3];

%Create three vectors:
Y0 = [0, Y(1:end-1)]; %Left elements   [0 0 1 2 0 2 1 1 1 2]
Y1 = Y;               %Center elements [0 1 2 0 2 1 1 1 2 3]
Y2 = [Y(2:end), 0];   %Right elements  [1 2 0 2 1 1 1 2 3 0]

%Concatenate Y0, Y1 and Y2.
YYY = [Y0; Y1; Y2];

%Sort YYY:
%sortedYYY(2, :) equals medfilt1(Y)
%I(2, :) equals the index: value 1 for Y0, 2 for Y1 and 3 for Y2.
[sortedYYY, I] = sort(YYY);

%Median is the center of sorted 3 elements.
medY = sortedYYY(2, :);

%Corrected X index of medY
medX = X + I(2, :) - 2;

%Protect X from exceeding original boundries.
medX = min(max(medX, min(X)), max(X));

结果:

medX =

     1     2     2     3     6     7     7     8     9     9

>> medY

medY =

     0     1     1     2     1     1     1     1     2     2

【讨论】:

    【解决方案2】:

    在给定时间居中的数据向量上使用滑动窗口。你当时的过滤输出值是滑动窗口中数据的中值。滑动窗口的大小为奇数,不一定固定为3。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 2018-04-14
      • 2023-04-08
      • 1970-01-01
      • 2017-10-18
      • 2017-07-10
      • 1970-01-01
      相关资源
      最近更新 更多