w*******U 发帖数: 256 | 1 测试 fftw_r2c 的 3d 函数,就是从实数域到复数域的三维傅立叶正变换。
物理空间里给了一个简单的实函数: cos(m*x1),这里 m 是个整数,x1 是 0 到 2*pi
上的实数。也就是说所给的物理空间的函数只是 x1 的函数,而跟其他两个坐标 x2,
x3 都无关。
变换出来的有两个 modes,各占 0.5,跟所给数组大小有关,但不包括 (m,0,0)。比如
,给 50x50x50 的数组,给定 m=1,那么这两个 modes 是 (0,26,0)和 (25,24,0);
若给定 m=2 则这两个 modes 是 (1,2,0) 和 (24,48,0)。若是改变数组大小为
30x40x50,则 m=1 对应的 modes 为 (0,20,40) 和 (15,3,10)。
然后再利用反变换 fftw_c2r,则确实能恢复原先给定的实函数,也就是可以 dealised.
实数到复数应该有 hermite symmetry,但三维情况下的应该是什么样子?看了
numerical recipes 的 c 语言版本中关于多维 fft 的内容,但没看懂。我不是做算法
的,也不知道以上的结果是否正确。希望大家帮忙。万分感谢! | w*******U 发帖数: 256 | 2 测试 fftw_r2c 的 3d 函数,就是从实数域到复数域的三维傅立叶正变换。
物理空间里给了一个简单的实函数: cos(m*x1),这里 m 是个整数,x1 是 0 到 2*pi
上的实数。也就是说所给的物理空间的函数只是 x1 的函数,而跟其他两个坐标 x2,
x3 都无关。
变换出来的有两个 modes,各占 0.5,跟所给数组大小有关,但不包括 (m,0,0)。比如
,给 50x50x50 的数组,给定 m=1,那么这两个 modes 是 (0,26,0)和 (25,24,0);
若给定 m=2 则这两个 modes 是 (1,2,0) 和 (24,48,0)。若是改变数组大小为
30x40x50,则 m=1 对应的 modes 为 (0,20,40) 和 (15,3,10)。
然后再利用反变换 fftw_c2r,则确实能恢复原先给定的实函数,也就是可以 dealised.
实数到复数应该有 hermite symmetry,但三维情况下的应该是什么样子?看了
numerical recipes 的 c 语言版本中关于多维 fft 的内容,但没看懂。我不是做算法
的,也不知道以上的结果是否正确。希望大家帮忙。万分感谢! | m*****k 发帖数: 58 | 3 我用的是c语言版的fftw3, 可能会不一样.
r2c 是有hermite symmetry. f(-k) = f(k)*, 它的相位是[0, 2\pi*(N-1)/N], r2c 就
会有f(n) = f(N-n). fftw偷懒, 只存了一半的系数, 后一半全是0, 不会有 (0,20,40
)这样的mode.可能是你的计数方式搞错了吧. | w*******U 发帖数: 256 | 4 谢谢你的回复。我已经搞清楚错误了。
1. c2r 的会抹掉原来的谱空间,所以得随时 copy;
2. 我给的长度不对。如果是在谱空间展开从 -10 到 +10,应该给21个 modes。
我是用谱方法求解一个线性偏微分方程,要 dealise, 物理空间的 nodes 只需要和谱空间的 modes 一样多就行了。
谢谢你的回复!
40
【在 m*****k 的大作中提到】 : 我用的是c语言版的fftw3, 可能会不一样. : r2c 是有hermite symmetry. f(-k) = f(k)*, 它的相位是[0, 2\pi*(N-1)/N], r2c 就 : 会有f(n) = f(N-n). fftw偷懒, 只存了一半的系数, 后一半全是0, 不会有 (0,20,40 : )这样的mode.可能是你的计数方式搞错了吧.
|
|