Как один Фурье преобразовывает массив из 1 и 0 - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь преобразовать Фурье матрицу из 0 со сплошным кругом (как укол) из 1, используя Python. Я пытаюсь получить изображение функции Эйри, которая должна выглядеть как концентрическая круговая рябь, если смотреть сверху. Я все еще немного новичок в Python и программирую более широко.

import numpy as np
dimension = 256

list1 = []
listpiece = []

for i in range(dimension):
    for j in range(dimension):
        listpiece.append(0)
    list1.append(listpiece)
    listpiece = []

k=128
for i in range(dimension):
    for j in range(dimension):
        if (i-k)*(i-k) + (j-k)*(j-k) <= 64*2:
            list1[i][j] = 1

import matplotlib.pylab as plt
import scipy.sparse as sparse

plt.spy(list1)
plt.show()

, который дал это изображение черного круга на белом фоне . Затем я преобразовал этот список в массив numpy.

singledimlist = []
for i in range(dimension):
    for j in range(dimension):
        singledimlist.append(list1[i][j])

prefourierline = np.array( singledimlist )
shape = ( dimension, dimension )
prefourier = prefourierline.reshape( shape )
print(prefourier)
plt.spy(prefourier)
plt.show()

, который дал идентичное изображение:

Использование np.fft.fft2 дало пустое изображение, хотя выходные данные имели очень большие изменения:

from scipy.fftpack import fft, ifft
fouriered = np.fft.fft2(prefourier)
plt.spy(fouriered)
plt.show()

Вывод:

[[ 405.        +0.00000000e+00j -401.08038516-1.50697234e-16j
   389.47420686-2.31615451e-15j ... -370.63201656-5.88988318e-15j
   389.47420686+2.35778788e-15j -401.08038516+8.95615360e-15j]
 [-401.08038516-2.27306384e-15j  397.18553235-1.77932604e-15j
  -385.65292606-1.63119926e-15j ...  366.93100304+7.84568423e-15j
  -385.65292606-2.13934425e-15j  397.18553235-1.08069809e-14j]
 [ 389.47420686+8.66313300e-15j -385.65292606-1.67296339e-14j
   374.33891021+6.30297134e-15j ... -355.97430091-1.40810576e-14j
   374.33891021+1.25700186e-14j -385.65292606-1.24588719e-14j]
 ...
 [-370.63201656-4.69963986e-14j  366.93100304+4.87944288e-14j
  -355.97430091-4.69561772e-14j ...  338.1937218 +3.81585557e-14j
  -355.97430091-4.67444422e-14j  366.93100304+3.64531853e-14j]
 [ 389.47420686+3.34933421e-14j -385.65292606-2.70693599e-14j
   374.33891021+3.08443590e-14j ... -355.97430091-3.30709228e-14j
   374.33891021+2.07603249e-14j -385.65292606-2.63513116e-14j]
 [-401.08038516-5.83528175e-14j  397.18553235+7.09535468e-14j
  -385.65292606-5.72142574e-14j ...  366.93100304+7.01916155e-14j
  -385.65292606-6.12008707e-14j  397.18553235+6.47498390e-14j]]

Итак, я попытался использовать np.fft.fft, но получилось немного лучше, вместо чистого изображения я вывел черную горизонтальную полосу с той жеширина как радиус исходного круга, делит пополам белый фон.

from scipy.fftpack import fft, ifft
fouriered = np.fft.fft(prefourier)
plt.spy(fouriered)
plt.show()

Я подозреваю, что главная проблема лежит между экраном моего компьютера и моим стулом.

Мой вопрос, что яделать неправильно? Как один Фурье преобразовывает массив такого рода?

Спасибо, я был бы признателен за некоторую помощь,

ES

1 Ответ

1 голос
/ 12 октября 2019

Есть несколько вещей, поэтому я привел рабочий пример, в котором используется numpy. Вопрос нулей и единиц не является проблемой, поскольку они также являются допустимыми числами с плавающей запятой, поэтому физика в порядке. Есть два вопроса в поиске правильного ответа в выходных данных. Один из них - увеличить или, наоборот, сделать круг очень маленьким. Поиграйте с этим и рассчитайте ожидаемые размеры колец из решения для закрытой формы (Airy-Function). Другой контраст. Ниже я просто использовал журнал для лучшей визуализации. Альтернативы будут пускать корни. Также обратите внимание, что я не возводил в квадрат результат (как указывает физика, то есть напряженность против электрического поля).

import matplotlib.pyplot as p 
import numpy as np

n=1000
aa=np.ones((n,n))
x=np.linspace(-1,1,n)  
y=np.linspace(-1,1,n)
X,Y= np.meshgrid(x,y)    #this allows us to use vectorized approach, no for loops
R = np.sqrt(X**2+Y**2)


aa[R<0.1]=0


p.figure(figsize=(20,6))
p.subplot(131)
p.imshow(aa)
p.colorbar()

p.subplot(132)
spec= np.fft.fftshift(np.fft.fft2(aa)) 
p.imshow( np.log(np.abs(spec)))
p.colorbar() 
p.title('airy func too fine to see')

p.subplot(133)

p.imshow(  np.log(np.abs(spec[450:550,450:550])))
p.colorbar()
p.title('zoomed in');

enter image description here

...