STFT 의 세번째 포스팅이네요 ~ ㅋㅋ

앞선 2개의 포스팅에서 STFT 가 왜 생겨나게 됐는지, 기존의 FT 방법들과의 차이점이 무

 

엇인지에 대해

간략하게 알아보았지요? ㅋㅋ

오늘은 1번 포스팅에서 다루었던 신호를 직접 STFT 해봄으로써

Matlab 을 이용해서 어떻게 STFT 를 하는지에 대해 알아보도록 하겠습니다

Matlab에서 STFT 를 지원해주는 명령어는 spectrogram 입니다 

함수이름이 참 직관적이죠? ㅋㅋ 앞쪽 포스팅을 보신분들은 무슨 말일지 아실듯

결국 우리가 얻어내야 하는 이미지가 이 spectrogram 인 것입니다 ㅋㅋ

1차 포스팅에서는 주파수가 7, 14, 21, 28Hz 가 5초에 한번씩 변하게 했었는데요

이번에는 STFT 가 갖는 장점을 눈에 볼수 있도록, 순서를 바꾸어서

4초가 지날때마다 14, 7, 28, 21 Hz 로 변하도록 신호를 만들었어요 ㅋ

 


요부분은 뭐 다들 잘 아시겠지용? ㅋㅋ

다 하고나서 코드 전문과 자료를 함께 첨부할테니 잘 안보여도 그냥 그랬구나하고 지금은 넘어가주세요 ~ ㅋㅋ

다음으로 이신호를 FFT 해봐야겠지용? ㅋㅋ

저는 귀찮아서 요론식으로 한번에 뿌려버렸어요~

여러분들은 코드를 요로케 짜시면 안대겠지요? ㅋㅋ

N = 11;
ft = fft(x,2^N);
psd = abs(ft);

요론식으로 알아보기 쉽도록 ㅋㅋ

여튼 지금은 귀찮으니까 패스~~ 2048포인트로 FFT 했구용~

제가만든 신호 주파수는 100Hz , 위에서 알수있지요??

FFT 를 모르시는분들은 댓글달아주세요~ ㅋ 기본중에 기본이지만 요청이 들어오면 그것도 간단히 포스팅 할께요






요론식으로 아주 간지나게 나오네요??

숫자가 잘 안보이실지 모르겠지만, 7 14, 21, 28Hz 가 순서대로 표현되네요 ㅋ

여기서 우리는 이렇게 생각할수 있겠죠

하지만, 우리는 14, 7, 28, 21 Hz 를 순차적으로 넣어준건데, 여기서는 그냥 이러한 성분들이 들어있다고만 보여주네요

아이 짱난다. ㅋㅋ 그래서 STFT 를 해봐야겟지요?

자 그럼 Command 창에

>>doc spectrogram

을 쳐서 어떤형태의 입력을 넣어줘야 어떤형태의 출력을 뽑아주는지 알아야겠지요?


와 간지나는 Matlab. ㅋㅋ

이제 저것들이 뭘 의미하는지 알아보지요 ㅋㅋ

1. S : Spectrogram 의 S 를 따다 쓴 것이 아닌가 라는 저만의 생각 ㅋㅋ 여튼 STFT 한 결과를 여기에 저장하겠구나~~
2. x : 입력 Sinal 이죠. ㅋ 요 신호를 STFT 해주겠구나~~~
3. window : 구간을 정해가며 샘플을 뽑아다가 FFT 하는것을 반복할테니까 그 구간을 결정한 window 를 집어 
                  넣어 줘야겠구나~~~~~~~~~ (Window 개념을 모르시는분은 공부하세요!!)
4. noverlap : window 를 취해가면서 샘플을 선택하는데 Overlab 되어지는 샘플갯수를 입력하는 란이에요
                   빡시게 Overlab 할수록 시간축 해상도가 올라가겠지요?
5. F : FFT 를 몇포인트짜리로 돌릴것이냐? 이거에요 ㅋㅋ 높일수록 주파수 해상도가 올라가겠죠??
6. fs : 입력신호의 Sampling Rate 를 넣어주라는 소립니다. 넣어줄 경우에 주파수와 시간 정보를 함수내에서 직접
         계산해서 실제 정보대로 만들어 주겠단 소리에요.
7. 출력단의 F, T : 설명 안해도 되겠죠? ㅋㅋ

아주 나이스 합니다 ㅋㅋ

그럼 위 신호를 STFT 를 해보기 위해서 코드를 작성해 보지요


오 간단하다 ㅋㅋ

Set Parameter 에서 필요한 정보를 모두 제공해 주었지요? ㅋ

저는 주파수 해상도를 높인 대신에, 시간축 해상도를 낮췄어요 ㅋ

어차피 4초에 한번씩 변하는 신호였으니까 저정도로 잡아도 충분히 변화를 볼수 있고

주파수 해상도를 높인 것은, 여러분들에게 좀더 깔끔한 라인 스팩트럼을 보여드리고 싶어서입니다


오옷~

시간에 따라 변하는 해당 주파수가 붉은색으로 표시되는군요.

해단 주파수의 Power 가 높기때문에 붉은색으로 보이는것이에요

하지만!! 시간축 해상도를 2초 정도로 잡아놓아서 4초 근방에서 변하는 신호가 굉장히 뭉개져서 나오네요

그렇다면! 시간축 해상도를 좀 높여볼깝숑??


같은 코드에 R = 40 , 즉 윈도우의 길이로 40샘플을 선택했더니 시간축 해상도는 올랐는데

주파수 영역이 뭉개져서 정확한 주파수를 찾기가 힘들군요 ㅋㅋ

자 여기서 느끼셔야 할것은, 아... 시간과 주파수영역의 해상도가 상호 배타적이구나.

윈도우 길이와 FFT 사이즈를 잘 결정해서 최소한의 연산량으로 내가 원하는 정보를 알아 내야 겠구나!!

라고 생각하여야 공학을 하는 사람이겠지요? (너나 잘하세요라고 생각하시는거 다 알고있습니다 ㅋㅋㅋ)

이런 Calibration 과정은 여러분들이 직접 해보시기 바랍니다.

여기서 멈추면 서운하죠??

위의 스팩트로그램을 3D 형태로 뿌렸습니다

Mesh-Graph 라고 불리우죠? ㅋㅋ 오른쪽은 그 영상을 위에서 내려다본 투영 영상이에요

Contour 라고 합니다.

이 그래프에 관한 코드는 첨부해드린 m - file 에서 확인하시기 바랍니다 ㅋ

저도 얼릉하고 공부해야되서 ㅋㅋㅋ

시간에 따라서 신호의 주파수가 어떻게 변했는지를 단편적으로 보여주는 쉬운 예 였습니다.

제가 STFT 를 공부할때 정리했던 정리 파일과, 위 코드가 포함된 m-file 을 첨부할테니

필요하신분 참고하시구요

잘못된점이나 의문사항 있으면 댓글로 Feedback 해주시기 바랍니다 ~ ㅋㅋ

다음 포스팅에서는

지금까지 포스팅한 STFT 를 이용해서

아이유 '좋은날' 에 나오는 3단 부스터 부분 있지요??

그부분의 음계를 공학적으로 유추해서 가정해놓고, 악보를 찾아서 실제로 비교해 보아

STFT 를 잘 Calibration 했을때 얼마만큼의 정확도를 보여줄수 있는지를 알아보는

간단한 개별 실험을 해서 올려드리도록 하겠습니다~

그럴러면 Matlab 을 이용해서 MR 제거버젼 파일을 뽑아내야 하는데 ㅋㅋ

그건 따로 포스팅하고 초점은 STFT 에 맞추도록 하겠습니당. ㅋㅋㅋ

여러분들과 관심 있으시면 한번 해보세요~

긴글 읽어주셔서 감사하구요~ 다음 포스팅에서 뵙겠습니다 ~ ㅋ


 

Posted by J.Bear

댓글을 달아 주세요

  1. 2011.05.16 17:38  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. 아리마 2011.05.26 12:05  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 ㅎㅎ
    너무 이해가 잘되게 포스팅 해주셔서.
    FFT 도 염치없지만
    포스팅 부탁드려요 ^_^;;

  3. Edmund 2011.08.11 15:54  댓글주소  수정/삭제  댓글쓰기

    너무 대단하세요. 많은 도움 받고 갑니다. 감사합니다^^

  4. 2011.12.04 16:22  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  5. 2012.02.06 20:55  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  6. J.Bear 2012.02.06 22:17 신고  댓글주소  수정/삭제  댓글쓰기

    NFFT 는 데이터 포인트 수가 맞습니다.

    궁금해하시는 점에 대해 직관적으로 대답해 드리겠습니다.

    데이터 길이보다 짧은 포인트수의 FFT 를 할 경우, 포인트 수만큼의 데이터 수로만 FFT 를 하게 됩니다.

    5만개의 데이터가 있는데 1024 포인트 FFT 를 한다면 앞쪽의 1024 개의 데이터만 가지고 주파수 분석을 하는 것이지요.

    반대로 데이터 수가 1000개인데 1024 포인트 FFT 를 한다면 나머지 24개의 데이터는 0 으로 채워서 FFT 합니다.

    이것을 Zero Padding 이라고 부르지요.

    꼭 2의 n 승으로 계산하는 것은 FFT 의 특성입니다.

    Butterfly 라고 불리우는 Bit Reverse 연산을 하기 위해서는 2의 n승개여야 하거든요

    4의 n 승 개로 하는 방법도 있습니다.

    이는 Radix 4 FFT 라고 불리우고요. Split FFT 등 다른 여러 방법이 있는데 FFT 에 대해 자세한 것은

    훗날 포스팅 하도록 하겠습니다.

    음성 신호와 같이 높은 샘플링율을 갖아 데이터 길이 매우 긴 신호의 경우에 주파수 분포를 보고 싶으시면

    다운 샘플링을 해서 분석하여 보던지 혹은 STFT 로 시간축에 따라 어떻게 주파수 분포가 변해가는 지를 보아야합니다.

    걍 2^10 이렇게 돌리면 데이터의 앞쪽에 위치하는 신호가 어떤 주파수 분포를 갖는지밖에 알수 없어요

    이해가 되셨기를

  7. 김덕현 2012.02.24 20:09  댓글주소  수정/삭제  댓글쓰기

    안녕하세요^^ 큰도움 되었습니다. 제가 FFT를 처음해봐서 잘몰라서 그러는데요. 4초마다 주파수가 변하자나요? 주파수영역대로 바꾸는 것 까진 이해되는데요. Amplitude는 뭘 의미하는 거죠?? 시간영역대에서는 4가 최대인데 주파수 영역에서는 800까지 올라가네요?? 초보라서 죄송 ...

  8. 지나가던1인 2012.05.12 01:19  댓글주소  수정/삭제  댓글쓰기

    지나가던 공학도인데 많은 도움 받고 갑니다 정말 감사합니다;ㅁ ;

  9. 공학도.. 2013.03.15 10:32  댓글주소  수정/삭제  댓글쓰기

    감사합니다.
    spectrogram을 몰라서 찾아보고 있었는데 자세하게 설명해 주셨네요.. !!

    아직 window 부분을 몰라서 더 알아봐야할 거같습니다...

    운영자 분과 같이 공학도를 위한 블로그를 해보고싶네요 !! 대단해요 !!

    • J.Bear 2013.03.15 21:14 신고  댓글주소  수정/삭제

      요즘은 너무 바쁜관계로 손도 못대고 있었습니다 ㅋㅋ

      적응필터 공부하던때가 언젠데 근 반년을 손놓고 업데이트를 안했군요 ㅋㅋ

      댓글이 달려서 들어와보니 ㅋㅋ

      아이유 삼단부스터 쓸때 썻던 글이네요 ㅋㅋㅋ

  10. 궁금해요 2013.09.04 12:44  댓글주소  수정/삭제  댓글쓰기

    두번째 그림에서 plot에 peak 값을 어떻게 저렇게 표시해요?
    X좌표, Y좌표 이렇게 상자안에 표시되어있던데 어떻게 하는건가요?

  11. 2014.02.09 16:14  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  12. 어려워요ㅠ 2014.04.29 10:20  댓글주소  수정/삭제  댓글쓰기

    저도 위에분과 같은 내용이 궁금해서 검색했는데 비밀댓글이네요ㅠ

    저는 time-frequency그래프에서 주파수가 peak를 찍을때 해당되는 간값을 얻을려고 알아ㅏ보고 있는 중인데 도저히 모르겠네요ㅠ.
    findpeaks 함수를 사용하면 될거 같은데 잘 모르겠어요.
    time-frequency가 배열로 저장이 되는건가요? 그래서 그 배열에서 frequency가 최고치인 위치를 찾으면 되는건가요.