Main Content

medfilt1

一维中位数滤波

说明

y = medfilt1(x) 将三阶一维中位数滤波器应用于输入向量 x。该函数将端点以外的信号视为 0。输出 y 具有与 x 相同的长度。

y = medfilt1(x,n)n 阶一维中位数滤波器应用于 x

示例

y = medfilt1(x,n,blksz,dim)y = medfilt1(x,n,[],dim) 指定滤波器沿其运算的维度 dimblksz 是向后兼容所必需的,因此被忽略。

y = medfilt1(___,nanflag,padding) 使用上述语法中的任何输入参量指定如何在每个段中处理 NaN 值。此语法还指定 padding,即在信号边缘执行的滤波类型。

nanflagpadding 可以出现在函数调用中 x 后的任何位置。

示例

示例

全部折叠

生成一个正弦信号,采样率为 100 Hz,采样时间持续 1 秒。添加更高频率的正弦波对噪声进行仿真。

fs = 100;
t = 0:1/fs:1;
x = sin(2*pi*t*3)+0.25*sin(2*pi*t*40);

使用一个 10 阶中位数滤波器对信号进行平滑处理。绘制结果。

y = medfilt1(x,10);

plot(t,x,t,y)
legend('Original','Filtered')
legend('boxoff')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Original, Filtered.

生成一个由不同频率的正弦波组成的双通道信号。将尖峰放在随机的位置。使用 NaN 随机添加缺失采样。重置随机数生成器以获得可重现的结果。绘制信号。

rng('default')

n = 59;
x = sin(pi./[15 10]'*(1:n)+pi/3)';

spk = randi(2*n,9,1);
x(spk) = x(spk)*2;
x(randi(2*n,6,1)) = NaN;

plot(x)

Figure contains an axes object. The axes object contains 2 objects of type line.

使用 medfilt1 和默认设置对信号进行滤波。绘制滤波后的信号。默认情况下,滤波器将 NaN 赋给任何具有缺失采样的段的中位数。

y = medfilt1(x);
plot(y)

Figure contains an axes object. The axes object contains 2 objects of type line.

转置原始信号。再次对其进行滤波,指定函数沿行工作。计算中位数时排除缺失采样。如果将第二个参量留空,则 medfilt1 使用默认滤波器阶数 3。

y = medfilt1(x',[],[],2,'omitnan');
plot(y')

Figure contains an axes object. The axes object contains 2 objects of type line.

该函数不能对只包含 NaN 的段赋值。增大段长度以解决此问题。此更改会同时更彻底地删除离群值。

y = medfilt1(x,4,'omitnan');
plot(y)

Figure contains an axes object. The axes object contains 2 objects of type line.

默认零填充导致函数低估边缘处的信号值。通过使用递减窗计算端点的中位数来减轻这种影响。

y = medfilt1(x,4,'omitnan','truncate');
plot(y)

Figure contains an axes object. The axes object contains 2 objects of type line.

输入参数

全部折叠

输入信号,指定为实数值向量、矩阵或 N 维数组。

数据类型: single | double

一维中位数滤波器的阶数,指定为正整数标量。

  • n 是奇数时,y(k)x(k-(n-1)/2:k+(n-1)/2) 的中位数。

  • n 是偶数时,y(k)x(k-n/2:k+(n/2)-1) 的中位数。在这种情况下,此函数对数字进行排序,并取排序列表中两个中间元素的平均值。

示例: 如果 n = 11,则 y(k)x(k-5:k+5) 的中位数。

示例: 如果 n = 12,则 y(k)x(k-6:k+5) 的中位数。

数据类型: double

要沿其滤波的维度,指定为正整数标量。默认情况下,该函数沿 x 的第一个非单一维度进行运算。特别是,如果 x 是矩阵,该函数将对其列进行滤波,以使 y(:,i) = medfilt1(x(:,i),n)

数据类型: double

NaN 条件,指定为 'includenan''omitnan'

  • 'includenan' - 返回滤波后的信号,因此任何包含 NaN 的段的中位数也是 NaN

  • 'omitnan' - 返回滤波后的信号,因此任何包含 NaN 的段的中位数是非 NaN 值的中位数。如果一个段的所有元素均为 NaN,则结果是 NaN

端点滤波,指定为 'zeropad''truncate'

  • 'zeropad' - 将端点以外的信号视为零。

  • 'truncate' - 当到达信号边缘时,计算较小段的中位数。

输出参量

全部折叠

滤波后的信号,以实数值向量、矩阵或 N 维数组形式返回。y 的大小与 x 相同。

数据类型: double

提示

如果您有 Image Processing Toolbox™ 软件的许可证,您可以使用 medfilt2 (Image Processing Toolbox) 函数来执行二维中位数滤波。

参考

[1] Pratt, William K. Digital Image Processing. 4th Ed. Hoboken, NJ: John Wiley & Sons, 2007.

扩展功能

版本历史记录

在 R2006a 之前推出