라벨이 signalprocessing인 게시물 표시

CA-CFAR 예제 코드

이미지
 이전 포스트에서 CFAR의 원리 에 대해 알아본 적이 있다. 본 포스트에서는 Python으로 CA-CFAR에 대해 간단하게 구현한 예제를 수록하고 있다. 구현된 CA-CFAR은 아래 그림과 같이 구현되었다.   ca-cfar 코드 import numpy as np class cacfar(object):     def __init__(self, window_size, guard_size,pfa = 0.01, scale=1.0):         self.pfa = pfa         self.scale = scale         self.window_size = window_size         self.guard_size = guard_size              def cal_threshold(self, left, right):                n = len(left)+len(right)         s = np.sum(np.square(left))+np.sum(np.square(right))                  if n > 0:             T= np.power(self.pfa,(-1.0 /n)) - 1             average = s/n ...

바로 프로젝트 적용 가능한 FIR Filter (low/high/band pass filter )를 c나 python으로 만들기

이미지
 band pass filter 코드가 필요해 인터넷을 검색을 해봤지만, 쓸 만한 코드와 자료가 별로 없어 그냥 만들어 쓰기로 했다. 필요한 공식은 위키피디아에 나와있다. https://en.wikipedia.org/wiki/Finite_impulse_response 1. filter 크기 FIR filter를 만들 때 filter의 크기(tpas의 크기)를 결정할 때 도움될 수식이 있다.   N=A㏈Fs / 22*Δf A㏈ : 감쇄될 db Fs : Sampling Frequency Δf : frequency bandwidth 출처 :  https://www.allaboutcircuits.com/technical-articles/design-of-fir-filters-design-octave-matlab/ def estimatefilterlen(fl,fh,fs,db):     N = int(np.round(db * fs / (22 * (fh-fl)))-1)     return N 2. Low Pass Filter [ python code ] def lowpassfilter(f,fs,N):     taps = np.zeros(N)          fc = f / fs     omega = 2*np.pi*fc     middle = int(N/2)     for i in range(N):         if i == middle:             taps[i] = 2*fc         else:    ...

uwb radar 신호 움직이는 물체 위치 측정 예제

이미지
 본 포스트는 uwb radar 신호에서 움직이는 물체의 위치를 측정하는 예제를 싣고 있다. csv파일로 저장된 radar 신호를 읽어, python으로 구현하였다. 움직이는 물체 측정 원리 저장된 uwb radar 신호와 uwb radar 송출 signature 신호와의 상관관계 분석을 위해 Cross Correlation을 사용한 후, Background Subtraction을 사용하여 배경 신호와 움직이는 물체의 신호를 분리해 낸다. 그 후 CA-CFAR를 사용하여 threshold를 생성해 움직이는 물체의 위치를 측정한다.  def main():         csvfile = open('uwb_signal.csv')     if csvfile is None:         return          bg = bgs(bg_stack_cnt=20,alpha=0.2)     xcorrel = crosscorrelation(signature)     cfar = cacfar(window_size=50,guard_size=50,pfa=1e-7,scale=20)          painter = cdrawsignal((20,3))     uwb_signal = csv.reader(csvfile)          for line in uwb_signal:         frame = [float(x) for x in line]         frame = frame[10...

쉽게 설명한 파티클 필터(particle filter) 동작 원리와 예제

이미지
파티클 필터(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...

간단한 칼만 필터(Kalman Filter) 소스 코드와 사용 예제

이미지
칼만 필터(Kalman filter)는 노이즈가 포함된 측정치로 부터 실체 상태를 추정(推定, estimation)하는 도구다. 본 포스트의 칼만 필터 소스는 한 타겟의 위치를 추정하는 용도로 만들어 졌다.  위키피디아 페이지( https://en.wikipedia.org/wiki/Kalman_filter )와 “Human Target Tracking in Multistatic Ultra-Wideband Radar” 논문 등을 참조하여 칼만 필터의 공식을 구현하였다. F,H,Q,R matrix는 아래와 같은 값으로 정하여 사용하였다. 칼만 필터 c++ 소스는 아래와 같다.  #include <malloc.h> #include <Eigen/Dense> __declspec(align(16)) class CKalmanFilter { private: BOOL mFirst; Eigen::MatrixXd mX; Eigen::Matrix4d mP; Eigen::Matrix4d mF; Eigen::MatrixXd mH; Eigen::Matrix2d mR; // measurement noise covariance Eigen::Matrix4d mQ; // process noise covariance public: void* operator new(size_t i) { return _mm_malloc(i, 16); } void operator delete(void* p) { _mm_free(p); } CKalmanFilter(double process_var, double measure_var, double T) { ...

median filter를 사용하여 이미지의 salt and pepper noise 제거 예제 코드

이미지
본 글은 median filter를 사용하여 salt and pepper noise를 제거하는 예제 코드를 싣고 있다. 이전 “ 임펄스(Impluse) 노이즈 제거를 위한 median filter c source code ”글에서 median filter로 신호에 발생한 임펄스 노이즈를 제거하는 예제를 본적이 있다. 이번에는 median filter를 사용하여 이미지의 slat and pepper noise를 제거해 보았다.  위키피디아( https://en.wikipedia.org/wiki/File:Noise_salt_and_pepper.png )에서 다운 받은 이미지를 사용하기로 했다. 원리는 이전 글의 median filter와 동일하다. 다만 이미지 데이터 처리를 위해 데이터 형식이 int형으로 변형되었다.  다만 다운받은 테스트 이미지에 컬러가 없어서 컬러는 데이터는 고려하지 않았다. png파일은 24bits bitmap으로 변환하여 테스트하였다. typedef int element_type; int compare (const void *f1, const void *f2) { return (*(element_type*)f1 > *(element_type*)f2) ? 1 : -1; } element_type  get_qsort_median (element_type*data, int n) { if (!data || n <= 0) return 0; qsort(data, n, sizeof(element_type), compare); return data[n / 2]; } int get_pixels(unsigned char *in, int *out, RECT *rect, int stride, int bytesperpixel) { int x = 0; int y = 0; int n = 0;...

임펄스(Impluse) 노이즈 제거를 위한 median filter c source code

이미지
본 글은 임펄스(Impluse) 노이즈가 있는 신호에서 임펄스 노이즈를 제거하기 위한 median filter대한 내용을 싣고 있다. 임펄스 노이즈는 짧은 시간 외부 환경의 영향으로 발생하는 충격성 잡음이며, 아래 그림의 예처럼 sin파에 큰 값으로 튀는 잡음이 발생하는 것을 말한다.  신호 처리에서 임펄스 노이즈 제거를 위한 여러 방법이 존재하며, 영상처리 분야에서도 slat and pepper noise-영상의 최대값(0xff)과 최소값(0x00)으로 이루어진 잡음-로 알려진 임펄스 노이즈를 제거하기 위한 많은 방법들이 존재한다. 본 글은 그 중에 구현이 간단한 중간값 필터(median filter)에 대해 알아보았다.  Median filter는 연속된 신호에서 특정 구간 윈도우내의 데이터를 크기 순으로 정렬해 그중 가운데 값을 대표 값으로 사용하는 필터이다.  만약 임펄스 노이즈 ‘255’가 있는 데이터 [10, 255, 8, 11, 13]가 있다면, 데이터를 크기순으로 정렬하면 [8,10,11,13,255]이 되고, 중간 값은 11이 되며 이 구간의 대표 값은 11이 된다. 이렇게 하면 임펄스 노이즈 100은 사라지게 된다. 이 방법을 이용한 예제 소스는 아래와 같다. //  qsort를 사용해 중간 값을 찾는 코드  int compare(const void *f1, const void *f2) { return (*(double*)f1 > *(double*)f2) ? 1 : -1; } double get_qsort_median(double *data, int n) { if (!data) return 0; qsort(data, n, sizeof(double), compare); return data[n / 2]; } // loop를 돌며 데이터를 정렬하여 중간 값을 찾...

신호에서 배경 제거(background subtraction)를 통한 움직이는 물체의 위치 검출

이미지
본 글은 신호에서 배경 제거(background subtraction)를 통한 움직이는 물체의 위치를 검출하는 예제 코드를 싣고 있다. 배경 제거(background subtraction) 배경 제거(background subtraction)는 이미지 프로세싱에서 움직이는 물체를 찾는데 사용된다. 이미지 프로세싱에서의 background subtraction은 아래 그림처럼 전체 이미지에서 배경 이미지를 제거해 움직이는 물체를 찾는 과정을 의미한다. 물론 단순히 아래 그림처럼 선명하게 나오진 않고 여러가지 후처리가 있어야 한다.   배경 제거를 사용해 움직이는 물체를 검출하는 방식을 이미지 이외에도 적용 가능한 것인가?  가능해 보인다. 타임 도메인이나 주파수 도메인 모두.  단순히 생각하면 배경 데이터는 일정 시간 Δt 동안의 평균 데이터이고, 최근 프레임 데이터에 이 배경 데이터를 빼는 것이 배경제거라고 할 수 있다. 타임 도메인이나, 주파수 도메인의 신호 데이터 모두 이런 방식을 사용하면, 신호의 변화가 많은 위치나 주파수를 검출하는 것이 가능할 것이다. 1차원 신호에서의 배경제거(background subtraction) c 예제 소스 background subtraction c 위에서 언급한 간단한 배경 제거(background subtraction) 알고리즘을 사용하여 구현한 예제 코드는 아래와 같다. #define BG_INITIAL_FRAME_CNT 3 #define BG_UPDATE_ALPHA 0.9 #define UPDATE_ALPHA (1.0 -BG_UPDATE_ALPHA) #if defined(WIN32) #define _lock(x) WaitForSingleObject(x->mutex, INFINITE)...

cross-correlation을 사용한 신호 상관 관계 테스트 및 source code

이미지
본 글은 신호처리에서 신호들의 상관 관계를 파악하는 Cross-correlation에 대해 코드로 구현해 보고 테스트하는 내용을 싣고 있다. 신호처리에서 두 신호가 얼마나 비슷한 지를 측정하는 도구로 cross-correlation 을 사용한고 한다. 예를 들어, 특정 패턴의 신호를 찾거나 혹은 이미지 처리에서 특정 패턴의 이미지를 찾을 때도 사용된다고 한다. 위키피디아의 Cross-correlation 페이지 를 참조하였으며, 신호를 정규화 하여 사용하는 zero-normalized cross-correlation(ZNCC)을 구현하였다. 외부 환경 요인 등으로 신호 전체의 level등이 커지는 등의 영향을 받으면, 정상적으로 신호의 상관 관계를 파악하기 어렵고, 이를 위해 신호를 정규화 하여 사용한다고 한다. 상관 관계 파악에 사용되는 템플릿 신호와 샘플 신호 모두 정규화 과정을 수행하도록 했다. ZNCC의 공식은 아래와 같다. 아래 공식은 x,y 좌표를 가진 2차원 이미지에서 사용되는 공식이고, 구현과 테스트는 1차원 신호 환경에 맞게 하였다. 소스 코드 class CCrossCorrelation { public: CCrossCorrelation() { m_bUseNormal = TRUE; m_nTemplateSignalLen = 0; m_pNormalizedTemplateSignal = NULL; m_pNormalizedSignal = NULL; } ~CCrossCorrelation() { m_nTemplateSignalLen = 0; safe_free(m_pNormalizedSignal); safe_free(m_p...

FFT용 윈도우 함수 구현 예제 소스 코드

이미지
본 글은 고속 푸리에 변환(Fast Fourier Transform,FFT)에 윈도우 함수(window function)를 사용하는 이유와 구현된 소스 코드를 싣고 있다. 스펙트럼 누설(Spectral leakage) 신호처리에서 신호를 주파수 도메인에서 분석하기 위해 고속 푸리에 변환을 많이 사용한다. 이 FFT(Fast Fourier Transform) 변환할 때 종종 window를 사용하여 신호를 한번 가공하는 것을 볼 수 있다. 이 window를 왜 사용하는 것인가? 그 이유는 스펙트럼 누설 현상이 발생하기 때문이다. 스펙트럼 누설(Spectral leakage)이라는 것은 신호를 스펙트럼 분석했을 때, 원래의 신호에는 포함되어 있지 않은 주파수 성분이 관측되는 현상을 말한다 그런데, 재밌는 사실은 스펙트럼 누설 현상은 이 window 때문에 발생한다. 아래 그림과 같이 만약 전체 신호를 FFT를 통해 주파수 분석을 하게 되면 스펙트럼 누설 현상이 나타나지 않는다. 하지만, 전체가 아닌 일정 부분을 샘플링(다르게 말하면, rectangular window을 사용) 하여 FFT를 수행하면 녹색 화살표의 주파수 같은 스펙트럼 누설이 나타난다. 실제 우리가 분석해야 할 신호들은 전체를 한꺼번에 FFT를 취할 수 없기 때문에, 어쩔 수 없이 일부분을 잘라 주파수 분석을 해야 한다. 그럼 이 스펙트럼 누설을 어떻게 해야 하나? 다행이도 스펙트럼 누설을 줄이기 위한 window function들이 존재한다.  window function 다양한 window function들 중 몇 가지를 구현하여 스펙트럼 누설이 사라지는지에 대해 테스트했다. 테스트에서 fft는 kiss fft를 사용하였으며, fft 수행 코드는 아래와 같다. #include "kiss_fftr.h" /* sam...