查看: 2592|回复: 5|关注: 0

[已答复] 卷积和FFT结果长度不同 mismatch of length of FFT and convolution (con...

[复制链接]

新手

10 麦片

财富积分


050


2

主题

6

帖子

0

最佳答案
发表于 2017-9-11 13:25:44 | 显示全部楼层 |阅读模式

请教一个问题,理论上时域卷积等于频域相乘: a*b(卷积)=ifft(fft(a)fft(b)) (此处为点乘)
但是卷积结果的长度是2n-1, 而fft不会改变list的长度。
请问这个怎么理解。谢谢!
clc
a=[1,2,3,4]
b=[6,7,9,8]
c=conv2(a,b)
A=fft2(a)
B=fft2(b)
C=A.*B
c2=ifft2(C)


a =

     1     2     3     4


b =

     6     7     9     8


c =

     6    19    41    71    71    60    32


A =

  10.0000 + 0.0000i  -2.0000 + 2.0000i  -2.0000 + 0.0000i  -2.0000 - 2.0000i


B =

  30.0000 + 0.0000i  -3.0000 + 1.0000i   0.0000 + 0.0000i  -3.0000 - 1.0000i


C =

   1.0e+02 *

   3.0000 + 0.0000i   0.0400 - 0.0800i   0.0000 + 0.0000i   0.0400 + 0.0800i


c2 =

    77    79    73    71

回复主题 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


2

主题

6

帖子

0

最佳答案
 楼主| 发表于 2017-9-24 09:36:26 | 显示全部楼层
顶一下,拜托各位大神推荐些参考文献也行,谢谢了!
回复此楼 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

入门

130 麦片

财富积分


50500


6

主题

131

帖子

23

最佳答案
  • 关注者: 4
发表于 2017-9-25 16:53:18 | 显示全部楼层
clc
a=[1,2,3,4,5];
b=[6,7,9,8];
c=conv2(a,b)
len = length(a)+length(b)-1;
A=fft(a,len);
B=fft(b,len);
C=A.*B;
C2 = ifft(C)

c =
     6    19    41    71   101    95    77    40
C2 =
    6.0000   19.0000   41.0000   71.0000  101.0000   95.0000   77.0000   40.0000

可以得到正确结果,而且a,b的长度可以不相等
其中原理不是很清楚,等大神来解惑。。。
回复此楼 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


2

主题

6

帖子

0

最佳答案
 楼主| 发表于 2017-9-25 21:15:38 | 显示全部楼层
本帖最后由 guccarlos 于 2017-9-25 21:16 编辑

感谢 Leavor
找到版主 sonyzy41过去的一个帖子<谱卷积实现FFT>
(我倒,我还没权限发链接)


里面的大意是这样
clc
a=[1,2,3,4]
b=[6,7,9,8]

A=fftshift(fft(a))
B=fftshift(fft(b))
C=conv(A,B)/length(a)
C2=fftshift(C)
c=fft(a.*b)

C2 =

  Columns 1 through 4

  79.0000 + 0.0000i -22.5000 +17.5000i   1.0000 - 2.0000i   0.0000 + 0.0000i

  Columns 5 through 7

   1.5000 + 0.5000i -14.0000 + 2.0000i -21.0000 -18.0000i


c =

  79.0000 + 0.0000i -21.0000 +18.0000i -13.0000 + 0.0000i -21.0000 -18.0000i

C2和c的 前len/2 长度的值应该是一样的。但这样的原理是什么,特别是conv后的除的length意义。
哪位能帮我@一下版主哈,谢谢了!
回复此楼 已获打赏: 0 积分

举报

新手

5 麦片

财富积分


050


1

主题

5

帖子

0

最佳答案
发表于 2017-9-26 00:21:42 | 显示全部楼层
群主 我有一个专做程序代码群,可以在你面接私活做的,如果您有兴趣可以进群。我会把任务放在群里谁愿意接货,谁就可以做。201280101
回复此楼 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


2

主题

6

帖子

0

最佳答案
 楼主| 发表于 2017-9-26 10:49:50 | 显示全部楼层
搜到一个matlab 讲 linear conv 和circular convo的,效果和Leavor同学讲的一样的:

The linear convolution of an N-point vector, x, and an L-point vector, y, has length N + L - 1.

For the circular convolution of x and y to be equivalent, you must pad the vectors with zeros to length at least N + L - 1 before you take the DFT. After you invert the product of the DFTs, retain only the first N + L - 1 elements.

Create two vectors, x and y, and compute the linear convolution of the two vectors.

x = [2 1 2 1];
y = [1 2 3];
clin = conv(x,y);
The output has length 4+3-1.

Pad both vectors with zeros to length 4+3-1. Obtain the DFT of both vectors, multiply the DFTs, and obtain the inverse DFT of the product.

xpad = [x zeros(1,6-length(x))];
ypad = [y zeros(1,6-length(y))];
ccirc = ifft(fft(xpad).*fft(ypad));
The circular convolution of the zero-padded vectors, xpad and ypad, is equivalent to the linear convolution of x and y. You retain all the elements of ccirc because the output has length 4+3-1.

Plot the output of linear convolution and the inverse of the DFT product to show the equivalence.

subplot(2,1,1)
stem(clin,'filled')
ylim([0 11])
title('Linear Convolution of x and y')

subplot(2,1,2)
stem(ccirc,'filled')
ylim([0 11])
title('Circular Convolution of xpad and ypad')
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表