首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用频域2D循环卷积进行时域乘法

利用频域2D循环卷积进行时域乘法
EN

Stack Overflow用户
提问于 2016-11-28 02:55:57
回答 1查看 484关注 0票数 2

我正在尝试使用频域中的2D循环卷积进行时域乘法。实际上,我知道它在一维情况下是如何工作的。像这样:

代码语言:javascript
复制
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情况,在matlab中没有定义cconv,我不知道如何在频域中使用卷积在相同大小的2个矩阵之间执行乘法。

假设我们有以下矩阵:

代码语言:javascript
复制
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相同的结果

大家能帮我解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2018-07-02 14:05:33

在命令中,卷积应该是循环卷积,与1D示例中的cconv相同。参见https://www.mathworks.com/matlabcentral/answers/59333-convolution-in-frequency-domain-not-convolution-in-time-domainConvolution of two fft function

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

在scipy.signal中使用'wrap‘填充等同于循环卷积。

代码语言:javascript
复制
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自己填充:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40832672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档