Я пытаюсь решить проблему с python+numpy, в которой у меня есть некоторые функции типа < img src="https://i.stack.imgur.com/dlU2I.gif" alt="$f(x-x_i,y-y_i,z)$">, который мне нужно свернуть с другим функция . Чтобы оптимизировать код, я выполнил БПФ f и g, перемножил их, а затем выполнил обратное преобразование, чтобы получить результат.
В качестве дополнительной оптимизации я понял, что благодаря теореме сдвига я могу просто вычислить один раз fft f(x,y,z), а затем умножить его на фазовый коэффициент, который зависит от для получения fft . В частности, , где N – длина x и y.
Я попытался реализовать эту простую формулу с помощью python + numpy, но по какой-то непонятной для меня причине она не работает, поэтому я прошу помощи сообщества SO, чтобы выяснить, что мне не хватает.
Я также привожу простой пример.
In [1]: import numpy as np
In [2]: x = np.arange(-10, 11)
In [3]: base = np.fft.fft(np.cos(x))
In [4]: shifted = np.fft.fft(np.cos(x-1))
In [5]: w = np.fft.fftfreq(x.size)
In [6]: phase = np.exp(-2*np.pi*1.0j*w/x.size)
In [7]: test = phase * base
In [8]: (test == shifted).all()
Out[8]: False
In [9]: shifted/base
Out[9]:
array([ 0.54030231 -0.j , 0.54030231 -0.23216322j,
0.54030231 -0.47512034j, 0.54030231 -0.7417705j ,
0.54030231 -1.05016033j, 0.54030231 -1.42919168j,
0.54030231 -1.931478j , 0.54030231 -2.66788185j,
0.54030231 -3.92462627j, 0.54030231 -6.74850534j,
0.54030231-20.55390586j, 0.54030231+20.55390586j,
0.54030231 +6.74850534j, 0.54030231 +3.92462627j,
0.54030231 +2.66788185j, 0.54030231 +1.931478j ,
0.54030231 +1.42919168j, 0.54030231 +1.05016033j,
0.54030231 +0.7417705j , 0.54030231 +0.47512034j,
0.54030231 +0.23216322j])
In [10]: np.abs(shifted/base)
Out[10]:
array([ 0.54030231, 0.58807001, 0.71949004, 0.91768734,
1.18100097, 1.52791212, 2.00562555, 2.72204338,
3.96164334, 6.77009977, 20.56100612, 20.56100612,
6.77009977, 3.96164334, 2.72204338, 2.00562555,
1.52791212, 1.18100097, 0.91768734, 0.71949004, 0.58807001])
Я ожидаю, что с помощью shifted/base
я смогу получить соответствующие значения фазового множителя, но, как видно, он не может быть фазовым множителем, так как его np.abs
>= 1!