需求说明:深度学习FPGA实现知识储备
来自:时间的诗
说明:用Matlab验证图像卷积运算可以通过FFT和IFFT实现,且结果与直接进行卷积运算相同。
-
利用fft2和conv2做卷积
-
clc; clear all;
-
%% 利用fft2计算二维卷积
-
% 利用fft2函数可以计算二维卷积,如:
-
a=[
2
2
1;
1
2
3;
1
1
1];
-
b=[
11
2
3
3
4
1;
2
3
3
4
1
5; …
-
2
7
12
22
11
11;
21
22
11
3
4
5; …
-
7
8
6
2
1
2;
4
5
3
32
1
21];
-
a
0 = a; b
0 = b;
-
[ma, na] = size(a); % a的维数
-
[mb, nb] = size(b); % b的维数
-
a(ma*mb-
1, na*nb-
1) =
0; % 扩展a
-
b(ma*mb-
1, na*nb-
1) =
0; % 扩展b
-
c=ifft2(fft2(a).*fft2(b)); % 用fft2和ifft2
-
c1=c(
1
:ma+mb-
1,
1
:na+nb-
1); % 提取
-
%% 利用conv2(二维卷积函数)校验, 如:
-
a=a0; b = b0;
-
c2=conv2(a,b); % 用conv2
-
fprintf(
’\nUse fft2, c1 = \n’); disp(c1);
-
fprintf(
’\nUse conv2, c2 = \n’); disp(c2);
-
% 经验证发现是一样的,所以说求卷积可以使用傅立叶变换后点乘,
-
% 然后在逆傅立叶变换回去则可
计算结果
-
Use fft2, c1 =
-
22.0000
26.0000
21.0000
14.0000
17.0000
13.0000
6.0000
1.0000
-
15.0000
34.0000
54.0000
32.0000
32.0000
34.0000
25.0000
8.0000
-
17.0000
38.0000
71.0000
102.0000
106.0000
93.0000
51.0000
27.0000
-
46.0000
102.0000
127.0000
127.0000
124.0000
130.0000
75.0000
43.0000
-
37.0000
103.0000
174.0000
156.0000
100.0000
74.0000
49.0000
28.0000
-
36.0000
83.0000
117.0000
149.0000
110.0000
98.0000
59.0000
32.0000
-
11.0000
28.0000
46.0000
69.0000
83.0000
124.0000
48.0000
65.0000
-
4.0000
9.0000
12.0000
40.0000
36.0000
54.0000
22.0000
21.0000
-
-
Use conv2, c2 =
-
22
26
21
14
17
13
6
1
-
15
34
54
32
32
34
25
8
-
17
38
71
102
106
93
51
27
-
46
102
127
127
124
130
75
43
-
37
103
174
156
100
74
49
28
-
36
83
117
149
110
98
59
32
-
11
28
46
69
83
124
48
65
-
4
9
12
40
36
54
22
21
</div>