首页 > 学院 > 开发设计 > 正文

Matlab中使用FFT验证卷积定理

2019-11-06 06:50:27
字体:
来源:转载
供稿:网友

Matlab中使用快速傅里叶变换(FFT)验证卷积定理

引言

本科微积分教材中讲过卷积定理,公式也非常容易背: 如果: g=h∗x 那么 G=HX 这里 * 表示卷积,GHX分别表示ghx的傅里叶变换。HX之间为点乘。 公式很容易记住,考试的时候也不在话下。但是当时有很多问题根本没有往下思考。比如,在二维矩阵中,hx的大小可能不一致,这在卷积操作中没有问题。但在频域中(经过傅里叶变换后),HX之间为点乘,而HX的大小分别由空域中的hx决定(相等)。那么HX大小不等的时候,二者怎么点乘呢?

原理

所以在要分别对hx做扩充,并使它们扩充之后大小一致。这样,在频域中二者就可以点乘了。

1. 扩充

在这里,我们通过在矩阵水平与垂直正方向补0,把h∈Rc×dx∈Ra×b都扩充至[a+c−1,b+d−1]。原始的hx数据处于补充矩阵的左上角。

2. 变换

这一步可以跟上一步一起用函数fft2解决

H = fft2(h, a+c-1, b+d-1);X = fft2(x, a+c-1, b+d-1);

这里fft2函数会自动扩充,然后进行变换。一开始以为是在原矩阵四周同时补0,后来经过验证发现MATLAB只在矩阵两个方向把0补齐即可。

3. 点乘,反变换

直接看代码:

G = X.*H;g = ifft2(G);% 产生最大的结果,对应"full"% 产生与x大小一致的结果,对应"same"gf = g(floor((c-1)/2+1):floor((c+2*a-1)/2), floor((d-1)/2+1):floor((d+2*b-1)/2));

g的大小与G相同,即扩充后的大小;gf截取至g,它的大小与原始矩阵x相同。

代码

既然是验证,这里就附上代码和结果以作验证:

x = imread('horse.jpg'); %读取原图片x = rgb2gray(x);[a, b] = size(x);figure, imshow(x); title('原图像');c=5; d=5;h = fspecial('gaussian', [c,d]) %产生点扩散函数%产生空域卷积结果gc = conv2(x, h, 'same'); %gc = conv2(x, h);产生最大的结果,对应"full"figure, imshow(gc/255); title('卷积');% 用fft验证H = fft2(h, a+c-1, b+d-1);X = fft2(x, a+c-1, b+d-1);G = X.*H; %点乘g = ifft2(G);% 与G大小一致的结果,对应"full"% 产生与x大小一致的结果,对应"same"gf = g(floor((c-1)/2+1):floor((c+2*a-1)/2), floor((d-1)/2+1):floor((d+2*b-1)/2));figure, imshow(gf/255);%% 为了验证两种方式结果是否一致,将gf,gc做差显示出来figure, imshow(abs(gf-gc)/255);

经过验证,最后一张图像几乎全黑,意味这两种方式计算的结果是一致的。

conv2()函数得到不同大小的卷积结果

C = conv2(x, h, shape);

命令 结果大小
‘full’ [a+c-1, b+d-1]
‘same’ [a, b]
‘valid’ [a-c+1, b-d+1]

抽时间把conv2()具体怎么计算的讲明白。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表