이틀에 걸쳐서 완성했습니다.

C# 이란 프로그램이 객체 지향으로 굉장히 쉽고도 강력한 기능을 제시해 준다고 하여 공부를 시작했었지요 ㅋ

사실 Labview 라는 강력한 프로그램이 있고, 신호처리 부분에서도 Matlab 이라는 강력한 프로그램이 있기에 크게 도움이 되지는 않을거라고 생각했었지만 윈도우 프로그래밍도 하나정도 할줄 알면 큰 도움이 될것이라는 생각에서 시작했었습니다.

어느정도 되었다고 생각하고 자체 프로젝트를 진행하기로 마음먹고
무엇을 할까? 하다가 Radix-4 FFT 를 구현해서 그래프로 표현해 주는 프로그램을 만들기로 하였습니다.

위에서 언급한 프로그램들이 있다면 내장함수를 이용해서 간단하게 실험해 볼수 있지만, 사용하지 않으시는 다른 분야의 연구자들은 간단한 주파수 분석을 하여 주파수 분포가 어느쪽에 대략적으로 위치하는지 확인해 보고 싶으신 경우가 있을것이라고 생각했습니다 ㅋ

사실 저도 머 학부때 위의 프로그램들을 잘 사용하던 것은 아니였으니까요 ㅋㅋㅋ

그리고 가장 큰 생각은!! ㅋㅋ

혹시나 Radix 4 FFT 구현해 오라고 숙제 내주시는 교수님들 때문에 네이버 검색하다가 이 홈페이지에 들어오게 되지 않을까 하는 나의 바램? ㅋㅋ
(굉장히 조회수에 신경쓰는 멘트네 ㅋㅋㅋ)


ㅋㅋ

여튼 일단 사진 부터 ㅋㅋ



대충 요로코롬 생겼답니다 ㅋㅋ

사실 제가 처음이 C++ 로 이것을 구현했을 때는 FFT 포인트수가 높아질 때 발생하는 Stack Overflow 를 막기 위해서 메모리를 할당하고 사용하였어요 ㅋㅋ

무적의 함수 malloc ! ㅋㅋ

근데 C# 에서 가비지 컬렉션 개념이 도입되면서 new 라는 명령어로 배열에 heap 메모리를 할당해 주어야 한답니다 ㅋ

사실 배열로 해도되고 List 로 해도되고 ㅋ

뭐 여타 컬렉션을 아무거나 사용해도 문제는 없지요 ㅋ

근데 여기서는 배열로 한번 해보았어요 ㅋ 배열을 사용하는 방법이 기존의 C 에서 선언하고 사용하던것과 는 달라서 연습좀 해볼려고 ㅋㅋ

또 문제는 typedef 가 안된다는것 ㅋㅋ

struct 로 선언해놓고 typedef 처럼 사용할수 있어용 ㅋㅋ 자세한거는 나중에 C# 강의에서 설명해드릴게요 ㅋ

간단하게 말씀드리자면 #define 문을 C# 에서 사용하고 싶으면 Constants 와 같은 클래스를 하나 생성해 놓고
Constants.(  ) 라는 식으로 #define 문을 대신 할 수 있습니다.

Decimation In TIme 방식으로 구현했는데요 저는 재귀함수 콜 형태로 구현했어요 ㅋ

아래에 올려드리는 것은 Radix4 FFT 의 핵심이라할수 있는 부분이지요 ㅋ

Twiddle Factor 를 구해서 값들을 구해가는 알고리즘 ㅋ
자세한것은 이것또한 나중에 DSP 부분 포스팅에서 알려드릴게요 ㅋ



아나 하나도 안보이네 제길 ㅋㅋㅋ

아래는 제가 배포하는 설치 화면 ㅋㅋ



요래요래 설치를 하면 요론 아이콘이 나오지요 ㅋㅋ


ㅋㅋㅋ 아이콘 예뿌네 ㅋㅋㅋ

아래는 설치파일 ㅋㅋ

필요하거나 궁금하신 분을 한번 설치해서 써보세요 ㅋㅋ


test 파일은 제가 코사인 함수파형 저장해 놓은것 ㅋㅋ


아 쓰다보니까 생각이 나네 ㅋㅋ

FFT 포인트 수 바꾸면 안될수도 있을듯 ㅋㅋ 이거 한다면서 하다 말았군 ㅋㅋㅋ
하지만 1024 포인트는 무조건 동작함 ㅋㅋ

나중에 필요한 사람들이 있다고 하면 시간날때 한번 업데이트 버젼을 배포해야겠군 ㅋㅋ
특징점들 잡아서 해당 주파수와 크기를 정확히 알려주는 기능도 좀 추가를 해야겠고 ㅋㅋㅋ

하지만 이것은 연습용이였으니까 ㅋㅋㅋ
정 필요하신 분들이 있다면 댓글로 요청하세용 ㅋ

프로젝트 파일이 필요하신 분들이 있으면 댓글로 멜주소 써서 요청하세요 ㅋ 보내드리겠습니다 ㅋ
걍 C++ 로 해놓은 것도 있으니 그것이 필요하시면 고걸로 드리고 ㅋ
사실 이 코드가 더 잘짠것 같은 느낌인데 ㅋㅋㅋ

여튼 오늘은 여기까지 ㅋㅋ
저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by J.Bear
휴....

전에 C++ 로 Radix 4 FFT 를 구현하였다.

굉장히 잘된다.

갑자기 C# msChart 에 삘이 꽃히는 바람에 C# 으로 구현해서



그래프로 바로 볼수 있다면 좋겠다 라는 생각을 했다.

물론 MATLAB 이라는 멋진 프로그램이 있긴하지만, 그래도 공부한것을 정리해볼겸 ㅋㅋ 시!작!했!다!

근데!!! 망했다. ㅠㅠ ㅋㅋㅋㅋ

C# 은

typedef 도 안되고 ㅋㅋ #define 문도 걍 클래스 하나 만들어서 static 으로 선언해놓고 접근해야하고

메모리 할당도 지가 자동으로 해서 가비지 컬렉션이 알아서 비워준다고하는데

에효 ㅋㅋㅋㅋ

걍 배열쓸껄 이미 컬렉션 연습해본다고 List<> 로 다 짜놨는데 ㅋㅋㅋ 앰뱅 ㅋㅋㅋ

여튼 이게 완성이 되면

신호처리와 프로그래밍을 막 배우려는 사람이나 MATLAB 을 못하거나 안깔려있어서 여건이 안되는 사람들이
간단한 주파수 분석을 해봄에 있어서 비쥬얼적으로 효과적이지 않을까?

특징점들을 검출해서 정보를 알려주는 기능도 추후 버전업을 하면서 구현한다면 꽤 쓸만한 프로그램이지 않을까 싶다.

지금 GUI 는 이렇게 허접하다.

시간이 지나면 ㅋㅋㅋㅋ 똑같이 허접할것 같다 ㅋㅋ

난 미적 감각이 없으니가 ㅠㅠ

혹 미적 감각이 있으신 분들 요론 비슷하게 예쁘게 그림파일로 좀 만들어 주실수 없나용??? 

 [##_http://jbear.tistory.com/script/powerEditor/pages/1C%7Ccfile8.uf@122F93474F14C3400919D2.PNG%7Cwidth=%22630%22%20height=%22460%22%20alt=%22%22%20filename=%22a123123.PNG%22%20filemime=%22image/jpeg%22%7C_##]

저작자 표시 비영리 동일 조건 변경 허락
신고
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