2D DFFT: wrong order along the second dimension

Let us consider a 2D discrete fast Fourier transform of a separable function:

using FFTW
xs = collect(0.0:0.1:0.9)
ys = xs
zs = cos.(xs).^2*sin.(ys')
fzs = fft(zs)

The result of 2D DFF transform of zs is

On the other hand, since the function is separable, we can compute 2D Fourier transform as a product of two 1D Fourier transforms:

fzs2 = fft(cos.(xs).^2)*fft(sin.(ys))'

This gives us

As we see, the two results do not exactly coincide. However, if we permute the columns of fzs2, we actually obtain fzs: we need to permute columns 2 and 10, 3 and 9, etc. If one does fft shift, it corresponds to exchanging columns corresponding to ky and -ky.

Can anyone explain why this happens?

you need transpose(fft(sin.(ys))), what you are doing is the adjoint which is the transpose, complex conjugated. You don’t see the effect on ys since it was real.