Main Content

去除信号中的峰值

有时数据会出现不必要的瞬变(即峰值)。中位数滤波是消除它的好方法。

以存在 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

另请参阅

相关主题