작성된 코랩 문서를 통해 펄스압축을 파이썬으로 쉽게 체험해볼 수 있습니다.
https://drive.google.com/file/d/1jXWES9JHTXkGBXM4pX_m2hb2XyZq1f0g/view?usp=sharing
matlab 공식 문서에 설명이 잘 나와있으니 읽어보시는걸 추천드립니다.
개요
레이더 데이터 프로세싱 과정에 대해 공부하고 matlab으로 직접 테스트해보면서 느낀점 중 하나가 Toolbox가 정말 잘 제공된다는것입니다. 그 중 원하는 레퍼런스 신호만 증폭시켜주는 펄스 압축의 경우엔 실제로는 매우 복잡하겠지만 matlab에서는 lfm 원형 신호를 getMatchedFilter 함수에 인자로 넣으면 반환해주는 필터를 적용하기만 하면 쉽게 수행할 수 있었습니다.
원리와 구현 방법에 대해 서치해봤더니 생각보단 간단한 작업이었습니다. 저는 직접 구현해보고 시각화된 자료를 보면 이해를 더 잘 하는편이라 아직은 좀 더 익숙한 파이썬 환경에서 펄스 압축을 직접 진행해보게 되었습니다.
펄스 압축이란?
레이더에서 신호를 쏠 때 주파수 변조를 사용합니다. 몇 가지 이유가 있겠지만 그 중 하나는 "우리가 쏜 신호가 맞는지 확인하기 위해서"입니다. 송신시 변조해서 발사한 신호는 수신시에도 같은 형태로 들어오기 때문에 레퍼런스 신호와 비교하여 우리가 쏜 신호가 맞는지 알 수 있습니다.
하지만 먼 타겟까지 다녀오면서 강도가 약해지고 형태를 부분적으로 잃을 수도 있습니다. 노이즈에 섞여서 일반적인 방법으로는 관찰할 수 없을 수도 있습니다. 이 때 우리는 수신 신호에 단순히 레퍼런스 신호를 곱함으로써 타겟에 반사되어 들어오는 우리의 신호를 강화시켜 조금 더 쉽게 확인할 수 있습니다.
신호는 연속값을 가지지만 설명을 위해 이산값을 사용, 아주 단순한 가정하에 생각해보겠습니다.
길이가 5인 [2 1 4 3 5]의 레퍼런스 신호를 발사한다고 가정하겠습니다.
또 5개의 수신 신호에 들어오는 수신값의 합을 15로 고정하겠습니다.
우선 수신 값이 [3 3 3 3 3] 일 때 (노이즈 상황)
레퍼런스 신호를 곱하면 [6 3 12 9 15]이며 그 합은 45입니다.
수신 값이 [2 1 4 3 5] 일 땐 (타겟에 맞고 돌아온 상황)
레퍼런스 신호를 곱하면 [4 1 16 9 25]로 그 합은 55입니다.
같은 시간 내에 동일한 양의 신호(15)를 받았지만 레퍼런스 신호를 곱했을 때 그 합이 다르게 나오며 수신 신호와 레퍼런스 신호의 상관관계가 커질수록 그 값은 커지게 됩니다. 상관관계가 1이 아니더라도 즉, 완전히 동일하지 않아도 높을수록 큰 값을 얻을 수 있습니다.
이러한 원리를 통해 우리가 원하는 피크의 봉우리를 더 키우고 폭을 좁힐 수 있으며 이를 펄스 압축이라고 부릅니다.
코드 리뷰
numpy와 pyplot으로 간단히 작성해본 파이썬 코드로 진행됩니다.
기본 세팅
실험 재현을 위해 seed number 고정
sample_size : 샘플 시그널의 길이
reference_size : 레퍼런스 시그널의 길이 (= 펄스의 길이)
reflect_ratio : 펄스 반사비
import numpy as np
import matplotlib.pyplot as plt
# Fix seed number if you want
np.random.seed(2023)
# Set size of signal
sample_size = 2500
reference_size = 20
# Set reflect ratio of reference signal
reflect_ratio = 0.5
샘플 시그널 생성
1. 노이즈 생성
반사 펄스가 없더라도 항상 노이즈가 존재하기때문에 평균 15, 표준편차 5의 분포를 따르는 노이즈를 생성해줍니다.
2. 레퍼런스 생성 (펄스)
펄스의 레퍼런스 형태를 생성합니다. 이땐 [10, 15) 사이의 랜덤 정수를 뽑아 생성합니다.
출력 > reference signal: [12 13 10 13 10 13 12 14 14 14 14 13 13 11 13 11 11 11 14 14]
# Generate signal
sample_signal = np.random.normal(15, 5, sample_size)
reference_signal = np.random.randint(10, 15, reference_size)
print(f'reference signal: {reference_signal}')
3. 노이즈 + 레퍼런스 신호
레퍼런스 신호를 삽입할 인덱스를 뽑은 뒤 노이즈에 더해 삽입해줍니다.
출력 > insert receive signal into 1495
# Insert reference signal to sample signal
receive_idx = np.random.randint(30, sample_size - 30) # Set idx to insert
for idx in range(reference_size):
sample_signal[receive_idx + idx] += reference_signal[idx] * reflect_ratio
print(f'insert receive signal into {receive_idx}')
펄스 압축
이번 포스팅의 핵심이지만 아주 간단한 코드입니다.
모든 샘플을 순회하며 각 수치를 [(레퍼런스 신호)와 (샘플 신호)의 원소 곱]의 합으로 적용해줍니다.
이 과정에서 각 샘플 신호가 레퍼런스 신호와 높은 상관관계를 가질수록 높은 값을 갖게 됩니다.
# Pulse Compression (using reference signal)
receive_signal = np.copy(sample_signal)
for idx in range(sample_size-reference_size):
compressed = receive_signal[idx:idx+reference_size] * reference_signal
receive_signal[idx] = sum(compressed)
플롯 생성
1495번째 샘플에 길이 20의 반사 신호가 삽입되었습니다. (1495~1514)
처리 전 receive signal의 플롯만 봤을 땐 삽입 지점을 알기 어렵습니다.
맥시멈 함수를 사용하면 아마 2000번 부근의 샘플 값이 나올것 같습니다.
하지만 우리는 레퍼런스 신호를 알고있기 때문에 펄스 압축을 할 수 있습니다.
압축 후 결과를 살펴보면 반사 신호가 삽입된 1495번 샘플에 훨씬 더 뚜렷한 피크를 관찰할 수 있습니다.
# Draw plot
plt.subplots_adjust(hspace=0.4)
plt.subplot(211)
plt.axvline(receive_idx, color='r', linestyle=':')
plt.plot(sample_signal)
plt.title('receive signal (= reflect pulse + noise)')
plt.xlim(0, sample_size-reference_size-1)
plt.subplot(212)
plt.axvline(receive_idx, color='r', linestyle=':', label='inserted')
plt.plot(receive_signal)
plt.title('receive signal (compressed)')
plt.xlim(0, sample_size-reference_size-1)
plt.legend(loc='lower right')
plt.show()
'Radar & Matlab' 카테고리의 다른 글
MATLAB 스터디 - IQ 신호 생성 (0) | 2023.09.22 |
---|---|
레이더 데이터 큐브 (0) | 2023.09.21 |
레이더 빔포밍에 대해서 (1) | 2023.09.20 |
MATLAB 스터디 - SAR Target Classification (1) | 2023.09.16 |
MATLAB 스터디 아카이브 (0) | 2023.09.15 |