我正在关注 this link平滑我的数据集。 该技术基于去除信号傅立叶变换的高阶项,从而获得平滑函数的原理。 这是我的代码的一部分:
N = len(y)
y = y.astype(float) # fix issue, see below
yfft = fft(y, N)
yfft[31:] = 0.0 # set higher harmonics to zero
y_smooth = fft(yfft, N)
ax.errorbar(phase, y, yerr = err, fmt='b.', capsize=0, elinewidth=1.0)
ax.plot(phase, y_smooth/30, color='black') #arbitrary normalization, see below
但是有些东西不能正常工作。 实际上,您可以检查结果图: 蓝点是我的数据,而黑线应该是平滑的曲线。
首先,我必须按照 this discussion 转换我的数据数组 y
.
其次,我只是任意归一化以将曲线与数据进行比较,因为我不知道为什么原始曲线的值比数据点高得多。
最重要的是,曲线对数据点来说就像“镜面反射”,我不知道为什么会这样。 最好能有一些建议,尤其是对第三点的建议,更一般地说,如何使用这种技术针对我的特定数据集形状优化平滑。
最佳答案
您的问题可能是由于标准 FFT 的移动造成的。你可以阅读它here.
您的数据是真实的,因此您可以利用 FT 中的对称性并使用特殊函数 np.fft.rfft
import numpy as np
x = np.arange(40)
y = np.log(x + 1) * np.exp(-x/8.) * x**2 + np.random.random(40) * 15
rft = np.fft.rfft(y)
rft[5:] = 0 # Note, rft.shape = 21
y_smooth = np.fft.irfft(rft)
plt.plot(x, y, label='Original')
plt.plot(x, y_smooth, label='Smoothed')
plt.legend(loc=0)
plt.show()
如果绘制 rft 的绝对值,您会发现超过 5 的频率几乎没有任何信息,所以这就是我选择该阈值的原因(也有一些尝试)。
结果如下:
关于python - 数据集的傅立叶平滑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23077850/