소프트웨어/음성프로그래밍

5. convolution의 분할 수행

cs만두 2013. 6. 24. 04:12

카테고리 1번글에서 설명하였듯이 파일에서 byte단위 즉,1024개의 데이터씩 읽어서 처리하게 된다.

 

그렇다면 지금까지 구성해온 filter는 어떻게 동작을 해야할까?

 

 

1024 

1024 

1024 

1024 

1024 

1024 

1024 

1024 

1024 

1024 

이렇게 분할된 데이터를 각각 convolution 수행시 어떤 처리를 해줘야 할까...

 

라는 생각에 MATLAB에서 데이터를 관찰해보았다.

 

x= [1:10;
    11:20;
    21:30;
    31:40;
    41:50;
    51:60;
    61:70;
    71:80;
    81:90;
    91:100];
h=[1,1,1,1];
for i=1:10
    y(i,:)=conv(h,x(i,:))
end
y2=conv(h,1:100)

전체 데이터 x는 1:100까지의 데이터이다. 이 데이터를 10x10 매트릭스로 찢었다.

즉 각 행은 1~10, 11~20,,,,과 같이 10개 단위로 찢어진 데이터로 가정했다.

이상태에서 h는 [1,1,1,1]로 가정하였다.

for i=1:10
    y(i,:)=conv(h,x(i,:))
end

이 수행을 통해서는 각각의 행별로 convolution을 수행하게 하였다.

 y =

     1     3     6    10    14    18    22    26    30    34    27    19    10
    11    23    36    50    54    58    62    66    70    74    57    39    20
    21    43    66    90    94    98   102   106   110   114    87    59    30
    31    63    96   130   134   138   142   146   150   154   117    79    40
    41    83   126   170   174   178   182   186   190   194   147    99    50
    51   103   156   210   214   218   222   226   230   234   177   119    60
    61   123   186   250   254   258   262   266   270   274   207   139    70
    71   143   216   290   294   298   302   306   310   314   237   159    80
    81   163   246   330   334   338   342   346   350   354   267   179    90
    91   183   276   370   374   378   382   386   390   394   297   199   100

결과는 위와 같았다. 각각의 행은 (Xn+Yn-1)=13개만큼의 콘볼류젼 데이터가 나왔다.

 

그렇다면 1~100까지 쭉~convolution을 수행한다면 데이터는 어떻게 나올까?

y2=

1 3 6 10 14 18 22 26 30 34 38 42 46 50 54 58 62 66 70 74 78 82 86 90 94 98 102 106 110 114 118 122 126 130 134 

138 142 146 150 154 158 162 166 170 174 178 182 186 190 194 198 202 206 210 214 218 222 226 230 234 238 242 

246 250 254 258 262 266 270 274 278 282 286 290 294 298 302 306 310 314 318 322 326 330 334 338 342 346 350 

354 358 362 366 370 374 378 382 386 390 394 297 199 100

다음과같이 103개의 데이터가 나왔다.

 

각각따로 convolution을 수행하였을시의 데이터는 130개, 한번에 수행하였을시는 103개. 즉 27개의 데이터가 사라져야한다.

이를 알아보기 위해서 Excel을 통해 데이터를 짜집어 보았다.

 

 

위의 사진은 엑셀을 캡쳐한 화면이다. 실제로는 가로로 103줄이나 되는 엄청 긴 파일이다.

궁금하면

분할및 전체 colvoution비교.xlsx

를 열어보면 된다. 꼭 열어볼 필요는 없다.

 

정말 운 좋게도 예상한대로 딱 떨어졌다.

1~10까지는 콘볼루전한 데이터가 그대로 내려가고 다음 콘볼류전 값과 겹치는 11~13번째 데이터는 다음 콘볼루전의 1~3번째 데이터와 더해주면 신기하게 한꺼번에 콘볼류전한 값과 같아지게 된다.

 

글이 길어지니 1024개씩 잘라서 파일 전체를 분할 정복하는것은 다음 글에 쓰도록 하겠다.