티스토리 툴바


이번에 간단히 직렬 포트serial port 로 데이터를 전송하는 툴을 만들고 있습니다.

회사 내부에서 사용할 목적인데, 비교적 간단한 프로그램임에도 리팩토링을 마음먹고 하면서 진행하다보니 시간이 좀 걸리는군요.
3일 정도해서 대부분 개발이 끝났고, 현재는 오류 처리 부분만 조금 남겨 둔 상태입니다.

기능은 뭐 정말 간단합니다. 전송할 파일 선택하고, 내보 낼 직렬 포트 선택하고, 포트 속도 등 설정한 다음에 Send 버튼 눌러주면 착착착~ 데이터 보내면서 진행 상황 보여주는 정도입니다.

굳이 이 녀석을 끌고 와서 포스팅을 하는 이유는... 근래에 이런 작은 프로젝트는 정말 오랜만에 하게 되었는데, 큰 프로젝트에서는 쉽게 꺼내어 보기 힘들 수 있는 객체-지향object-oriented 에 대한 기본 개념들에 대해 다시 느낄 수 있는 기회가 되었기 때문입니다. 그래서 그에 대한 고찰을 통해 한번 더 곱씹어 보고자 합니다. ^^

전체적인 구조는 그림에서 보는 정도로 작은 프로그램입니다. 만만한 MVC 패턴을 적용해서 개발했구요. 그림에서 주황색 계열이 View, 녹색은 Controller, 파란색 계열이 Model 로 보시면 되겠습니다.

GUI 쪽은 wxWidgets 이용했구요, 그렇다고 멀티-플랫폼 지원까지는 아니고... 용도가 용도인지라 그냥 Windows 용입니다.

podo... 이 녀석들은 제가 만들어서 쓰는 자잘한 프레임워크입니다.

podoFile 은 디스크 상의 파일을 가리키는 클래스로, open/close 및 read/write 가상 메쏘드가 마련되어 있구요.
podoFile 을 상속한 podoCommPort는 podoFile과 같은 인터페이스로 Serial/Parallel 포트를 나타냅니다. 즉, podoFile 객체 하나는 파일 하나를 가리키고, podoCommPort 객체 하나는 역시 직/병렬 포트 하나를 가리킵니다.

이렇게 객체 하나가 물리적 혹은 논리적인 장치나 실체 하나를 의미하게 하는 것이 바로 객체-지향object-oriented 의 기본이라고 하겠습니다.

다만 podoFile 에 대한 설계가 완벽치 않은 부분이 있습니다.


FileTransferer 는 podoFile 에서 podoFile 로의 데이터 전송만을 담당합니다.


이번엔 View 쪽을 살펴 보겠습니다.

FileSelector는 파일 선택 다이얼로그를 띄워서 파일을 선택하고, 선택한 파일의 경로를 알려주는 역할을 합니다.

FileSelector는 FileType을 이용하여 선택할 파일에 대한 필터링을 수행합니다.

Settings 는 INI 파일을 통해 설정 정보를 제어하는데 이용됩니다. 지금은 별다른 설계 없이 그냥 get/set 정도의 메쏘드들만 존재하는 다소 무식한 (하지만 할 일은 다 하는) 녀석입니다. ^^

Settings 의 리팩토링은, 아직 설계에 익숙치 않으신 분들이 해볼만한 과제가 아닐까 싶습니다.

행복한 고민, 선택은 여러분이 하시기 바랍니다. ^^


Pattern Match.

Code 2008/09/26 17:07

오늘 갑자기 문자열 와일드카드wildcard 매치가 필요해져서...
이거 간단하지 않겠다 생각하면서 잠시 머뭇거리다가...
순간적인 재귀호출 아이디어로 아래 코드를 작성.아, 내가 만들었지만 참으로 아름다운 코드가 아닐 수 없다라고 허세를 부려 봅니다... ^^

Resampling

Digital Audio 2008/09/05 10:24


샘플링 주파수sampling frequency를 낮출 때, 즉 다운down 샘플링 할 때, 그 차이 영역에 들어있는 고주파는 제대로 표현되지 못하고 에일리어싱aliasing이 일어납니다. 이때 높은 주파수가 마치 더 낮은 주파수인 것처럼 거울반사(mirroring)되는 현상이 생기고요. 그래서 스펙트럼spectrum을 보면 보통 고주파가 강조되는 현상을 볼 수 있습니다. 말하자면, 48K를 44.1K로 다운 샘플링할 때, 24K 성분은 24 - 22.05 = 1.95K 만큼 거울반사되어 22.05 - 1.95 = 20.1K 성분으로 에일리어싱됩니다. 이런 현상이 24K~22.05K까지 일어나게 되는 것입니다.

이런 현상을 막기 위해 앤타이-에일리어싱anti-aliasing 처리를 하게 되는데, 먼저 급격한 로-패스 필터low-pass filter를 통해서 22.05K 이상의 주파수를 최대한 깎아내 버리고 다운 샘플링을 하게 되면 22.05K 이상의 성분이 에너지를 거의 가지고 있지 않아서 에일리어싱이 극소화됩니다. (물론 이론적으로는 에일리어싱이 전혀 일어나지 않아야 하겠지만, 실제에서 로-패스 필터가 이상적일 수는 없지요) 본 과정은 ADC 에서 흔히 수행되구요. 고가의 ADC들은 128, 256배 오버 샘플링oversampling 후 이를 타겟 샘플링 레이트로 다운 샘플링하는 형태를 가지고 있습니다. 아날로그는 무한대 샘플링 레이트를 가진다고 볼 수 있으므로, 이를 디지털로 변환하는 과정 자체가 다운 샘플링이라고 하겠습니다.

사용자 삽입 이미지

반대로 샘플링 주파수를 높일 때, 업up 샘플링 때에는 보간interpolation을 흔히 사용합니다. 보간법은 존재하지 않는 중간값을 유추하여 만들어내기 때문에 왜곡이 생길 수 있는데, 44.1K를 48K로 바꿀 때를 가정해보면... 44.1K의 데이터가 22.05K 이상은 표현하고 있지 못하고 있기 때문에 이것을 그대로 48K로 옮겼을 때 22.05K 이상에 복사파 성분들이 형성됩니다. (다운 샘플링에서의 에일리어싱과 같은 원리)
이번에는 반대의 과정을 통해 왜곡을 최소화할 수 있습니다. 우선 업 샘플링을 수행한 후에, 로-패스 필터를 통해 22.05K 이상에 생성된 잡음 성분들을 최대한 잘라내 버립니다. 혹은 적절한 인터폴레이션 메쏘드method를 이용해서 음악적으로 의미있거나 들어줄만한 고주파를 일부러 생성하기도 합니다. sinc 함수를 이용한 보간, 또한 보간 참조 구간을 256x 로 길게 잡는 등의 방법도 사용합니다.

보간법에는 워낙 다양한 종류가 있는데, 요즘에는 파형이 아닌 스펙트럼을 기준으로 중간값을 유추하는 방법도 쓰이고 있습니다.

이러한 기술들은 음향 뿐만 아니라 영상에도 동일하게 적용됩니다. 업/다운 샘플링은 그림의 크기를 늘리거나 줄이는 것과 본질적으로 완전히 동일합니다.