Radar & Matlab

레이더 펄스압축

ryanhearts 2023. 9. 25.

작성된 코랩 문서를 통해 펄스압축을 파이썬으로 쉽게 체험해볼 수 있습니다.

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