개요
이번 포스팅에선 펄스 레이더가 생성하는 raw data - IQ Signal을 직접 생성하는 방법에 대해 다뤄보겠습니다.
저는 개인적으로 레이더 분야의 진입 장벽이 높다고 생각합니다. 그 이유를 진입 장벽이 비교적 낮은 컴퓨터 비전 분야와 비교하면서 알아보겠습니다.
레이더 | 컴퓨터 비전 | |
원천 데이터 | 신호 | 이미지 |
데이터 성질 | 분석을 위해 신호에 대한 이해가 필요 | 직관적이라 별도의 지식 불필요 |
데이터 접근난이도 | 상 (고가의 레이더, 기밀) | 하 (접근성이 좋은 카메라) |
기술 공개 여부 | 관련 기술이 거의 공개되지 않음 (기밀) | 기존 기술과 더불어 새로운 기술들도 오픈소스 형태로 많이 공개됨 |
방위산업 분야에 속하기 때문에 전체적으로 접근성이 굉장히 낮아 관련 랩실에서 연구를 진행하거나 업계에 종사하지 않는한 개인적인 프로젝트나 연구에는 한계가 있다고 생각합니다. 그럼에도 방법은 있기 마련이고 이번에는 낮은 데이터 접근성 극복을 위해 "Phased Array System Toolbox"를 활용한 원천 데이터(IQ Signal data) 생성을 진행해보겠습니다.
Phased Array System Toolbox
공식 문서 : MATLAB, Phased Array System Toolbox
툴박스에 대해선 공식문서에 잘 나와있습니다.
공식 문서 일부
Phased Array System Toolbox™ provides algorithms and apps in MATLAB® and Simulink® for designing and simulating sensor array and beamforming systems in wireless communication, radar, sonar, and acoustic applications.
> Phased Array System는 무선 통신, 레이더, 소나 등 응용 분야에서 센서의 배열과 빔포밍 시스템등을 설계/시뮬레이션 할 수있는 알고리즘과 앱을 제공합니다.
The toolbox also provides continuous and pulsed waveforms that you can use to generate simulation test signals and simulate target echoes and interferences.
> 툴박스는 지속파와 펄스 파형을 제공하며 이를 시뮬레이션 테스트 신호 생성이나 타겟 에코와 간섭 시뮬레이션에 사용할 수 있습니다.
신호 생성 코드 및 리뷰
생성은 아래와 같은 순서로 진행됩니다.
1. 레이더 제원 설정
2. 펄스 설정
3. 모의 타겟 설정
4. 신호 생성 준비
5. 신호 생성 (데이터 큐브)
6. 시각화
전체 코드 라이브 스크립트 (github) : s02_iq_data_get
데이터 큐브에 대하여 : https://ryanheart.tistory.com/18
1. 레이더 제원 설정
레이더를 구성하는 안테나의 종류와 개수 그리고 배치 방식을 설정합니다.
8개의 코사인 안테나를 동일한 간격(ULA, Uniform Linear Array)으로 배치
이후 안테나 배치 시각화
antenna=phased.ULA;
antenna.NumElements = 8;
cosineElement = phased.CosineAntennaElement;
antenna.Element = cosineElement;
viewArray(antenna);

안테나의 수, 배치에 따른 신호의 파형 시각화
pattern(antenna,300e6,-180:180,0,...
'Type','directivity',...
'PropagationSpeed',3e8);

2. 펄스 설정
가장 중요한 부분입니다. 주파수 변조 방식, 펄스 반복 주파수 (PRF, Pulse Repetition Frequency), SampleRate, 펄스 폭 등을 설정하는 부분입니다. 송신 펄스 설정을
- Linear Frequency Modulation(선형 주파수 변조) 방식을 사용
- 1초당 1,000번의 펄스 발생 / 1,000,000번의 측정
- 0.1ms의 펄스의 폭
으로 한 뒤 발생하는 펄스를 시각화 해보겠습니다.
prf = 1000;
waveform=phased.LinearFMWaveform;
waveform.SampleRate = 1e6;
waveform.PRF=prf;
waveform.PulseWidth=1e-4;
nSamples = waveform.SampleRate/waveform.PRF;
y = step(waveform);
t = (0:nSamples-1)/waveform.SampleRate;
figure
plot(t,real(y));title('Radar Waveform'); xlabel('Time (sec)'); ylabel('Amplitude')

설정한대로 잘 생성되었습니다. PRF=1000이기 떄문에 한 펄스가 1ms (1e-3 sec)로 설정되었고 펄스 폭을 1e-4로 설정하였기에 첫 0.1ms 동안만 펄스를 송신, 이후에는 수신을 위한 휴지시간을 갖기에 송신이 없는것을 확인할 수 있습니다.
3. 모의 타겟 설정
타겟의 좌표, 속도를 설정합니다.
방위각 30도, 20km 지점에 배치하고 150m/sec의 속도로 이동하게 설정하겠습니다.
이후 코드를 보아선 RaderTarget은 목표 객체 Platform은 시뮬레이션 객체 (iterator 생성과 유사)로 보입니다.
TgtModel=phased.RadarTarget;
tgtPos=[10e3*sqrt(3);10e3;0];
tgtVel=[75*sqrt(3);75;0];
PlatformModel=phased.Platform;
PlatformModel.InitialPosition = tgtPos;
PlatformModel.Velocity = tgtVel;
4. 신호 생성 준비
송신/수신 신호 생성기를 호출하고 레이더의 위치, 생성할 펄스의 개수 지정 등 나머지 설정
% 송신 신호 강도 설정
TX=phased.Transmitter('Gain',20);
% 채널 모델 설정 (아직 어떤 역할인지 모름)
ChannelModel = phased.FreeSpace;
ChannelModel.TwoWayPropagation=true;
% 송신, 수신 신호 생성 객체 호출
txArray = phased.Radiator(...
'Sensor',antenna,...
'OperatingFrequency',300e6);
rxArray = phased.Collector(...
'Sensor',antenna,...
'OperatingFrequency',300e6);
rxPreamp = phased.ReceiverPreamp('Gain',10,'NoiseFigure',5,...
'SampleRate',1e6);
% 변수 정의 - 레이더 위치, 펄스 수, 빈 배열
radarPos = [0;0;0];
radarVel = [0;0;0];
nPulses = 32;
datacube = complex(zeros(nSamples,antenna.NumElements,nPulses));
5. 신호 생성
nPulses 만큼 반복문을 돌리면서 펄스별로 데이터 큐브에 기록합니다.
PlatformModel을 통해 타겟의 위치와 속도를 갱신하고 호출해둔 생성기를 통해 생성된 신호에 해당 시점 타겟의 정보(위치, 속도)를 반영해 신호를 수정합니다. 그 후 데이터 큐브에 기록하기를 반복합니다.
for ii=1:nPulses
wf=step(waveform);
[tgtPos, tgtVel] = step(PlatformModel,1/prf);
[~, tgtAng] = rangeangle(tgtPos, radarPos);
s0 = step(TX, wf);
s1 = step(txArray,s0, tgtAng);
s2 = step(ChannelModel, s1, radarPos, tgtPos, radarVel, tgtVel);
s3 = step(TgtModel, s2);
s4 = step(rxArray,s3,tgtAng);
s5 = step(rxPreamp,s4);
datacube(:,:,ii) = s5(:,:);
end
6. 시각화
데이터큐브의 형태로 저장했기 때문에 안테나, 펄스가 각각 차원을 가지며 잘 분리되어 있어 아래와 같이 원하는 부분만 가져와서 시각화 할 수 있습니다.
antenna_idx = 1;
pulse_idx =1;
t = ((pulse_idx-1)*nSamples:pulse_idx*nSamples-1)/waveform.SampleRate;
y = abs(datacube(:, antenna_idx, pulse_idx));
plot(t,y(:));
title(['Reflected Signal ~ antenna: ', num2str(antenna_idx),', ','pulse: ', num2str(pulse_idx)]);
xlabel('Time (sec)'); ylabel('Magnitude')

마무리
레이더 분야 공부를 하면서 데이터를 구하는게 정말 어려웠는데 관문 하나를 뚫은 느낌입니다.
하지만 생성만으로는 이 데이터가 어떤 정보를 가지고 있는지 알기 어렵습니다. 다음번엔 생성한 IQ데이터를 처리해 정보를 얻는 데이터 프로세싱 과정을 가져와서 소개해보겠습니다.
'Radar & Matlab' 카테고리의 다른 글
레이더 펄스압축 (0) | 2023.09.25 |
---|---|
레이더 데이터 큐브 (0) | 2023.09.21 |
레이더 빔포밍에 대해서 (1) | 2023.09.20 |
MATLAB 스터디 - SAR Target Classification (1) | 2023.09.16 |
MATLAB 스터디 아카이브 (0) | 2023.09.15 |