我有以下代码:
x = VarName3;
y = VarName4;
x = (x/6000)/60;
plot(x, y)
VarName3
和VarName4
为3000x1
的位置。我想在MATLAB中对此应用中值滤波器。但是,我遇到的问题是,如果我使用medfilt1
,那么我只能输入一个变量数组作为第一个参数。而对于medfilt2
,我只能输入一个矩阵作为第一个参数。但是,如果我将x
和y
转换为矩阵,则数据看起来非常模糊。
x
是时间,y
是整数列表。我希望能够过滤掉尖峰和逢低。我该怎么做呢?我想通过直接操纵数据文件来消除错误的数据点。但是,我并没有真正得到中值滤波器的效果。
答案 0 :(得分:0)
我找到了使用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
答案 1 :(得分:0)
在以给定时间为中心的数据向量上使用滑动窗口。此时过滤输出的值是滑动窗口中数据的中值。滑动窗口的大小是奇数值,不一定固定为3.