Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据集的傅里叶平滑_Python_Scipy_Fft_Smoothing - Fatal编程技术网

Python 数据集的傅里叶平滑

Python 数据集的傅里叶平滑,python,scipy,fft,smoothing,Python,Scipy,Fft,Smoothing,下面我将对我的数据集进行平滑处理。 该技术基于去除信号傅里叶变换的高阶项,从而获得平滑函数的原理。 这是我代码的一部分: 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(

下面我将对我的数据集进行平滑处理。 该技术基于去除信号傅里叶变换的高阶项,从而获得平滑函数的原理。 这是我代码的一部分:

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
然而,有些事情不能正常工作。 实际上,您可以检查结果图: 蓝色的点是我的数据,而黑色的线应该是平滑的曲线

首先,我必须通过以下方式转换我的数据数组
y

第二,我只是任意归一化,将曲线与数据进行比较,因为我不知道为什么原始曲线的值比数据点高很多

最重要的是,曲线对于数据点来说就像“镜面反射”,我不知道为什么会发生这种情况。
对于第三点,尤其是对于如何针对我的特定数据集形状使用此技术优化平滑,如果能提供一些建议,那就太好了。

根据我收集的信息,您希望通过执行以下操作来构建低通滤波器:

  • 移到频域。(傅里叶变换)
  • 移除不需要的频率
  • 回到时域。(傅里叶逆变换)
  • 看看你的代码,你不是在做3)你只是在做另一个傅里叶变换。相反,请尝试执行实际的傅里叶逆变换以返回到时域:

    y_smooth = ifft(yfft, N)
    
    看一看,可以看到一堆已经可用的过滤器


    (编辑:我很想看到结果,请分享!)

    您的问题可能是由于标准FFT的移位。你可以读到它

    您的数据是真实的,因此您可以利用FT中的对称性并使用特殊函数
    np.fft.rfft

    将numpy导入为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#注,rft.shape=21
    y_平滑=np.fft.irfft(rft)
    plt.plt(x,y,label='Original')
    plt.绘图(x,y_平滑,label='smooted')
    plt.图例(loc=0)
    plt.show()
    
    如果你画出rft的绝对值,你会发现在频率超过5的地方几乎没有任何信息,所以这就是为什么我选择这个阈值(还有一点玩转)

    结果如下:


    我会非常谨慎地使用这种技术。通过调零FFT的频率分量,可以有效地在频域构建砖墙滤波器。这将导致在时域中与sinc进行卷积,并可能扭曲您想要处理的信息。查阅“吉布斯现象”了解更多信息


    你最好设计一个低通滤波器或使用一个简单的N点移动平均值(它本身就是一个LPF)来完成平滑。

    从数学上讲,FT是它自己的逆函数,根据定义对一些负号进行模化,我认为这就是OP使用它的原因。当然,魔鬼在于细节,它看起来像是所使用的,加上频移,意味着$FT[FT[f](x)](k)=f(-x)$。有关图像输出,请参见我的答案。