PlutoSDR를 활용한 QPSK 기반 무선 이미지 전송 시스템 구축

PlutoSDR를 활용한 무선 통신 시스템 구축의 실전 예제로, 이미지 데이터를 무선으로 송수신하는 전체 프로세스를 살펴본다. 단일 PlutoSDR 장치로 반송파 주파수와 수신 이득을 조절하여 이미지 파일을 전송하는 완전한 솔루션을 구현한다.

시스템 구성 및 매개변수 설정

MATLAB 환경에서 PlutoSDR 장치를 초기화하고 기본 통신 매개변수를 구성하는 것으로 시작한다. 샘플링 레이트, 중심 주파수, 이득 값 등을 설정하여 송수신 경로를 준비한다.

% 시스템 초기화 및 장치 설정
fprintf('시스템 초기화 중...\n');

hwPlatform = 'Pluto';           % SDR 하드웨어 지정
sampleRate = 500e3;             % 기저대역 샘플링 속도 (Hz)

% CAZAC 프리앰블 생성 (동기화용)
preambleLength = 500;
syncPreamble = generate_cazac(preambleLength);

% 송신기 설정
txDevice = sdrtx(hwPlatform);
txDevice.RadioID = 'usb:0';
txDevice.BasebandSampleRate = sampleRate;
txDevice.CenterFrequency = cfg.carrierFreq * 1e9;  % GHz → Hz 변환
txDevice.ShowAdvancedProperties = true;
txDevice.Gain = 0;              % 송신 이득 (dB)

% 수신기 설정
rxDevice = sdrrx(hwPlatform);
rxDevice.RadioID = 'usb:0';
rxDevice.BasebandSampleRate = sampleRate;
rxDevice.CenterFrequency = txDevice.CenterFrequency;
rxDevice.GainSource = 'Manual';
rxDevice.Gain = cfg.rxGain;     % UI에서 설정된 수신 이득
rxDevice.OutputDataType = 'double';
rxDevice.SamplesPerFrame = 200000;

송신 신호 처리 흐름

이미지 파일에서 추출한 비트 스트림을 QPSK 변조하고, 펄스 성형 필터를 적용한 후 동기화용 프리앰블을 추가한다. 이 과정을 통해 물리 계층에서 전송 가능한 아날로그 신호를 생성한다.

% 이미지 데이터 처리 루프
for frameIdx = 1:numFrames
    
    % 현재 프레임의 비트 데이터 추출
    frameBits = sourceBits((1:bitsPerFrame) + (frameIdx-1)*bitsPerFrame);
    
    % QPSK 직교 변조
    modulatedSymbols = qpsk_mapper(frameBits);
    
    % 루트 레이즈드코사인 펄스 성형 (8배 오버샘플링, 21탭)
    shapedSignal = rrc_filter(modulatedSymbols, 8, 21);
    symbolsCount = length(shapedSignal);
    
    % 프레임 구성: [프리앰블][프리앰블][데이터 심볼]
    txFrame = [syncPreamble, syncPreamble, shapedSignal];
    
end

QPSK 변조는 각 2비트 조합을 복소 평면의 4개 위상점 중 하나에 매핑한다. 예를 들어 00→(1+1i)/√2, 01→(-1+1i)/√2, 11→(-1-1i)/√2, 10→(1-1i)/√2로 변환하여 위상 변화로 정보를 전달한다.

수신 신호 복원 프로세스

수신된 RF 신호를 디지털 베이스밴드로 변환한 후, 다단계 신호 처리를 거쳐 원본 이미지를 복원한다. 전력 정규화, 이밍 동기화, 주파수 오차 보정, 캐리어 복구, 판정 및 디코딩 순으로 진행된다.

% 수신 버퍼에서 데이터 획득
rawSamples = rxDevice();

% 수신 신호 전력 정규화
normalizedRx = rawSamples / sqrt(mean(abs(rawSamples).^2));

% 프리앰블 기반 프레임 동기화
alignedSignal = frame_sync(normalizedRx, searchWindow, ...
    syncPreamble, preambleLength, threshold, symbolsCount);

% 주파수 오프셋 추정 및 보정
freqCorrected = freq_offset_comp(alignedSignal, preambleLength, sampleRate);

% 매칭 필터 (수신 필터)
filteredSignal = rrc_matched_filter(freqCorrected(2*preambleLength+1:end), 8, 21);

% 캐리어 위상 동기화
phaseRecovered = carrier_recovery(filteredSignal);

% QPSK 복조 및 비트 판정
recoveredBits = qpsk_demapper(phaseRecovered);
validBits = recoveredBits(1:bitsPerFrame);

동기화 및 주파수 보정 메커니즘

무선 채널에서 가장 중요한 과제 중 하나는 수신 신호의 정확한 타이밍 위치를 찾는 것이다. CAZAC(Constant Amplitude Zero Auto-Correlation) 시퀀스는 이상적인 자기상관 특성을 제공하여 프레임 시작점을 정밀하게 검출할 수 있게 한다.

수신 신호와 알려진 프리앰블 간 상관 연산을 수행하면, 신호 존재 시 명확한 피크가 나타난다. 이 피크 위치가 프레임의 실제 시작점을 나타내며, 이를 기준으로 후속 데이터 심볼을 추출한다.

또한 발진기 불일치와 도플러 효과로 인한 주파수 오프셋은 위상 회전을 유발하여 QPSK 성좌도를 왜곡시킨다. 프리앰블을 활용한 주파수 추정 알고리즘으로 이 오차를 보정하여 신뢰성 있는 복조를 가능하게 한다.

시스템 확장 가능성

기본 QPSK 구현을 넘어 다양한 고급 변조 방식으로 확장할 수 있다. 16QAM, 64QAM, 128QAM 등 고차 변조를 적용하면 동일한 대역폭에서 더 높은 데이터 전송률을 달성할 수 있다. 단일 PlutoSDR로는 128QAM까지 안정적인 통신이 가능하며, 채널 상태에 적응하는 적응 변조 방식도 구현할 수 있다.

또한 이 시스템은 정적 이미지 전송에서 실시간 비디오 스트리밍으로 확장하거나, 다중 안테나(MIMO) 구성으로 처리량을 증가시키는 방향으로 발전시킬 수 있다. FEC(Forward Error Correction) 코드를 추가하면 신뢰성이 낮은 채널에서도 견고한 통신이 가능하다.

태그: PlutoSDR Matlab QPSK SDR 무선통신

5월 30일 22:31에 게시됨