我想使用傅里叶变换在周期性边界条件下找到模拟实体的中心;周期性边界条件意味着,每当某物从盒子的一侧退出时,它就会像经典游戏小行星一样扭曲出现在另一侧。
所以我所拥有的是每个时间帧的矩阵(Nx3),其中 N 是 xyz 中的点数。我想要做的是确定该云的中心,即使它全部移动到周期性边界上并且可以说卡在两者之间。
我对解决方案的想法现在是对这些点进行(质量加权)直方图,然后对其执行 FFT 并使用第一个傅立叶系数的相位来确定框内最大值的位置。
作为我用过的测试用例
import numpy as np
Points_x = np.random.randn(10000)
Box_min = -10
Box_max = 10
X = np.linspace( Box_min, Box_max, 100 )
### make a Histogram of the points
Histogram_Points = np.bincount( np.digitize( Points_x, X ), minlength=100 )
### make an artifical shift over the periodic boundary
Histogram_Points = np.r_[ Histogram_Points[45:], Histogram_Points[:45] ]
所以现在我可以使用 FFT,因为它无论如何都需要一个周期性函数。
## doing fft
F = np.fft.fft(Histogram_Points)
## getting rid of everything but first harmonic
F[2:] = 0.
## back transforming
Fist_harmonic = np.fft.ifft(F)
这样我得到一个正弦波,其最大值正好在直方图的最大值处。
现在我想提取最大值的位置,而不是通过在正弦向量上取 max 函数,但不知何故,它应该可以从第一个(不是第 0 个)傅里叶系数中检索,因为它应该以某种方式包含相移正弦使其最大值恰好位于直方图的最大值处。
的确,谋划
Cos_approx = cos( linspace(0,2*pi,100) * angle(F[1]) )
会给
但我不知道如何从这个角度获得峰值的位置。