python - 时间序列中的降噪保持锐利的边缘
问题描述
在来自功率计的时间序列中,过程和传感器都会产生噪声。为了识别步骤,我想在不牺牲边缘陡峭度的情况下过滤噪声。
想法是做一个rolling(window).mean()
=> 杀死边缘或rolling(window).median()
=> 但如果窗口大小需要小,这会产生谐波噪声问题。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# create a reference signal
xrng = 50
sgn = np.zeros(xrng)
sgn[10:xrng//2] = 1
sgn[xrng//2:xrng-10]=0.5
fig = plt.figure(figsize=(10,6))
plt.plot(sgn, label='raw')
T=3 # period of the sine like noise (random phase shifts not modeled)
noise1 = (np.random.rand(xrng)-0.5)*0.2 # sensor noise
noise2 = np.sin(np.arange(xrng)*2*np.pi/T)*0.1 # harmonic noise
sg_n = sgn + noise1 + noise2 # noised signal
plt.plot(sg_n, label='noised')
# 1. filter mean (good for hamonic)
mnfltr = np.ones(7)/7
sg_mn = np.convolve(mnfltr,sg_n, 'same')
plt.plot(sg_mn, label='roll_mean')
# 2. filter median (good for edges)
median = pd.Series(sg_n).rolling(9).median().shift(-4)
plt.plot(median, label='roll_med')
plt.legend()
plt.show()
有没有办法结合两个过滤器来获得两种好处或任何其他方法?
解决方案
如果噪声的幅度没有掩盖步长,则可以使用完全不同的方法重建步进信号。
您的设置:
import numpy as np
import matplotlib.pyplot as plt
xrng = 50
sgn = np.zeros(xrng)
sgn[10:xrng//2] = 1
sgn[xrng//2:xrng-10]=0.5
fig = plt.figure(figsize=(10,6))
plt.plot(sgn, label='raw')
T=3 # period of the sine like noise (random phase shifts not modeled)
noise1 = (np.random.rand(xrng)-0.5)*0.2 # sensor noise
noise2 = np.sin(np.arange(xrng)*2*np.pi/T)*0.1 # harmonic noise
sg_n = sgn + noise1 + noise2 # noised signal
plt.plot(sg_n, label='noised')
噪声信号可以被数字化
bins = np.arange(-.25, 2, .5)
plt.plot((np.digitize(sg_n, bins)-1)/2, '.', markersize=8, label='reconstructed from noiced')
plt.legend();
结果:
推荐阅读
- flutter - Flutter 中的 NaN 是什么,是由什么引起的?
- c# - 处理键盘事件,玩家姓名出现一秒钟然后消失?
- mysql - mysqlWorkbench 错误:未处理的异常:在未引用的字段中看到换行符
- angular - 在“获取 Angular CLI 版本”期间发生内部错误
- codenameone - How to handle keys pressed almost in the same time?
- python-3.x - 自定义 TF-Keras 层的性能比内置层差
- c# - Python NET 调用具有返回值和输出参数的 C# 方法
- excel - 如何自动化多个文本过滤器包含序列并将文本值添加到右侧的列?
- java - 如何在java中进行遥测HealthCheck?
- cmake - 当 find_package 失败时,CMake 获取已尝试包的列表