去除信号中的峰值
有时数据会出现不必要的瞬变(即峰值)。中位数滤波是消除它的好方法。
以存在 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')
yax = ylim;
函数 medfilt1
将信号的每个点替换为该点和指定数量的邻点的中位数。因此,中位数滤波会丢弃与其周围环境相差很大的点。通过使用三个邻点的集合计算中位数来对信号进行滤波。注意峰值是如何消失的。
medfiltLoopVoltage = medfilt1(noisyLoopVoltage,3); plot(t,medfiltLoopVoltage) xlabel('Time (s)') ylabel('Voltage (V)') title('Open-Loop Voltage After Median Filtering') ylim(yax) grid