Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 基于频域二维循环卷积的时域乘法_Matlab_Convolution - Fatal编程技术网

Matlab 基于频域二维循环卷积的时域乘法

Matlab 基于频域二维循环卷积的时域乘法,matlab,convolution,Matlab,Convolution,我尝试在频域中使用二维循环卷积进行时域乘法。事实上,我知道它在一维情况下是如何工作的。比如: x = [1 2 3 4 5]; y = [4 5 6 7 8]; xy = 1/5*ifft( cconv(fft(x), fft(y), 5)); xy0 = x.*y; xy和xy0都是一样的,这就是我想要的。然而,对于2D情况,cconv没有在matlab中定义,我不知道如何使用频域卷积在相同大小的2个矩阵之间执行乘法 假设我们有以下矩阵: x = [3 5 4; 7 6 1;

我尝试在频域中使用二维循环卷积进行时域乘法。事实上,我知道它在一维情况下是如何工作的。比如:

x = [1 2 3 4 5];

y = [4 5 6 7 8];

xy = 1/5*ifft( cconv(fft(x), fft(y), 5));

xy0 = x.*y;
xy和xy0都是一样的,这就是我想要的。然而,对于2D情况,cconv没有在matlab中定义,我不知道如何使用频域卷积在相同大小的2个矩阵之间执行乘法

假设我们有以下矩阵:

x = [3 5 4;
    7 6 1;
    -1 2 0];

y = [2 7 1;
    2 -3 2;
    5 6 9];
确保命令1/9*ifft2(conv2(fft2(x),fft2(y),‘same’)不会给出与x*y相同的结果


每个人都能帮我解决这个问题吗?

在您的命令中,您的卷积应该是一个循环卷积,与您的1D示例相同。见和

下面是一个我使用Numpy和Scipy在Python中工作的示例。在IFFT之前,我必须将频域中的卷积结果移位(按+1+1),以匹配乘法结果。我假设关于scipy pads将结果从其适当位置移动的方式,快速检查显示正确FFT conv输出的空域结果的FFT应该让您知道如何在matlab中移动或使用不同的填充

在scipy.signal中使用“wrap”填充相当于循环卷积

import numpy as np
from scipy import signal

###################################################
# Check Multiplication in Spatial == Conv in Freq #
###################################################

np.random.seed(1234)
fr = np.random.normal(0.1,1.0,(3,3))
imgs = np.random.normal(0,1.0,(3,3))

spatialMult = fr * imgs

filtFFT = np.fft.fft2(fr)
imgsFFT = np.fft.fft2(imgs)

ac = signal.convolve2d(imgsFFT.real,filtFFT.real,'same','wrap')
ad = signal.convolve2d(imgsFFT.real,filtFFT.imag,'same','wrap')
bc = signal.convolve2d(imgsFFT.imag,filtFFT.real,'same','wrap')
bd = signal.convolve2d(imgsFFT.imag,filtFFT.imag,'same','wrap')

r_conv = (ac - bd)
i_conv = (ad + bc)

res_conv = r_conv + 1j*i_conv
res_conv = res_conv / 9
# Positions are incorrect for some reason
# Need a +1 +1 shift to align
res_conv = np.roll(np.roll(res_conv,1,0),-2,1)
res_ifft = np.fft.ifft2(res_conv)

spat_fft = np.fft.fft2(spatialMult)
print(spat_fft)
print(res_conv)
print()
print(res_ifft.real)
print(spatialMult)
如果希望立即获得正确的输出,可以使用numpy自己填充:

ir = imgsFFT.real
im = imgsFFT.imag
f_r = filtFFT.real
f_i = filtFFT.imag

ir = np.pad(ir,((2,0),(2,0)),'wrap')
im = np.pad(im,((2,0),(2,0)),'wrap')

ac = signal.convolve2d(ir,f_r,'valid')
ad = signal.convolve2d(ir,f_i,'valid')
bc = signal.convolve2d(im,f_r,'valid')
bd = signal.convolve2d(im,f_i,'valid')

r_conv = (ac - bd)
i_conv = (ad + bc)

res_conv = r_conv + 1j*i_conv
res_conv = res_conv / n
res_ifft = np.fft.ifft2(res_conv)

spat_fft = np.fft.fft2(spatialMult)
print(spat_fft)
print(res_conv)
print()
print(res_ifft.real)
print(spatialMult)