python - 数据集的傅立叶平滑

标签 python scipy fft smoothing

我正在关注 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

但是有些东西不能正常工作。 实际上,您可以检查结果图: enter image description here 蓝点是我的数据,而黑线应该是平滑的曲线。

首先,我必须按照 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 的频率几乎没有任何信息,所以这就是我选择该阈值的原因(也有一些尝试)。

结果如下:

enter image description here

关于python - 数据集的傅立叶平滑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23077850/

相关文章:

python - 使用 matplotlib 绘制动态数据

python - 使用时间相关数据 Python 进行快速傅立叶变换 (fft)

python - 在 Flask 中渲染部分模板

python - python中的多维矩阵乘法

python - MySQL (mariaDB) 与 SqlAlchemy 的连接错误

Android 使用 JTransform 库可视化 PCM 数据

c++ - 如何在 C++ 中执行二维快速傅里叶变换

python - 如何在 Go 中实现 DllMain 入口点

python - 创建未知大小的稀疏矩阵

c# - 从 C#(使用 SciPy)调用 IronPython 失败,出现 ImportException : "No module named mtrand"