Constant False Alarm Rate (CFAR)은 기본적으로 테스트하고자 하는 위치의 cell과 주변 cell의 관계를 보고 테스트 cell이 Target 인지 아닌지를 구분하는 알고리즘이다. 주변 cell과의 관계를 어떤 방식으로 비교하는가에 따라 여러가지 알고리즘이 존재한다. CA-CFAR, GO-CFAR, SO-CFAR, OS-CFAR, VI-CFAR, OSVI-CFAR등이 있다. 이 많은 알고리즘 중 간단하고 기본적인 CA-CFAR과 OS-CFAR에 대해 알아보자. CA-CFAR (Cell Average CFAR) CA-CFAR의 원리는 위 그림과 같다. 좌우의 Reference Cell의 평균에 Scale Factor T를 곱하고, ADT (Average Decision Threshold)를 합하여 CUT가 타겟인지 아닌지를 구분한다. ADT는 신호의 white noise를 고려하기 위해 더해준다. Scale Factor T와 ADT는 아래와 같은 공식으로 사용할 수 있다. 사용하려는 시스템에 따라 공식은 달라질 수도 있다. Pfa는 False Alarm 발생 확률을 나타내고, M과N는각 좌우의 Reference Cell의 개수를 나타낸다. OS-CFAR (Order Static CFAR) OS-CFAR의 원리는 위 그림과 같다. 좌우의 reference cell중 K번째 큰 값의 cell을 Reference Cell의 대표 값으로 정해 CUT가 타겟인지 아닌지를 구분한다. 보통 전제 reference cell의 크기 순에서 (3*N)/4 번째 cell이 성능이 좋다고 알려져 있다. CFAR 사용 예 아래 사진은 위 두 cfar을 사용한 예다. 파란색은 신호이며, 붉은 색은 char을 사용해 만든 threshold이다. 이 threshold보다 큰 값의 신호가 있는 위치에 실제 Tar...
파티클 필터(particle filter)는 칼만 필터(kalman filter) 와 마찬가지로 노이즈가 있는 환경에서 측정된 데이터를 필터를 사용해 실제 위치를 추정하는 도구다. 파티클 필터(particle filter)는 보통 가우시안 분포가 아닌 측정 데이터를 다루기 위해 사용된다고 한다. 물론 가우시안 분포의 데이터에서 사용하지 말라는 건 아니다. 본 포스트에서는 파티클 필터(particle filter)의 어려운 수학적인 내용은 제하고, 쉽게 예를 들며 필터의 동작원리에 대해 알아보았다. 파티클 필터(particle filter)에 대해 검색해 보면 아래와 같은 그림을 많이 보게 된다. 아래 그림은 파티클 필터의 estimation cycle을 도식화한 것이다. <’Real-Time Tracking of Multiple Moving Objects Using Particle Filters and Probabilistic Data Association’ original scientific paper 中> 위 그림의 검은색 원들은 particle을 의미한다. 이 particle에는 보통 위치 데이터와 weight가 포함된다. 검은색 원이 큰 것이 있고 작은 것이 있는 이유는 weight가 크고 작음을 의마한다. typedef struct _particle_t { int x; int y; float weight; }particle_t; 노이즈가 있는 환경에서 레이저 센서나 레이더등을 이용하여 물체의 위치를 측정할 때를 가정해 순서대로 이 필터가 동작하는 과정에 대해 알아 보겠다. (순서는 위 그림과 조금 다르다) 1. 초기 상태 측정 범위안에 랜덤 혹은 일정한 간경으로 particle을 뿌려 놓는다. 이 떄 particle...
본 글은 ft232h GPIO 컨트롤 예제 코드를 싣고 있다. FT232H는 USB2.0 Hi-Speed(480Mb/s) 단일 채널을 가지고 있으며, 컨트롤러의 MPSSE(Multi-Protocol Synchronous Serial Engine)설정에 따라 USB to JTAG, I2C, SPI(master mode) 등으로 사용할 수 있는 IC다. Datasheet에 나와 있는 칩의 블록 다이어그램은 아래 그림과 같다. 본 글에서는 ADBUS4~7, ACBUS0~9에 연결된 핀을 GPIO로 사용하는 예제를 구현할 예정이고, 다음 글에는 SPI 사용 예제를 구현할 예정이다. GPIOL0~3, GPIOH0~7번은 MPSSE모드에서 사용 가능하며, GPIOH8~9는 ACBUS BitBang 모드에서 출력 컨트롤 가능하다. GPIOL0~3, GPIOH0~7을 MPSSE모드에서 사용하면, 다른 프로토콜과 같이 사용할 수 있다. 예를 들어 ADBUS0~3을 SPI 핀으로 사용시 나머지는 GPIO로 사용하여 칩 리셋이나 인터럽트용으로 사용할 수 있다. GPIOH8~9번은 컨트롤러 모드를 BitBang모드로 전환하여 사용해야 하기 때문에 다른 SPI등과 같이 사용하기에 약간의 불편함이 있다. (모드 전환 시 약간의 시간 딜레이가 있다.) 드라이버 및 D2XX lib 먼저, FT232H IC를 사용하기 위해서 드라이버를 다운로드해야 한다. 드라이버는 https://www.ftdichip.com/Drivers/D2XX.htm 에서 다운 받을 수 있으며, 원하는 플랫폼의 드라이버를 다운로드 하면 된다. 본 글의 예제에서는 windows용을 다운받아 사용했다. 다운로드...
python threading 모듈의 Event는 Thread간 정보를 주고받을 수 있는 가장 간단한 도구라고 할 수 있다. threading.Event의 메소드는 다음과 같다. is_set() : 이벤트 flag가 True인경우, True를 반환 set() : 이벤트 flag를 True로 설정 clear() : 이벤트 flag를 False로 설정 wait(time=None) : 이벤트 flag가 True가 될 때까지 기다린다. timeout 단위는 초(seconds) 1. asyncio server socket에서의 사용 예 아래 포스트의 서버 예제에 Event Object를 추가했다. python asyncio를 이용한 async socket server client example code import asyncio import threading server_close_event = threading.Event() async def handle_asyncclient(reader, writer): print('client :', writer.get_extra_info('peername')) while True: data = await reader.read(8) if data == b'ping': writer.write(b'pong') await writer.drain() print('recv: ping -> send: p...
윈도우 플랫폼에서 사용한 Sleep() 함수의 시간 해상도는 아래 함수로 조정할 수 있다 . MMRESULT timeBeginPeriod( UINT uPeriod ); MMRESULT timeEndPeriod( UINT uPeriod ); TimeAPI.h 에 선언되어 있으며 , Winmm.lib 라이브러리를 추가해야 한다 . 프로그램 시작 시 timeBeginPeriod 을 호출하여 해상도를 조정하여 Sleep 함수를 사용 하고 , 마지막으로 프로그램 종료 시 timeEndPeriod 를 호출한다 .
댓글
댓글 쓰기