Реализовать преобразование Фурье взаимной корреляции? используя numpy

#python #numpy #multidimensional-array #fft #cross-correlation

Вопрос:

Я пытаюсь реализовать FT взаимной корреляции, чтобы увидеть, справедлива ли теорема о свертке.

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

Может кто-нибудь мне помочь? Я попытался перевернуть фильтр, я попытался его сопрягать и я попытался его перенести.

Мое вдохновение от https://dsp.stackexchange.com/questions/29761/convolution-theorem-for-cross-correlation

Код

 conv: tensor([[[[ 0.6908,  1.2291, -0.7020,  1.0186, -1.2585],
          [ 0.3773,  1.8541,  0.8134,  0.2672, -0.5912],
          [ 0.1427,  0.6185,  1.0000, -0.8145, -0.4732],
          [ 1.9047, -0.0119,  0.8849, -1.2321, -0.5614],
          [ 0.0910,  1.0923, -0.6255, -1.9881,  1.9961]]]])
FT result: [[-1.2321 -0.5614  1.9047 -0.0119  0.8849]
 [-1.9881  1.9961  0.091   1.0923 -0.6255]
 [ 1.0186 -1.2585  0.6908  1.2291 -0.702 ]
 [ 0.2672 -0.5912  0.3773  1.8541  0.8134]
 [-0.8145 -0.4732  0.1427  0.6185  1.    ]]
 

добавлен код:

 import torch
import torch.nn.functional as F
from scipy.fft import fft2, fftshift, ifft2
import numpy as np


nb_channels = 1
h, w = 5, 5
x =     [[[[ 0.6908,  1.2291, -0.7020,  1.0186, -1.2585],
          [ 0.3773,  1.8541,  0.8134,  0.2672, -0.5912],
          [ 0.1427,  0.6185,    1.000, -0.8145, -0.4732],
          [ 1.9047, -0.0119,  0.8849, -1.2321, -0.5614],
          [ 0.0910,  1.0923, -0.6255, -1.9881,  1.9961]]]]
x = torch.tensor(x)
x = x.view(1, nb_channels, h, w)
weights1 = torch.tensor([[0., 0., 0.],
                        [0., 1., 0.],
                        [0., 0., 0.]])

weights = weights1.view(1, 1, 3, 3).repeat(1, nb_channels, 1, 1)

output = F.conv2d(x, weights, padding='same')
print("conv:", output)


################### FT numpy
a = x.numpy()
mac = a.copy()
img = np.squeeze(mac)

fft_in1 = fft2(img)

w_numpy = weights1.numpy()
weights_numpy = w_numpy.copy()
pad_weights = np.pad(weights_numpy, ((1, 1), (1, 1)), mode='constant', constant_values=(0, 0))

fft_weights = fft2(pad_weights)
pad_weights = fft_weights

out1 = fft_in1 * pad_weights
output_n = out1

output_numpy = ifft2(output_n)
output_numpy = output_numpy.real
output_numpy = np.around(output_numpy, decimals = 4)

print("after IFFT:", output_numpy)
 

Комментарии:

1. вы что-нибудь пробовали? сложно прокомментировать вашу реализацию, не видя ее

2. Да, я попытался перевернуть матрицу ядра слева направо, затем вверх вниз. Я попытался перенести его. Я попытался использовать np.conjugate(). Я также пробовал все эти операции, только на входе или на обоих, на входе и в ядре.