【发布时间】:2013-08-10 21:26:38
【问题描述】:
我想使用傅里叶变换来找到周期性边界条件下模拟实体的中心;周期性边界条件意味着,每当某物从盒子的一侧退出时,它就会像经典游戏小行星一样扭曲出现在另一侧。
所以我所拥有的是每个时间帧的矩阵 (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]) )
会给
但我不知道如何从这个角度得到峰的位置。
【问题讨论】:
-
不就是
Box_min + (Box_max-Box_min)*angle(F1)/2*pi吗? -
嘿,我想你可能是对的。睡了一晚,现在看起来很简单。但问题是角度(F [1])有时会返回负数,所以我猜
Box_min + (Box_max-Box_min) * angle(F[1]) % (2*pi)我们应该有它 -
@Jaime,你应该从中做出答案,这样才能被接受。