去除信号中的峰值
有时数据会出现不必要的瞬变(即峰值)。中位数滤波是消除它的好方法。
以存在 60 Hz 电线噪声时模拟仪器输入的开环电压为例。采样率为 1 kHz。
load openloop60hertz
fs = 1000;
t = (0:numel(openLoopVoltage) - 1)/fs;
通过在随机点添加随机符号以加入瞬变以破坏信号。重置随机数生成器以获得可再现性。
rng default
spikeSignal = zeros(size(openLoopVoltage));
spks = 10:100:1990;
spikeSignal(spks+round(2*randn(size(spks)))) = sign(randn(size(spks)));
noisyLoopVoltage = openLoopVoltage + spikeSignal;
plot(t,noisyLoopVoltage)
xlabel('Time (s)')
ylabel('Voltage (V)')
title('Open-Loop Voltage with Added Spikes')
函数 medfilt1
将信号的每个点替换为该点和指定数量的邻点的中位数。因此,中位数滤波会丢弃与其周围环境相差很大的点。通过使用三个邻点的集合计算中位数来对信号进行滤波。注意峰值是如何消失的。
yax = ylim;
medfiltLoopVoltage = medfilt1(noisyLoopVoltage,3);
plot(t,medfiltLoopVoltage)
xlabel('Time (s)')
ylabel('Voltage (V)')
title('Open-Loop Voltage After Median Filtering')
ylim(yax)
grid