【问题标题】:How to compare scipy noise filters?如何比较 scipy 噪声过滤器?
【发布时间】:2020-02-06 11:00:46
【问题描述】:

我需要减少数据中的噪音行为。我尝试了一种名为 Savitzky-Golay Filter 的方法。另一方面,我需要找到最快的方法,因为过滤算法将在我的代码中运行最多的脚本中。

我不熟悉信号处理方法。您能简要介绍一下更快的方法和用法吗?

我不需要像低通、高通等复杂的结构(我知道有成千上万个)。我想使用尽可能快的平滑方法。

这是我的测试脚本:

import numpy as np
import matplotlib.pyplot as plt

noisyData=np.array([
   2.77741650e+43,   1.30016392e+42,   8.05792443e+42,   1.74277713e+43,
   2.33814198e+43,   6.75553976e+42,   2.56642073e+43,   4.71467220e+43,
   4.25047666e+43,   3.07095152e+43,   7.30694187e+43,   7.54411548e+43,
   1.29555422e+43,   8.09272000e+42,   9.18193162e+43,   2.25447063e+44,
   3.43044832e+41,   7.02901256e+43,   2.54438379e+43,   8.72303015e+43,
   7.80333557e+42,   7.55039871e+43,   7.70164773e+43,   4.38740319e+43,
   8.43139041e+43,   6.12168640e+43,   5.64352020e+43,   3.63824769e+42,
   2.35296604e+43,   4.66272666e+43,   5.03660902e+44,   1.65071897e+44,
   2.81055925e+44,   1.46401444e+44,   5.44407940e+43,   4.50672710e+43,
   1.60833084e+44,   1.68038069e+44,   1.08588606e+44,   7.00867980e+43])

xAxis=np.arange(len(noisyData))

# ------------- Savitzky-Golay Filter ---------------------
windowLength = len(xAxis) - 5 
polyOrder = 6

from scipy.signal import savgol_filter

# Function
def set_SavgolFilter(noisyData,windowLength,polyOrder):
    return savgol_filter(noisyData, windowLength, polyOrder)

plt.plot(xAxis,noisyData,alpha=0.5)
plt.plot(xAxis,set_SavgolFilter(noisyData,windowLength,polyOrder))

# ------------- Time Comparison ----------------------
import time
start_time = time.time()
for i in range(50):
    savgolfilter1 = set_SavgolFilter(noisyData,windowLength,polyOrder)
print(" %s seconds " % (time.time() - start_time))

# === OTHER METHODS WILL BE HERE

【问题讨论】:

    标签: python performance scipy filtering noise-reduction


    【解决方案1】:

    除非您真的需要基于多项式的平滑,否则 Savitzky-Golay 没有任何特别的优势。它基本上是一个糟糕的低通滤波器。更多详情请见https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5888646

    改用基本的巴特沃斯低通滤波器:

    from scipy.signal import butter, filtfilt
    b, a = butter(5, .2)
    datafilt = filtfilt(b, a, noisyData)
    

    filtfilt 调用似乎比savgol_filter 快​​几倍。你需要多快?使用 scipy 中的lfilter 至少快 10 倍,但结果会相对于输入信号有所延迟。

    【讨论】:

    • 感谢您的回答。那个脚本就是我想要的。消除噪音将成为我代码的瓶颈,所以我需要尽可能快。 lfilter 的相移消除对我不起作用,因为我将对该数据进行数值积分 simps。这可能会导致问题。
    • 好的,很高兴听到。需要考虑的一件事是,集成本身往往会降低噪音,因此如果您只使用数据进行集成,事先对其进行过滤可能不会产生太大影响。
    • 是的,你是对的。 事先过滤它可能没有太大区别,这对我来说是主要的事情。如果数据像噪声行为一样快速波动,则数值积分方法需要更小的 bin 以减少错误。它降低了我的代码速度。因此,我将平滑我的数据以增加集成箱。最后,正如您所说,整合的结果不会发生巨大变化。
    猜你喜欢
    • 2015-06-13
    • 2015-05-12
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多