Skip to content

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

网址:https://ww2.mathworks.cn/help/signal/ug/remove-spikes-from-a-signal.html
描述:本案例由1个示例构成。

-

针对以上案例,采用Python语言实现。

-

python
import numpy as np
from matplotlib import pyplot as plt
import scipy.signal as signal
import scipy.io as scio
python
data = scio.loadmat('openloop60hertz.mat')
hz_60 = data['openLoopVoltage']
datalen = len(hz_60)
T = np.arange(0, datalen)
python
plt.plot(T, hz_60)
plt.show()

png

通过在随机点添加随机符号以加入瞬变以破坏信号。重置随机数生成器以获得可再现性。

python
spikeSignal = np.zeros(datalen)
spks = np.arange(10, 1990, 100)
randadd = np.random.randint(-10, 10, size=len(spks))
spikeSignal[spks + randadd] = np.random.randn(len(spks))
python
hz_60 = hz_60.reshape(len(hz_60),)
noisySignal = hz_60 + spikeSignal
python
plt.plot(T, noisySignal)
plt.xlabel('Time (s)')
plt.ylabel('Voltage (V)')
plt.title('Voltage with Added Spikes')
plt.show()

png

函数medfilt将信号的每个点替换为该点和指定数量的邻点的中位数。因此,中位数滤波会丢弃与其周围环境相差很大的点。通过使用三个邻点的集合计算中位数来对信号进行滤波。注意峰值是如何消失的。

python
medfiltSignal = signal.medfilt(noisySignal)
python
plt.plot(medfiltSignal)
plt.xlabel('Time (s)')
plt.ylabel('Voltage (V)')
plt.title('Voltage with Added Spikes')
plt.grid()
plt.show()

png