728x90
0. [matlab] - Discrete-time Convolution |
1. 풀이 |
컨볼루션의 개념을 이산시간으로 바꾸어 대입을 해주었다. 이러한 방법은 컴퓨터에서 컨볼루션을 수행할 수 있게 한다.
이때, 시간 간격을 작게 할 수록 실제 컨볼루션의 계산과 매우 근접하게 된다.
2. 소스코드 |
1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | clear; % 1) cos함수와 unit step function함수의 convolution 알고리즘 구현 n = 0:1:19; x = cos(3*pi*n/4); % x[n] = cos(a*n)의 배열을 만든다. m = 0:1:9; h = heaviside(m); y_1 = convolution(x,h); % 직접 구현한 알고리즘을 활용해 연산 결과를 y_1[n+m-1]에 담는다. figure(1); stem(y_1); xlabel('n'); % x축 이름 ylabel('y_1[n]'); % y축 이름 % 2) conv과 stem 함수를 활용해 1)의 결과를 증명 y_2 = conv(x,h); figure(2); stem(y_2); xlabel('n'); % x축 이름 ylabel('y_2[n]'); % y축 이름 % 결과를 배열에 담아 return 하는 convolution 함수 % x,h를 배열로 입력 function con = convolution(x, h) % 추후에 이 배열이 결과로 return % 배열의 길이는 '(x,h의 길이 총합) - 1' con = zeros(1, length(x) + length(h) - 1); % 이중 for문을 활용해 일정 영역 내부의 x*h를 전부 더한다. for n = 1 : 1 :length(con) for k = max(1,n+1-length(x)):1:min(n,length(h)) con(n) = con(n) + x(n-k + 1)*h(k); end end end | cs |
2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | clear; % 1) sin함수와 지수함수의 convolution 알고리즘 구현 n = 0:1:49; x = sin(3*pi*n/4); % x[n] = sin(a*n) m = 0:1:19; h = exp(0.1*m); % h[m] = exp(0.1*m) y_1 = convolution(x,h); % 직접 구현한 알고리즘을 활용해 연산 결과를 y_1[n+m-1]에 담는다. figure(1); stem(y_1); xlabel('n'); % x축 이름 ylabel('y_1[n]'); % y축 이름 % 2) conv과 stem 함수를 활용해 1)의 결과를 증명 y_2 = conv(x,h); figure(2); stem(y_2); xlabel('n'); % x축 이름 ylabel('y_2[n]'); % y축 이름 % 결과를 배열에 담아 return 하는 convolution 함수 % x,h를 배열로 입력 function con = convolution(x, h) % 추후에 이 배열이 결과로 return % 배열의 길이는 '(x,h의 길이 총합) - 1' con = zeros(1, length(x) + length(h) - 1); % 이중 for문을 활용해 일정 영역 내부의 x*h를 전부 더한다. for n = 1 : 1 :length(con) for k = max(1,n+1-length(x)):1:min(n,length(h)) con(n) = con(n) + x(n-k + 1)*h(k); end end end | cs |
3. 참고 |
질문이나 지적 있으시면 댓글로 남겨주세요~
도움 되셨으면 하트 꾹!