让我们假设我们有一个数据集,该数据集可能近似为
import numpy as np
x = np.linspace(0,2*np.pi,100)
y = np.sin(x) + np.random.random(100) * 0.2
因此,我们有20%的数据集的变化。我的第一个想法是使用scipy的UnivariateSpline函数,但问题是这没有很好地考虑到小噪声。如果你考虑频率,背景比信号小得多,所以只有截止的样条可能是一个想法,但这将涉及来回傅立叶变换,这可能会导致不良行为。另一种方法是移动平均,但这也需要正确选择延迟。
有什么提示/书籍或链接可以解决这个问题吗?
发布于 2013-12-17 03:24:45
如果您对周期性信号的“平滑”版本感兴趣(如您的示例),那么FFT是正确的方法。进行傅立叶变换,减去低贡献频率:
import numpy as np
import scipy.fftpack
N = 100
x = np.linspace(0,2*np.pi,N)
y = np.sin(x) + np.random.random(N) * 0.2
w = scipy.fftpack.rfft(y)
f = scipy.fftpack.rfftfreq(N, x[1]-x[0])
spectrum = w**2
cutoff_idx = spectrum < (spectrum.max()/5)
w2 = w.copy()
w2[cutoff_idx] = 0
y2 = scipy.fftpack.irfft(w2)
即使你的信号不是完全周期性的,这也能很好地消除白噪声。有许多类型的过滤器可供使用(高通、低通等),适当的过滤器取决于您正在寻找的内容。
https://stackoverflow.com/questions/20618804
复制相似问题