티스토리 뷰

Study/comm

[Signal] Matlab으로 만드는 기타소리.

생각많은 소심남 2015. 4. 18. 01:44

신호 과제를 하다보니까 karplus-strong(KS) 알고리즘을 matlab으로 구현하고 경험하는 내용이 나오길래 한번 소개해본다.

사실 그 강의에서 KS 알고리즘에 대해서 자세히 소개한 건 아니지만, 그래도 

이런 형태를 띄는 신호를 표현한게 그거라고 한다. 우선 이걸 z-transform에 의해서 바꾸는 방법을 잠깐 고민해본다. 아마 신호 수업을 들은 사람이라면 알겠지만 보통 time domain상에서 shift된 신호 형태는 z-domain형태로 바꿨을 때 z^-M의 형태로 나온다. 그러면 위의 식을 z-domain으로 바꾸고 여기에 대한 transfer function을 구하는게 가장 우선으로 해야 할 일이다. transfer function이란 말그대로 변환함수를 말하는데 조금더 자세히 말하자면 어떤 시스템에 impulse response를 넣었을때 그 결과로 나오는 식을 의미한다. 그래서 보통 꼴이 Y(Z)/X(Z)의 형태로 나오게 되는데, 위의 식도 그런식으로 풀다보면 transfer function H(Z)는 다음과 같이 나오게 된다.



이 정보를 가지고 filter를 설계해야 된다. 우리한테 필요한 값은 분자 함수의 계수 집합, 분모함수의 계수 집합, 그리고 입력값만 알면 된다. 이 값을 filter라는 matlab 함수에 집어넣어주면 입력에 대한 출력을 구할 수 있게 된다. 예를 들어서 다음과 같이 matlab으로 구현했다고 가정하자.


% Do not modify the creation of this input vector
N=16000;x = [2*rand([1 floor(N/100)])-1 zeros(1,N-floor(N/100))];
%%%%%%%%%%%%%%%%%%%%%%
% Type your code below:
alpha = 0.5;
M = 160;
b=1;
a=[1 zeros(1, M-1) -alpha -alpha];

y = filter(b, a, x); 

soundsc(y, N);


잠깐 설명을 하자면 앞에서 설명한 바와 같이 분자함수의 계수집합과 분모함수의 계수집합을 구하기 위한 과정을 거쳐 그 값을 각각 b, a에 넣었다. 유념할 것은 지금 분모 함수의 지수의 최대값이 M+1로 되어 있다. 이말은 즉, 계수가 있는 두개와 상수항을 뺀 나머지 차수에 대한 계수는 다 0으로 맞춰줘야 한다는 것이다. 그래서 위의 식과 같이 matrix안에 zeros를 삽입하고 그만큼을 padding했다. 

 그리고 끝으로 sampling 갯수만큼 y값을 뽑아내서 소리로 출력해보았다. 결과는 재미있게 나온다.



이게 무슨 소리로 들릴지는 상상에 맡긴다. 다음은 M의 값을 다르게 하고 그 값을 연속으로 재생시켰을때의 코드와 결과물이다.

% Do not modify the creation of this input vector
N=16000;x = [2*rand([1 floor(N/100)])-1 zeros(1,N-floor(N/100))];
%%%%%%%%%%%%%%%%%%%%%%
% Type your code below:

M=[41 34 36 54];

alpha = 0.5;
b=1;

M = 41;
a1 =[1 zeros(1, M-1) -alpha -alpha];
y1 = filter(b, a1, x);

M = 34;
a2 =[1 zeros(1, M-1) -alpha -alpha];
y2 = filter(b, a2, x);

M = 36;
a3 =[1 zeros(1, M-1) -alpha -alpha];
y3 = filter(b, a3, x);

M = 54;
a4 =[1 zeros(1, M-1) -alpha -alpha];
y4 = filter(b, a4, x);

y=[y1 y2 y3 y4];
 

soundsc(y, N);



어차피 소리도 공기의 진동으로 인해 귀에 전달되는 에너지다. 따라서 그 에너지의 떨림주기나 이를 변환하는 과정을 거침으로써 자신이 원하는 소리를 만들어낼 수 있다. 솔직히 이런 작업을 직접해보니까 진짜 신기하고 재미있었다. 누가 matlab으로 소리를 생성한다고 생각이나 했을까..

'Study > comm' 카테고리의 다른 글

[Signal] Frequency Division Multiplexing  (0) 2015.11.24
[Signal] Run-length Encoding  (0) 2015.11.03
[Signal] zp2tf and freqz function in matlab  (0) 2015.04.10
댓글