프롤로그
저번에 WIFI PHY계층에 대한 이론적인 내용에 대해서 배웠다.
2026.04.29 - [네트워크] - [WiFi] IEEE 802.11 WIFI의 PHY 계층에 대해서 알아보자
[WiFi] IEEE 802.11 WIFI의 PHY 계층에 대해서 알아보자
프롤로그2026.03.18 - [네트워크] - [WiFi] IEEE 802.11 계층과 프레임에 대해 알아보자 (Wireshark로 뜯어보는 802.11 Frame의 모든 것) [WiFi] IEEE 802.11 계층과 프레임에 대해 알아보자 (Wireshark로 뜯어보는 802.11 F
taesan-smj.tistory.com
이번 글은 어디서부터 L-STF / L-LTF / SIG인지 일일이 하나하나 분석하는 시간까지는 아니고,
단순히 MATLAB을 이용하여 USRP을 이용해서 주변 신호를 캡처하고 이를 출력하는 정도로 마무리 해보려고 한다.
그래서 오늘의 목표는

USRP B210과 MATLAB Toolbox로 위와 같이 신호를 캡처해서 분석해보는 시간을 가져보도록 하자.
준비물

USRP B210 (가격이 ₩4,823,643..)

VERT2450(2.4Ghz, 5GHz 듀얼밴드를 캡처할 수 있다)
를 준비하고
MATLAB 애드온으로

이렇게 준비하였다.
초기화
b210_sample.m 매트랩 파일을 만들고
일단, 모든 변수들과 터미널 명령창을 초기화 한다.
if exist('rx','var')
release(rx);
clear rx;
end
clear;
clc;
기기 연결과 필드 정보 확인학
%% 기기 연결 확인
radios = findsdru();
해당 코드를 실행하면

이런 구조체를 통하여
Checking radio connections...
radios =
다음 필드를 포함한 struct:
Platform: 'B210'
IPAddress: ''
SerialNum: '시리얼넘버'
Status: 'Success'
다음 결과값이 출력된다.
실험 초기 환경변수 설정하기
%% 초기 변수 설정
%=====채널=====
frequencyBand = 5;
channelNumber = 36;
%=====실험 변수====
threshold = 0.8; %탐지 임계값 설정
maxLoops = 20; %실험 반복 횟수
captureTime = milliseconds(100); % 1000 = 1초
justOne = false; % 동작 모드 변경
%====패킷 수신 관련====
sampleRate = 20; %샘플레이트 (채널 밴드)
decimationFactor = 1; %다운샘플링 비율
samplePerFrame = 200000; %한 번에 몇 개 샘플을 가져오는가(묶음 크기)
gain = 20; %RF신호를 얼마나 증폭해서 받을 것인가 (dB)
대역폭과 채널 번호
실험변수는 내가 실험하면서 몇 초라던지, 임계값이라던지, 모드라던지 나만의 실험용이니까 신경 안 써도 되고
패킷 수신 관련하여 샘플레이트, 다운샘플링 비율, 등등에 대한 변수들을 설정해준다.
초기 USRP Initial
%% 초기 initial
radio = radios(1);
fc = wlanChannelFrequency(channelNumber, frequencyBand);
sampleRate = sampleRate * 1e6;
if strcmp(radio.Status, "Success")
rx = comm.SDRuReceiver( ...
Platform = radio.Platform, ... %장비명(b210)
SerialNum = radio.SerialNum, ... %시리얼번호
CenterFrequency = fc, ... %중앙 주파수
MasterClockRate = sampleRate * decimationFactor, ... %내부 샘플 생성 속도
DecimationFactor = decimationFactor, ... %디지털 다운샘플링
Gain = gain, ... %아날로그 증폭
SamplesPerFrame = samplePerFrame, ... %버퍼링
OutputDataType = 'double' ... %매트랩전달형식
);
else
error('Device connection failed. Please check the hardware and try again.');
end
하드코딩 해도 되지만, 그냥 자연스럽게 연결됐는지 확인하고, 연결됐다면, 해당 결과값을 넣게 코드를 짜고싶어서 위와같이 설정하였다.
radios(1)로 아까 하드웨어 정보 들어가있는 구조체의 값을 가져오고, 거기서 나온 것들을 rx = comm.SDRuReceiver 안에다가 하나하나 넣어줌으로써 초기화한다.
각 변수가 무엇을 의미하느지는 주석을 참고하길 바란다.
그래프 출력 환경 설정
%% 그래프 + 실험 환경 설정
%그래프+실험 세팅
fig = figure(1);
maxHistory = 6; % 최근 패킷 몇 개 볼지
displayLimit = 8000; % 시각화할 신호의 최대 길이
plotHandles = gobjects(maxHistory,1);
specHandles = gobjects(maxHistory,1);
for k = 1:maxHistory
subplot(maxHistory,2,(k-1)*2+1);
plotHandles(k) = plot(NaN,NaN);
grid on;
title(sprintf('Time Domain #%d', k));
subplot(maxHistory,2,(k-1)*2+2);
specHandles(k) = imagesc(NaN);
axis xy;
title(sprintf('Spectrogram #%d', k));
end
packetHistory = cell(maxHistory,1);
% 데이터 수신 및 패킷 처리
packetCount = 0;
stopAll = false;
buffer = [];
맨 위의 사진처럼, 몇 개 패킷 모습을 캡처할 것인지, 그래프는 어떻게 출력할 것인지 제목과 범례 설정하는 부분이다.
신호 수신하고 STF찾기
%% 신호 수신 및 실시간 감지 루프
disp("Scanning for Wi-Fi signals...");
for i = 1:maxLoops
% 데이터 수신
if stopAll, break; end
[data, len] = rx();
if len <=0, continue; end
% buffer에 누적
buffer = [buffer; data];
% 신호 수신 및 처리 루프
disp("Receiving signals...");
idx = wlanPacketDetect(buffer, sampleRateToCBW(sampleRate), 0, threshold);
wlanPacketDetect를 이용하여, 와이파이패킷의 L-STF(Shotr Training Field)를 처음에 찾는 과정이다.
즉, 패킷의 "시작 지점"을 찾는 함수이다.
이때 데이터를 계속해서 들어올 것이기에, buffer변수에 계속 누적시켜주는 과정이다.
어떻게 찾냐면
자기상관(auto-correlation) 기반으로, 짧은 주기 반복 (≈ 0.8μs)을 이용해서 “아, 여기 Wi-Fi 패킷 시작이다” 를 판단하는 과정이다.
wlanPacketDetect는 Wi-Fi 패킷의 시작을 알리는 L-STF를 검출하여 패킷의 시작 인덱스를 반환하며, 연속적으로 유입되는 신호를 안정적으로 분석하기 위해 buffer에 데이터를 누적하여 처리한다.
패킷 추출
while ~isempty(idx) && all(idx > 0)
%% 패킷 추출
extractLen = 30000;
if idx(1) + extractLen > size(buffer, 1)
break; % 데이터가 더 쌓일 때까지 대기
end
rxPacket = buffer(idx : idx + extractLen - 1);
% L-SIG 디코딩
%TODO
%-------------
packetCount = packetCount + 1;
% ==== 패킷 저장 (히스토리 유지) ====
packetHistory = [{rxPacket}; packetHistory(1:end-1)];
STF를 찾았을때 찾으면 해당 위치 idx를 반환한다. 그래서 해당
검출된 패킷 시작 위치(idx)가 존재하면 계속 처리한다
이때 패킷 전체 길이를 자를 때
- buffer는 계속 데이터가 쌓이는 구조
- 패킷이 중간에 잘리면 분석 불가능
- 그래서 충분히 쌓일 때까지 대기
로 인하여 패킷 전체를 자르기에 데이터가 부족하면 기다린다
검출된 위치부터 일정 길이만큼 잘라서 하나의 패킷으로 본다
“정확한 프레임 길이”가 아니라
“충분히 긴 구간을 잘라서 패킷 포함시키는 방식”
L-SIG 디코딩은 다음시간에 할 것이고, 이제 여기서 패킷을 찾았으면 packetCount +1을 한다.
시각화(그래프 출력)
% ==== 시각화 ====
set(0,'CurrentFigure',fig);
for k = 1:maxHistory
if isempty(packetHistory{k})
continue;
end
pkt = packetHistory{k};
actualLimit = min(length(pkt), displayLimit);
t = (0:actualLimit-1) / sampleRate * 1e6;
sig = abs(pkt(1:actualLimit));
% --- Time domain ---
subplot(maxHistory,2,(k-1)*2+1);
set(plotHandles(k), 'XData', t, 'YData', sig);
title(sprintf('Packet #%d (latest-%d)', packetCount-k+1, k-1));
xlim([0 t(end)]);
ylim([0 max(sig)*1.2 + 1e-6]);
% --- Spectrogram ---
subplot(maxHistory,2,(k-1)*2+2);
[S,F,T] = spectrogram(pkt(1:actualLimit),256,200,256,sampleRate,'centered');
imagesc(T*1e6, F/1e6, 20*log10(abs(S)));
axis xy;
xlabel('Time (μs)');
ylabel('Freq (MHz)');
end
drawnow limitrate;
% ================================
시간 그래프와 spectrogram 두개를 그리도록 설정한다.
종료 및 마무리
if justOne, stopAll = true; break; end
skip = 2000;
if idx + skip < size(buffer,1)
buffer = buffer(idx + skip:end,:);
else
buffer = [];
end
idx = wlanPacketDetect(buffer, sampleRateToCBW(sampleRate), 0, threshold);
end
end
disp("탐색 종료");
release(rx); % 하드웨어 해제
종료 조건이 나오면 종료시키고, release시킨다.
수행 결과
이제 이 전체 코드를 합쳐서 그래프를 그리면

이런식으로 그래프가 나온 것을 확인할 수 있다.
(매트랩 꺼져서 이 파일들 다 날아가서 다시 캡처했다라는 사실은 안 비밀)
그래프 분석하기
Packet#26(latest-0)


Time Domain부터 보자.(위 그래프)
약 55μs 지점부터 진폭(Amp)이 0근처에서 0.02 이상으로 솟구치는 지점이 있다.
이 시작부에는 L-STF(Short Training Field)가 포함되어 있을 가능성이 높다.
L-STF(Short Training Field) 구간은, 수신기가 신호를 감지하고 하드웨어 이득(Gain)을 조절하는 '노크' 단계이다.
L-STF는 0.8 μs 길이의 short symbol이 10회 반복되어 총 8 μs를 구성한다. 따라서 수신 신호에서 0.8 μs 주기의 반복성이 관측된다면 L-STF로 판단할 근거가 된다.
그 뒤로 LTF, SIG, DATA가 포함되어 있을 것이다. OFDM 방식 특성상 여러 주파수가 합쳐지기 때문에 타임 도메인에서는 저렇게 복잡한 노이즈 같은 파형으로 나타난다.
패킷이 종료되는 시점인 90μs 이후에서는 에너지가 다시 바닥으로 떨어진다. 통신 한 주기가 끝났음을 의미한다.
저 사이에 이제 데이터가 전송됐다라는 것을 의미한다.
그다음 Spectrogram(스펙트로그램)을 보자.
중심 주파수 기준 baseband에서 에너지가 약 ±9~10 MHz 범위에 분포하므로, 약 20 MHz 대역폭의 OFDM Wi-Fi 신호로 해석할 수 있다. 에너지가 0 MHz를 중심으로 비교적 대칭적으로 분포하므로, 수신 중심 주파수 설정이 크게 벗어나 있지는 않아 보인다.
노란색에 가까운 영역은 상대적으로 신호 에너지가 큰 구간이며, 배경의 파란색 영역과 대비가 클수록 신호 대 잡음비가 양호하다고 볼 수 있다. 다만 정확한 SNR은 별도로 잡음 전력과 신호 전력을 계산해야 한다.
Packet #23(latest-3)
패킷이 비슷비슷해서, 하나만 더 분석해보자.


아까랑 똑같다. 50-90μs에 첫번째 burst가 있고, 150~185μs에 두 번째 burst가 있고, 둘다 약 30μs 길이로 있다.
그리고 그 사이에는 약 70μs 간격이 있다.
1차적으로 해석하면, 연속된 두 개의 Wi-Fi 프레임으로
이런 상황은 Data Packet을 보내고 SIFS 지난 후에 ACK를 보낸 데이터 프레임이라고 해석할 수 있다.
스펙트로그램을 보면
두 구간 모두 넓은 대역(≈20 MHz)에 에너지 분포하여 OFDM인 것을 알 수 있고, 두 burst 모두 형태가 유사하여 같은 계열 프레임 , 나머지 구간은 noise 수준으로 이해할 수 있다.
2.4GHz vs 5GHz 신호 비교

이번엔 2.4GHz의 1번 채널을 가져왔다.
5GHz로 와이파이 패킷인지 비교적 찾아내기 쉬웠던 거 같은데, 지금 스펙트로그램만 보더라도 많이 노란색으로 깔려있는 게 볼 수 있다. 어떤 곳은 노란색 띠가 중심주파수에 있거나, 5MHz 대역에 이루어져있거나, -10MHz대역에 있는 곳도 있다.
매우 혼잡한 환경: 블루투스, 전자레인지, 다른 와이파이 기기들이 같은 대역을 공유하므로 인접 채널 간섭(ACI)이 심하게 발생
신호 왜곡: 주변 신호들이 섞이면서 타임 도메인 파형의 바닥 레벨이 올라가고, 스펙트로그램상에서 에너지가 지저분하게 퍼짐
패킷이라고 보기에는 더 분석을 해봐야할겠지만 그냥 RF신호 덩어리일수도 있다.
| 특징 | Wi-Fi | 간섭 |
| 시간 | 짧음 (burst) | 길거나 지속 |
| 주파수 | 넓음 (20MHz) | 좁음 or 불규칙 |
| 구조 | 반복됨 (STF) | 없음 |
즉 2.4GHz에는 패킷 + 간섭 + 노이즈 섞여서 혼란인 상태이다.
2.4GHz는 “항상 간섭이 깔린 환경이라 패킷이 묻혀 보이는 상태이기에 이제 Wi-Fi 인지 간섭인지 구분해야할 필요가 있다.
에필로그
이제 다음 글에서는 WiFi 7 에서 PHY계층은 기존과 어떻게 달라졌는지, 무엇이 추가되었는지
그리고, 물리 신호로부터 STF/LTF/SIG을 하나하나 디코딩 하는 과정에 대해서 알아보도록 하자.
참고자료
https://kr.mathworks.com/help/wlan/ug/ofdm-beacon-receiver-using-software-defined-radio.html
WLAN Beacon Receiver Using Software-Defined Radio - MATLAB & Simulink
Retrieve information about WiFi networks on the 5 GHz band using a software-defined radio.
kr.mathworks.com
https://kr.mathworks.com/help/wlan/ug/recover-and-analyze-packets-in-802-11-waveform.html
Recover and Analyze Packets in 802.11 Waveform - MATLAB & Simulink
Blindly detect, decode, and analyze IEEE 802.11 packets in a waveform.
kr.mathworks.com
https://kr.mathworks.com/help/wlan/ug/recovery-procedure-for-an-802-11be-packet.html
Recovery Procedure for an 802.11be Packet - MATLAB & Simulink
Detect a packet and decode payload bits in an IEEE 802.11be waveform.
kr.mathworks.com
'네트워크' 카테고리의 다른 글
| [WiFi] USRP B210과 MATLAB으로 WiFi 신호 캡처해서 패킷 내용 확인하기 (3) | 2026.05.15 |
|---|---|
| [WiFi] IEEE 802.11 WIFI의 PHY 계층에 대해서 알아보자 (0) | 2026.04.29 |
| [WiFi] WIFI 7 공유기가 자신의 존재를 알리는 방법(2/2) - Beacon Frame의 MLE + Wireshark로 분석하기 (0) | 2026.04.24 |
| [WiFi] WIFI 7 공유기가 자신의 존재를 알리는 방법(1/2) - Beacon Frame의 RNR (0) | 2026.04.24 |
| [WiFi] 802.11be의 EMLSR 모드에 대해서 알아보자 - 동작과정/표준/관련연구/MATLAB 실습 (0) | 2026.04.19 |