완존 고급 정보임 ㅋㅋㅋㅋ

이거 보고 학부생들 숙제 조올라 쉽게 하는거 아님? ㅋㅋ

정말 CAS 기능이 이렇게 좋아진 마당에

푸리에 변환표, 라플라스 변환표, 부정적분 표, 미분표가 다 왠말이란 말이던가.

물론 할 줄 아는것도 중요하다

이론을 정확하게 다 알면 더욱좋고

스스로 풀수도 있으면 더욱 좋고 ㅋㅋㅋ


물론 나는 다 할 수 있다! ㅋㅋㅋ


여하튼 Matlab 으로 라플라스 트랜스폼 하는 법을 알려주겟다 ㅋㅋ

걍 답이 나온다 ㅋ


이말인즉슨 무엇이겠나


상미방이 쉽게 풀린단 소리다.
푸리에변환도 된다는 소리다.
부정적분도 그냥 해준단 소리다.
미분도 그냥 해준단 소리다.

상미방이 풀린단 소리는 잘 응용해서 편미방도 풀수있단 소리다.
물론 푸리에 시리즈를 이용해 풀어제끼는 편미방 방식이 아닌 간단한 명령어를 제공하지만
배운것을 써먹어 보기에는 딱일것이다 ㅋ

왜 내가 이렇게

주저리 주저리 쓰는것 같은가

뭐 별게 없어서 ㅋㅋㅋ


syms a b w t s

laplace(2*t^3*exp(-0.5*t))

laplace(t-3)

ilaplace((2)/(s^2+s+0.5))

ilaplace(exp(-3*s)/s^2)


설명도 필요없다

답이 어케 나왔는지 올려주겠다 ㅋㅋ

다들 잘들 썼으면 좋겠다 ㅋㅋ

이론은 나중에 기회되면 설명해주겠음


답을 좀더 예뿌게 보고 싶은 사람들은 pretty 명령어를 검색해 보라 




저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by J.Bear
Moving Average Filter 에 이은 포스팅입니다 ㅋㅋ

결국 MAF 또한 LPF 의 일종인건 모두 아시리라 믿습니다.

하지만, 제가 지금 1st order LPF 를 언급하려고 하는 이유에 대해서 의아해 하시는 분들이 있을거에요

왜냐하면.....

처음 저 제목을 읽었을때 약간 어색하지 않았나요??

1차 LPF?? Butter 필터인가??

필터 종류는 언급도 없이 무슨 쌩뚱맞게 1차 LPF 래??

ㅋㅋㅋ

대부분 여러분은 이런식으로 IIR 필터를 많이 짜셨을거에요

[b,a] = butter(2,fc/fn,'low');

맞죠? ㅋㅋㅋ

제가 이번 포스팅에서 다루고자 하는것은 조금더 수학적으로 원론적인 내용입니다.

MAF 의 최대의 단점이 있었으니..... 무엇인지 감이 오시나요??

딩동댕~~~

최근에 샘플링한 데이터 값이 현재의 상태를 가장 잘 반영하는 데이터인데

MAF 의 경우에는 어떻죠?? 네. 모든 데이터에 똑같은 가중치 (Weighting Factor) 를 곱해버립니다.

그 결과, 잡음제거능력과 데이터 변화의 민감도(Sensitivity) 를 동시에 만족시킬만한 방법이 없어져 버린거죠.


그래서 고안된것이 아래에 설명할 LPF 입니다.

기본 개념은 심플해요.

문제를 알았으니, 그문제점을 해결해보자. 큰 가중치를 최근에 샘플링한 데이터에  곱해주고, 과거로 가면 갈수록 점점 작아지는 가중치를 곱해주자 ㅋㅋ

그럴듯 하죠? ㅋㅋㅋ

참 똑똑한 사람 많아요 ㅋㅋ

그럼 일단 쭈욱 한번 정리를 해볼갑숑??? ㅋㅋ


 짜잔 ~ ㅋㅋ

어떻습니까? ㅋㅋ

굉장히 심플한데 왠지 모르게 강력할것 같다는 생각이 들지요?? ㅋㅋ

그렇다면 역시나 우리는 Test 코드를 짜서 Test 를 해봐야합니다 ㅋㅋㅋ

코드 전문은 아래에 첨부하도록 하구요~ 여기서는 결과만 Discussion 해볼께요 ㅋ

사용된 데이터는 이전 포스팅에서 사용한 MAF 의 그것과 크게 다르지 않습니다 ㅋㅋ

일단 MAF 와 LPF 의 결과가 입력 신호를 어떻게 쫓아가는지 보도록 하지용 ㅋ

 


짠! 일단 각 필터의 출력 파형이 입력 데이터는 잘 따라가는것 같지요?? ㅋㅋ

근데 뭐가 차이가 있는지 없는지를 모르겠군요 ㅋㅋ

한부분만 확대를 해봅시다.

 


어떄요 ㅋㅋ 차이가 있긴 있지요? ㅋㅋ

근데 이렇게만 봐서는 뭐가 몬지를 잘 모르겠습니다 ㅋㅋ

별반 다른것 없이 비슷해보이구요 ㅋㅋ

여기서 사용된 가중치 alpha 의 값은 0.7 이였어요 ㅋㅋ

그럼 가중치를 0.1, 0.9 로 해서 어떻게 출력이 변하는지 한번 볼까용???


<LPF 의 WF = 0.1>

<LPF 의 WF = 0.9>

차이가 느껴지시나요?? ㅋ

위의 정리자료의 후반부에 언급되었던 WF 의 변화에 따른 결과를 극명하게 보여주는 그래프 이지요?? ㅋㅋ 

그럼 Low-Pass Filter 이니까 Cutoff Frequency 가 얼마가 되는지는 알아봐야겠지요? ㅋㅋ

도대체 몇Hz LPF 인지 뉘미럴 ㅋㅋ

 


 얼추 보이지요?? ㅋㅋ

11Hz LPF 였군요 ㅋㅋ

이그래프를 얻는 방법은 스스로들 공부해 보세요 ㅋㅋ

나중에 기회가 닿으면 올려드릴게요 ㅋㅋ

Filter 설계는 사실 이런식으로 잘 하지 않지요 ㅋㅋ

Matlab 에서는 아주 강력한 Filter 설계 툴이나 내장 함수를 지원하기 때문입니다. ㅋㅋ

하지만 이렇게 한번쯤은 수학적으로 간단하게 집고 넘어가는것이

여러분들의 학문적인 베이스를 튼튼하게 해주지 않을까 생각합니다 ㅋㅋ

역시나 질문과 댓글은 환영합니다 ㅋㅋ

여러분의 댓글이 저에게는 큰 힘이 됩니다 ㅋ

오늘 자료도 아래에 첨부하겠습니다.


 

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by J.Bear
지난 시간에는 AF (Averaging Filter) 에 대해 포스팅 했었지요 ㅋ

이번에는 앞에 Moving 이 들어갑니다 ㅋㅋ

Filter 개념을 접하게 되는 공대생들은 대부분 이것부터 맛보게 되실꺼에요 아마도 ㅋㅋ

한국말로는 이동 평균 필터!  ㅋㅋ

주식하시는 분들 '이평선, 이평선' 많이 하시죠? ㅋㅋ 이게 이동평균선의 줄임말입니다 ㅋ

그냥 평균 필터를 사용하는 경우에는 동적인 데이터 변화량을 도저히 반영할수가 없습니다.

시작부터 끝까지의 데이터를 평균내서 뿌려버리다 보니까 값의 변화폭 자체가 매우 작아져 버리다 못해

데이터 길이가 길어지면 길어질수록 변화가 없어져만 가겠지요 ㅋ

바꿔 생각해보면 infinit - point Moving Average Filter 가 되어버리는 것입니다 ㅋ

그럼 일단 늘상 하던대로 개념정리를 해야겠지요? ㅋㅋ


자 ㅋㅋㅋ

읽어보신 분들은 알겠지만 이번에는 재귀식을 사용하지 않겠습니다 ㅋㅋ

어차피 재귀식을 사용하는데 얻을수 있는 이점이 없거나 작을 경우에는 코드를 직관적으로 이해 할수 있도록 만들어 주는것이 훗날을 생각할때 훨씬 더 좋기 때문입니다 ㅋ

물론 MAF 의 차수가 엄청나게 높다면야 다시 생각해 봐야겠지만 구지 필터함수를 들고있을 필요는 없을것 같아요 ㅋㅋ

아래에 보여질 결과창은 Kalman Filter 의 이해라는 책에서 제공해주는 데이터를 이용하고,

제가 약간 수정 보완을 거친 자료입니다. ㅋ

데이터의 변화량을 잘 쫓아가면서도 잡음은 제거되어 나오는 형태의 그래프를 보실수 있을 거에요 ㅋ

물론! 파일은 올려드리겠습니다 ㅋㅋ

코드에서 눈여겨 보실점은 초기값을 0 가 아닌 처음들어오는 데이터로 함으로써 초기 오류를 줄였다는데 있어요 ㅋ

어려운 부분이 아니니까 스윽 보시면 이해되실꺼에요 ㅋㅋ

그리고 persistent 로 선언된 변수들이 있는데요 ㅋㅋ

http://iamaman.tistory.com/158

요기 가셔서 공부하세용 ㅋㅋ C 언어의 Static 선언과 비슷한거라고 생각하시면 됩니당 ㅋㅋ


씨퍼런 선이 필터 출력파형이네요 ㅋㅋ

잘 쫒아가고 있지요? ㅋㅋ

Matlab 에서는 MAF 함수를 따로 지원하지 않습니다 ㅋㅋ

이유는???

Filter 라는 함수에 b 변수배열을 1/n (n = point 수) 로 하고 a = 1 로하면??

형태는 fir 필터 형태지만 moving average filter 식과 같아지요??/

각각의 데이터에 1/n 을 곱해서 다시 다 더하니까요 ㅋㅋ

그래서 이걸 사용하라는 의미에서 제공을 안해주나봐요 ㅋㅋ


근데!!! 여기에 엄청난 맹점이 숨어있습니다 ~ ㅋㅋㅋㅋ

뭔지 아시는분이 계실려나???? 정말로 아신다면 대단하십니다!!!! 역시 세상은 엄청 넓군요 ㅋㅋ

그럼 밑에 손으로 짠 MAF 와 filter 내장함수를 이용해서 10point MAF 한 결과파형을 올려드릴테니까

한번 생각해 보세요 ~ ㅋㅋ

조그마케 해놓고 보면 잘 안나와서 한부분을 확대했어요 ㅋㅋ



짜잔~ ㅋㅋ

추세는 둘다 서로 잘 따라가는데 ㅋㅋ

같은 파형인것 같은데 이상하게 약간 차이가 나지요? ㅋㅋ

뉘미럴 왜그럴까! 개 썩을 ㅋㅋㅋ

아... filter 함수를 쓰면서 Phase Delay 인가???

물론 그럴수도 있지요 ㅋㅋ

그럼 Amplitude 는 왜 차이가 나는걸까요? 뉘미럴 개썩을 ㅋㅋㅋ

딜레마에 빠지게 됩니다 ㅋㅋ

그럼 일단 filtfilt 함수를 사용해서 delay 를 제거해보지용 ㅋㅋ

 


짜잔 ㅋㅋㅋ

자 ㅋㅋ

딜레이는 없습니다 ㅋㅋ 하지만 역시나 Amplitude 에서 차이를 보입니다 ㅋ

이게 무슨 개 거지같은 경우가 ㅋㅋㅋ

이유가 뭘까요?? ㅋㅋ

알아내셨나요??? ㅋㅋ

정답!~!!


손으로 짠 MAF 함수의 경우 : (data 합)/포인트수
filter 함수의 경우 : (각 데이터 / 포인트수) 를 전부 더한것 ㅋ

수식적으로는 100% 같습니다 ㅋㅋ

하지만 각각의 데이트를 다 나눠놓고 더하는것은 데이터를 나누는과정에서서 소수점 뒷자리가 계속 짤려나가게 되고 이걸 다시 더하다 보니 오차가 더 생기는 것이지요 ㅋㅋ

코딩을 짜는과정에서 이런 오류를 흔히 범할수 있습니다 ㅋㅋ

저처럼 이제 막 살짝 코딩 맛을 봐가는 사람은 머리쓴다고 저런 실수를 할수도 있지요 ㅋㅋ

다 더해놓고 나눌려면 큰 크기의 버퍼를 잡아야하고 그럼 스택의 낭비가 심하고, 잘못하면 OverFlow 날수도 있으니까 나는 식을 좀 바꺼나 하나하나 나눠놓고 더하겠다!!!

이런생각 말이에요 ㅋㅋㅋ

얼마나 위험한 생각인지 이제는 다들 아셨지요? ㅋㅋ


그리고 연산속도에서도 나누기 연산보다는 더하기 연산이 훨씬 시간이 적게 걸리니까 다 더하고 한번에 나누는것이 여러모로 좋아요 ㅋㅋ

이과정에서 버퍼 사이즈를 잘 결정하는 것은 프로그래머의 역량이겠지요 ㅋㅋ

물론 Matlab 에서는 크게 신경쓸것이 없지만

Embeded C 나 Window C 프로그래밍을 하는경우라면 이야기가 달라집니다 ㅋㅋ

Matlab 으로 짜실때는 뭐 크게 차이가 안나니까 그냥 filter 함수 이용하셔도 될듯 합니다 ㅋ

그럼 오늘도 즐거운 하루 되시공~ 

test 하는데 피룡한 파일들 올려드리도록 하겠습니다~~


수정합니다 ㅋㅋ

다시 해보니까 일단 제가 코드를 잘못짜놓고 헤맨부분이 있어요 뉘미럴 ㅋㅋ

위에서 한말이 다 거짓말은 아니구요 ㅋㅋ

두개의 방법사이에 약간의 오차가 있기는 한데 무시할수 있을 정도의 오차입니다 ㅋㅋ

10^-15 정도의 오차 ㅋㅋㅋ

일단 TestMovAvegFilter.m 파일에서

맨 마지막 줄을 output = filter(b,1,sonarAlt);

이렇게 고치시기 바랍니다 ㅋㅋㅋ

하마터면 잘못된 정보를 전할뻔 했군요 ㅋㅋㅋ

이런 잘못을 저지르는 분도 있을수 있으니 글은 모두 지우지 않고 줄을 그어놓겠습니당 ㅋㅋㅋ

좋은밤되세요 ㅋ
저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by J.Bear

평균필터

제목만 보고 이글을 읽지 않으시는 분들이 분명히 많을것 같습니다 ㅋㅋ

무슨 중학생도 아니고 평균을 언급하고 그래?

라는 생각 분명히 하셨지요? ㅋㅋ

저도 그랬거든요 ㅋㅋ

이래서 역시 사람은 겸손하고, 돌다리도 두들겨 보고 가고 이래야 합니다 ㅋㅋ

자 여기서 문제 ~

문) 10Hz 로 샘플링되는 데이터가 계속 들어오고 있다. 1초동안 각 데이터가 들어올때 변화하는 평균값의 추이를 보고자한다. 이를 구현하라.

너무 쉽나요? ㅋㅋ

역시 여러분은 똑똑하군요 ㅋㅋ

이 멍청한 저는 말이지요 ㅋㅋㅋ

이렇게 구현했습니다 ㅋㅋㅋ

데이터의 처음부터 새로들어오는 데이터까지 다 더하고, 데이터 갯수로 나눈다. ㅋ

아 심플하고 직관적이다 ㅋㅋㅋ 역시 멋지다 ㅋㅋㅋ

요로면 망합니다 ㅋㅋㅋ

이전 데이터 까지의 평균을 계산하기 때문에 그 값을 이용한다면 Stack 의 사용량과 연산량을 대폭 줄일수 있겠죠? ㅋㅋ

자 그럼 한번씩 읽어 보시기 바랍니다



오... ㅋㅋ

이렇게 재귀식을 이용해서 계산하니까 어떠세요? ㅋㅋㅋ

처음부터 무식하게 다 더하는 그런 짓을 하지 않아도 될것 같은 느낌이 들지요? ㅋㅋㅋ

이제 이대로 구현해서 어떤 결과를 보여주는지 한번 봐볼까요? ㅋㅋ

이게 정말로 맞는지 궁금하시면, 손으로 직접 같은 결과가 나오는지 계산들 해보세요 ㅋㅋㅋ

이게 Matlab 으로 구현한 함수를 이용해서 계산한 값입니다 ㅋㅋ

5V 전압에 White Noise 가 끼었다고 가정하고 ㅋㅋ

실제 입력 데이터와 출력데이터가 어떻게 나오는지를 살펴보지요 ㅋㅋ

오늘도 어김없이 코드는 제공됩니다 ~ ㅋㅋㅋ

다운받을때 댓글이라도 좀 달아주시고 ㅋㅋ 어떻게 쓰시던 개념치 않겠습니다 ~ ㅋㅋ

그럼 다음에 뵈용 ㅋ~



## 추가 ##

얼마나 계산량의 차이가 나는지를 보고싶어서 ㅋ

1kHz Fs 에 60초간의 데이터를 Average Filtering 취한다고 했을때 수행시간을 알아보겠습니다 ㅋㅋ

1. 재귀식을 이용한 연산 : 1.587초
2. 싸그리 더해서 나누는 연산 : 3.672초

데이터의 수가 많아질수록 이 효과는 극명하게 나타나겠죠? ㅋㅋ
그럼 재미로 300초 데이터로 다시 비교해볼까요?

1. 7.627초
2. 23.895초

ㅋㅋㅋ 극명하게 차이가 나는군요 ㅋㅋ

제공되는 코드는 tic, toc 함수를 사용하여 몇초의 연산이 걸렸는지를 확인할수 있는 걸로 올리겠습니다.

300초 연산으로 잡혀있는것이므로, 컴퓨터가 후달리면 시간을 좀 줄이고 하시길 추천합니당~


 

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by J.Bear

제기랄 글 열심히 쓰고 있었는데 날라가서 다시 써요 ㅠ

STFT 에 관해 포스팅 한 것이 벌써 2주가 지났네요 ㅋㅋ

 

예고한대로 오늘은 STFT 를 이용해서 아이유-좋은날의 3단부스터 부분을 분석해 보도록 하겠습니다 ㅋㅋ

저는 노래 듣다가 아이디어가 떠올라서 한번 해보자 라는 생각이였는데 이미 이것을 하신분이 있더라구요 ㅋㅋ

하지만 그분은 신호처리부분을 강하게 다루지 않으셨기에, 저는 Matlab 코드와 신호처리쪽에 초점을 맞추어

STFT 포스팅을 마무리 하려 합니다. ㅋㅋ

 

일단 항상 이런 프로젝트를 시작하기에 앞서서 계획을 세우는 것이 중요하지요

이렇게 할 경우에 내가 어디까지 진행되었는지, 얼마나 남았는지 등등을 한눈에 알아 볼수 있어서, 적게 헤매게 되는 것 같아요

 

 

 

프로젝트 명 : Adative Filter (LMS) 를 이용한 MR 제거 및 STFT 를 이용한 음계 분석

목적 : 1. STFT 의 기능구현 검증

2. 지금까지 공부한 개념들의 총괄적인 적용 및 확인

3. 나의 재미

프로젝트 목표 : 최후의 STFT 결과가 실제 악보의 음정과 얼마나 일치 하는지 비교

준비물 : 1. 아이유 – 좋은날 mp3 파일

     2. Wav file 로 변환 할 소프트웨어 or mp3 파일을 matlab 에서 인식 시킬 수 있는 함수

     3. 아이유 – 좋은날 악보

     4. 피아노 음계의 주파수 영역 정보

     Final. 포기하지 않는 끈기와 열정, 근성 (이게 젤로 중요함!!!)

진행과정

  1. 아이유 – 좋은날 mp3 음원파일 다운로드: (도시락에서 합법적으로 다운로드했어요 ㅋㅋ)
  2. 3단 부스터 영역 확인 : 3분 25초 ~ 3분 40초 데이터 (직접 귀로 확인 ㅋㅋ)
  3. Matlab 을 이용하여 PCM 신호에서 MR 신호를 뽑아내고 Stereo 로 저장
  4. Adaptive Filter (LMS) 를 이용하여 Matlab에서 Vocal File 생성
  5. Left , Right 각각의 Mono Signal 을 뽑아내고 서로 합쳐주어서 Stereo File 로 저장

 

 

요로코롬 계획을 세웠습니다 ㅋㅋ 그럼 시작해 볼깝숑? ㅋㅋㅋ

 

일단 아이유 – 좋은날의 3단 부스터 영역을 잘라서 wav 파일로 저장하기 위한 프로그램이 필요하겠죠? ㅋㅋ

그 이름도 유명한 GoldWave 를 사용하였습니당 ㅋㅋ

 

 

<Figure1. GoldWave Layout>

 

오!!! 보라!!! ㅋㅋ 이 웅장한 자태를 ㅋㅋㅋ

스테레오라서 이렇게 2라인으로 나와용 ㅋㅋ

여기서 3분 25초에서 3분 40초 데이터를 잘라서 wav 로 Save As 하면 되겠지용? ㅋㅋ

 

다음으로 MR 을 뽑아내야 합니다.

대부분의 음악 파일들은 Stereo 로 저장되어 있어요

즉 왼쪽, 오른쪽으로 흘러나오는 소리를 따로 기록해 놓았단 의미로 해석할수 있어요 ㅋ

하지만!!! 여기서 차이점은 ㅋㅋ

  1. 음성 신호는 In Phase 로 저장한다
  2. MR 은 Out of Phase 로 저장한다 ㅋㅋ

자… 감이 오시지요? ㅋㅋ

스테레오 PCM 신호에서 왼쪽에서 오른쪽 신호를 빼버리거나, 오른쪽에서 왼쪽 신호를 빼주면

음성 신호는 동위상이라 제거 되고 MR 만 남게 되는 것입니다 ㅋㅋ

생각 보다 쉽지요??

%% PCM 파일 로드

[data,fs,bit] = wavread('booster.wav');

 

%% MR 생성

mr = data(:,1)-data(:,2);

mrs = [mr mr.*(-1)]; wavwrite(mrs,fs,bit,'booster_mr.wav');

wavwrite(mrs,fs,bit,'booster_mr.wav');

 

자 그럼 mono 형태의 MR 을 얻게 될것이에요 ㅋㅋ

그걸 스테레오로 바꿀려면?? 위에서 설명한 개념을 반대로 수행하면 되겠죠? ㅋㅋ

위의 MATLAB 코드 참조하세요 ㅋㅋ

그럼 이제 Adaptive Filter 를 써서 원래 신호에서 우리가 얻은 MR 을 제거하고 목소리만 강조된

데이터를 얻어내면 되겠네요 ㅋㅋ

 

Adaptive Filter 의 경우 잘 모르면 그냥 넘어가세요 ㅋㅋ 궁금하신분들 코드 보시구요 ㅋ

<Figure2. Adaptive Filter 기본 블록도>

 

대충 이런 개념인데… ㅋ 흠.. ㅋㅋ 여튼 우리가 하고자 하는 것은 STFT 이니까요 ㅋㅋ

적응필터에 대해서 공부하는 것은 다음기회에 포스팅을 할께요 ㅋㅋ

 

이렇게 해서 MR 뺀 쌩목소리 버전을 뽑았습니다 ㅋㅋ

하지만!!! 이렇게 한다고해서 배경음악이 다 빠지는 것은 아니에요 ㅋㅋ

다만 목소리 부분이 아주 크게 강조가 되었을 뿐 ㅋㅋ 들리긴 들리더라구요 ㅋㅋ

 

시중에 돌아다니는 MR 제거 프로그램이 있어서, 그 프로그램으로 뽑은 파일과

제가 만든 파일을 비교해 보았는데 크게 차이가 없어요 ㅋㅋ

파일 올려드릴 테니 비교해 보세요 ㅋㅋ

 

<Figure3. MR 제거해주는 쪽바리 프로그램 ㅋ>

제 귀에는 두개 다 얼추 비슷하게 들렸습니다 .ㅋㅋㅋ

 

이제 STFT 할 차례 ~ ㅋㅋ

 

<Figure4. STFT MATLAB 코드>


쿨하게 코드부터 떄려놓고 가겠습니다 ㅋㅋ

포스팅 1,2,3번을 보신분들은 코드가 이해가 가실거라 믿어요 ㅋㅋ

 

파라미터들은 3번 포스팅에서 말씀드렸듯이, 시행착오를 거쳐가며 얻어냈습니다.

다만, 이때 고려해줄수 있는 사항은 아이유가 부스터를 쓸 때 최소 1초 이상은 질러

주는 것 같으니까 이부분을 고려서 Time Resolution을 결정할 수 있다는거죠 ㅋ

STFT 를 너무 빡세게 해버리면 훗날 그래프 볼 때 힘드니까 잘 결정하세요 ㅋㅋ

 

고로!!! 좋은 CPU 와 좋은 GPU 가 있어야 연구도 잘한다!!!

 

 Figure 5. STFT Spectrogram

아… 망할 스팩트로그램 ㅋㅋ 당최 무슨소린지 알수가 없습니다 ㅋㅋ

 

이따위로 나와서 포기하면… 안되요 ㅋㅋㅋ

인간의 목소리가 낼 수 있는 주파수 영역대를 찾았어요 ㅋ

300Hz ~ 3.4kHz 까지 낼 수 있더군요.

아이유가 부스터 쓰는 음이 300Hz 보다는 높을거라는 생각이 들더군요

잠시뒤에 자세히 말씀드리겠지만, 우리가 흔히 생각하는 1옥타브 '라' 가 440Hz

이구요, 이 주파수가 기준 주파수가 되어 반음 올라갈때마다 배씩

올라가요 ㅋㅋ

그래서 500 Hz 부터 1kHz 까지 봐보자! 라고 생각한 것입니다 ㅋㅋ

 

자 그럼.. 그림 나갑니다 ㅋㅋ

 

 

Figure 6. STFT 결과 Mesh Graph

 

오 뭔가 보이는 것 같지요??? ㅋㅋ

그럼 좀더 선형적으로 보기위해서 Contour 때려볼까요? ㅋㅋ

 

Figure 7. STFT 결과 Contour Graph

 

야호~ ㅋㅋㅋ

3단 부스터를 쓰는 부분이 아주 딱 들어 맞네요? ㅋㅋ

해당 주파수를 구해서 음계를 구해서 써놓고 아이유 좋은날 악보를 찾아서 부스터 부분 음계를 구해

비교할 일만 남았습니다.

1단 : 659.45Hz

2단 : 698.48Hz

3단 : 738.86Hz

의 주파수를 갖고 있군요 ㅋㅋ 와 이렇게 길게 소리를 내면서 음이 흔들리지 않았다니 ㅋㅋ

아이유 너 노래좀 잘하는구나? ㅋㅋㅋ

 

여튼, 이제 저 주파수가 피아노 음계의 어떤 음에 해당하는지 볼까요? ㅋ

 

     Figure 8. 피아노 음계의 주파수

 

위에서 잠깐 말씀드린 것 처럼, 1옥타브 '라' 가 440Hz 로 기본이 되용 ㅋㅋ

여기서 반음 올라갈때마다 배씩 증가 한답니다 ㅋㅋ

그래서 주욱 주파수를 구해서 써봤어요 ㅋㅋ

우리가 흔히 생각하는 2옥타브 미, 파, 파# 의 음계를 불렀다고 공학적으로 유추할수 있군요

 

그럼 악보를 찾아서 비교해 볼까용? ㅋ

 

Figure 9. IU 좋은날 악보

짜안~ ㅋㅋㅋ

부스터 부분에 제가 가사를 썼습니다 ㅋㅋ

오.. 앞쪽에 #이 세개나 붙은 악보군용 ㅋㅋ

그럼 샵 플랫 관계 잘 생각하면서 계이름 읽어보니!!!

 

앗!! 2옥타브 미, 파, 파# 으로 정말 정확하게 일치하는군요!!!

와 간지다 진짜 ㅋㅋㅋ

아.. 글을 졸라 쓸라니까 힘드네 ㅋㅋ

 

원래는 코드도 다 올릴려고 했지만 힘든 관계로 m-file 로 첨부합니다 ㅋㅋ

궁금하신분들은 다운로드 받아서 한번씩 해보세요 ㅋㅋㅋ

 

코드 전문과 제가 잘라놓은 파일들을 첨부할 테니까 한번씩 해보시면 잼있을거에요 ㅋㅋ
이 전 과정을 문서화 해놓은 PDF 파일도 첨부합니다

이걸로서 앞서 3개의 포스팅에서 설명한 STFT 방법에 대해 감이 오셨을 거라고 생각되네요 ㅋ

 긴 글 읽느라 수고 많으셨습니다 ㅋㅋㅋ

그럼 즐거운 코딩, 즐맷랩 되세요 ㅋㅋㅋ

 

프로젝트 결과물

  1. IU.m
  2. STFT&IU.pdf
  3. Booster.wav : 3단 부스터 쓰는 부분만 캡쳐함
  4. Booster_mr .wav : Matlab 을 이용해 MR 만 뽑아낸 파일
  5. Booster_vocal.wav : Adaptive filter 를 이용해 목소리만 뽑아낸 파일
  6. Boost_vocal.wav : 상용화된 쪽바리 프로그램으로 MR 제거한 버전 (비교용)
    (눼미, 이거 파일용량 때문에 따로 올려드릴께요 ㅋ)


     

신고
Posted by J.Bear

일본에서 날라온 방사능에 제 몸이 오염되어서 정말로 힘이 듭니다 ㅠㅜ

그냥 기절해 있는것 같아요.

저는 강인한 남자이기 때문에 절대로 감기!!! 따위는 걸리지 않습니다. ㅋㅋㅋ

지난 포스팅에서는 어떻게 시간이 변함에 따라 주파수가 변해가는 신호가 있을때

어떻게 구별하면 좋을까? 라는 질문을 던지고 FFT 의 시간적인 한계에 대해서 말씀드렸었지요 ㅋ

그 해결책이 STFT 라는 것 까지 말씀드렸구요 ㅋ

그래서 오늘은 STFT 의 개념에 대해서 바로 논해보도록 하겠습니다. ㅋㅋㅋ

DSP 수업시간이 생각나시겠지만, 최대한 재미있고 쉽게 풀어나가볼께요 ㅋ

STFT 는 시간에 따라 주파수 성분이 변하는 신호의 time - frequency  정보를 어떻게 효율적으로 분석할수 있을까?

하는 개념에서 나오게 된것입니다.

일단 'Spectrogram' 이 무엇인지 아셔야 할것 같습니다. ㅋ 그래야 생소한 개념인 시간-주파수 개념을 이해할수 있어요 ㅋㅋ


        <Figure 1. Spectrogram>

 

<Figure 2. MeshGrid>

이런식으로 나오는 그래프가 Spectrogram 이에요 ㅋㅋ

아래쪽에 보이는 Figure 2 는 Spectrogram 에서 얻은 정보를 MeshGrid 에 표현해 본 것입니다 ㅋ

이렇게 뿌리는 부분에 대해서는 차차 공부해보도록 해요 ㅋㅋ

1. Sampling 된 신호가 막연하게 길지만, 주기적이지 않을때 DFT 를 하기 위해서는 긴 시간을 기다리게 되는 경우
    가  발생한다.
2. 이렇게 오랜 시간을 기다려 spectrum 을 얻었다 하여도, 시간적인 변화의 많은 부분이, 계산된 spectrum 에
    나타나지 않는 한계를 갖는다.
3. 그래서, spectrum 성분이 변하지 않는 짧은 악절의 연속을 분석한다.
4. 이 개념을 공식화 하기 위해서, X[n] 매우 긴 신호라고 가정한다.

이런 순서로 STFT 가 나오게 된 것이지용 ㅋㅋ

한마디로 DFT 를 하는데, 원하는 윈도우를 정해서 적당히 옮겨가면서 계속 DFT 를 해서 시간영역에 따른 주파수 정보를 얻어내겠다 라는 것입니다.

어쩔수 없이 수식이 들어가야 하겠네요 ㅠㅠ

제가 공부하면서 정리해논 노트를 한번 짤라서 붙어넣어볼께요~


잘 보이시나용? ㅋ

글씨가 악필이라서 죄송합니다 ㅋㅋㅋㅋ

위에도 언급이 되어있지만, 시간에 대해서 계산된 스팩트럼들의 합이 STFT 인데 이것을 2차원적으로 표현하기에 무기가 있죠 ㅋㅋ.

그래서 Spectrogram 이라는 것이 나오게 되었어요 ㅋㅋ

아... 또 글이 엄청 길이지넴 ...

아직 이 글을 읽으시는 분들이 없지만, 분명히 읽는 분이 생기신다면,

이따위것 말고, 그러니까 이걸 어떻게 하는지 코드나 올려주라!! 하시는 분들이 대다수겠지요? ㅋㅋ

하지만 저도 해야할 연구가 남았기에 ~ ㅋㅋ

오늘 포스팅은 여기까지 ~ ㅋㅋ

다음번 포스팅에서는 그래서 Matlab 으로 어떻게 STFT 를 하는지,

그 결과 배열이 각각 어떤것을 의미하는지, 위의 Spectrogram, MeshGrid 는 어떻게 그리는지에 대해 설명하고

m-file 을 올려드리도록 할께용 ~ ㅋㅋㅋ

제가 공부하면서 정리해 놓은 PDF 파일도 함께~ ㅋㅋ

그럼 다음 포스팅에서 뵈요~

신고
Posted by J.Bear


첫번째 포스팅이네요 ~
이 글을 쓰기 위해서 그동안 얼마나 기다려 왔던지 ㅋㅠㅠ

공학을 하시는 분들이라면 진저리가 날만큼 싫어하는 사람이 몇 명 있지요 ㅋㅋ
그중에 최고는 Furier 이놈이 아닐까 싶습니다.
FT, DFT, FFT 어딜가나 이놈 이름이 들어가서 이제는 정말로 F 자만 보면 이게 Furier 의 약자가 아닌가 싶기도 하죠

오늘 다루어볼 개념은 약간 생소할 수도 있지만, STFT ( Short-Time Furier Transform) 이라는 개념입니다.
한글로는 '국소 푸리에 변환' 이라고 하더군요 ~ ㅋㅋ

기존의 푸리에 변환은 해당신호가 주파수 영역으로 보았을때 어떤 주파수의 성분을 얼만큼 가지고 있는지 매우
가시적으로 잘 표현해 줍니다.

이를 이용해서 신호의 분석을 아주 간지나게들 하는 연구들이 많지요 ㅋㅋ Data Acquisiton 후에 뭘 해야할지 모르면 일단 FFT 부터 해보고 시작하는 경우도 많으니까요 ㅋ

하지만 이런 FFT 의 맹점!!!! 이 있었으니~~~ ㅋㅋ

시간의 흐름에 따라 신호의 주파수가 변했을 경우에, 어느 시간대에 주파수가 어떻게 변했는지를 알수가 없다는 것이죠.

참으로 안구에 습기가 차는 일입니다.

잘 감이 안오시지요??? ㅋㅋ

아래와 같은 그림을 보시죠~


이렇게 시간에 따라서 주파수가 변하는 cos 신호를 만들어 보았어요. 앞에서 부터 7Hz, 14Hz , 21Hz, 28Hz 입니다.

5초에 한번씩 신호의 주파수가 변화하고 있어요 ㅋㅋ

이것을 FFT 하면 어떻게 될까요?

각각의 주파수 영역대에 맞추어서 피크를 보여주겠죠? ㅋㅋ

근데!!! 인간의 욕심이란 끝이 없습니다. ㅋㅋ

시간이 지남에 따라서 주파수가 변화하고 있으니까 우리는 0~5초까지는 7Hz, 5 -10초까지는 14Hz, 10~15초까지는 21Hz 이런식의 정보를 얻고 싶었던 것입니다.



 


어때요? ㅋㅋ 잘 나오지요? ㅋㅋ

제가 만든 코사인 신호의 Sampling Rate 가 100Hz 라서 ㅋㅋ 여튼 요따위로 나와용 ㅋㅋ

그럼 된거 아니야!! 라고 반문하시는 분들도 있을 꺼에요 ㅋㅋ

이 FFT 결과로만 보면 , 아 전체 신호에 7, 14, 21 28 Hz 성분의 신호가 있었구나~~ 라고만 알수 있지

몇초에 신호의 주파수가 변했는지를 알 수가 없자나요? ㅋㅋ

그래서 나오게 된 개념이 STFT 입니다 ㅋㅋ

이 것을 하면 이 신호가 몇초에 한번씩 변화 했는지를 알 수가 있어요 ㅋㅋ


그럼 STFT 의 자세한 방법에 대해서는 다음 포스팅에서 다루도록 할께요 ~ ㅋㅋ

제가 눈치보이는 석사 1학기 대학원 생이라서 길게 포스팅을 할수가 없어요 ㅋㅋ

그럼 일단 요기까지만 하고 다음에 이어서 올려드릴께용~ ㅋㅋ

첨부파일은 위의 내용에 해당되는 m-file 입니다 ㅋ 기본적이지만 필요하신분 참고하세요

신고
Posted by J.Bear