Trong bài viết này, tôi sẽ tiếp tục sử dụng Matlab + RTL-SDR nhằm thu tín hiệu trực tiếp và đi sâu hơn vào việc phân tích các bit dữ liệu nhằm giúp cho người đọc có thể kiểm chứng giữa lý thuyết thiết kế và tín hiệu thực tế trong đời sống thực.

Nhóm cũng đã có một số bài viết liên quan đến ADS-B có thể tham khảo tại https://www2.t17lab.com/blog/tag/ads-b/

Tải nội dung file Matlab tại đây: ads-b.zip ; Nội dung Matlab Livescript adsb.html

Tổng quan

Trong các phòng nghiên cứu vô tuyến, việc thiết lập môi trường thu/phát ADS-B thường có giá trị lên đến hàng nghìn mỹ kim và yêu cầu một số thiết lập phức tạp để có thể phục vụ nghiên cứu và đưa vào ứng dụng thương mại. Tuy nhiên, đối với sinh viên hoặc môi trường đại học tại Việt Nam, các bạn có thể tiếp cận với phương pháp kiểm chứng nguồn dữ liệu vô tuyến ADS-B bằng cách sử dụng phần cứng RTL-SDR với chi phí gần 700.000đ, và kết hợp với phần mềm khá quen thuộc là Matlab có hỗ trợ các lệnh và giải thuật trích xuất dữ liệu trực quan cho người học.

Matlab đã hỗ trợ kết nối nguồn thu tín hiệu trực tiếp từ phần cứng RTL-SDR trong bộ Simulink

Trong ví dụ này, người dùng sẽ có thể:

  • nắm một số lệnh, công cụ Matlab trong việc tương tác với phần cứng RTL-SDR
  • nắm các khái niệm trong giao thức ADS-B
  • xử lý tín hiệu số
  • vẽ đồ thị và một số phương thức theo dõi dữ liệu thời gian thực trong Matlab
  • và một số thứ khác…

Tiến hành thực nghiệm

a. Cài đặt phần cứng, phần mềm

Quá trình cài đặt Matlab và các gói hỗ trợ có thể tham khảo bài viết sau:

Kết nối rtl-sdr vào máy tính và kiểm tra tại Matlab bằng lệnh sdrinfo,

Kiểm tra hoạt động giữa Matlab và phần cứng

b. Thiết lập thông số và thu dữ liệu

Phần cứng rtl-sdr có thể thu ADS-B tại tần số 1090 MHz, máy phát (tàu bay) sử dụng điều chế tín hiệu theo vị trí xung (pulse-position modulation – PPM) với tốc độ truyền là 1Mbit/giây. Với lệnh sau, tôi thiết lập các thông số thu tại phần cứng theo yêu cầu kỹ thuật của máy phát:

RX = comm.SDRRTLReceiver('0','CenterFrequency',1090e6,...
'EnableTunerAGC',false,'TunerGain',60,'SampleRate',2.4e6,...
'OutputDataType','single','SamplesPerFrame',262144,...
'FrequencyCorrection',0);

Tiếp theo, tôi tiến hành thu dữ liệu trực tiếp dữ liệu ADS-B từ tàu bay và gán vào giá trị biến trong Matlab, các dữ liệu này được lưu trữ theo định dạng IQ (tham khảo Sử dụng định dạng I/Q trong lưu trữ, điều khiển tín hiệu vô tuyến số):

IQSamples = step(RX);
Các biến được gán giá trị hiển thị phía bên phải
Dữ liệu định dạng IQ được lưu trữ và có thể tiến hành phân tích thủ công hoặc dùng cho việc phát lại trong môi trường giới hạn (cần cách ly môi trường thiết bị phát)

c. Phân tích thủ công tín hiệu qua đồ thị

Sau khi thu dữ liệu, tôi tiếp thục tiến hành vẽ đồ thị vùng dữ liệu theo thời gian bằng lệnh:

plot(abs(IQSamples));
Đồ thị hiển thị cường độ tín hiệu ADS-B theo thời gian

Tại tần số 1090 MHz, tôi đã tiến hành thu trong thời gian ngắn, kết quả hiển thị có nhiều vùng nhiễu trong biểu đồ, những vùng có cường độ mạnh là các tín hiệu không lưu phát từ tàu bay. Bằng cách phóng to các vùng đồ thị có biên độ lớn, bạn có thể thấy các xung dữ liệu với độ phân giải khoản 0.025 giây, đây là các bit dữ liệu có thể giải mã (decode) trực tiếp.

Phóng to vùng hiển thị có biên độ cao
Tín hiệu ADS-B có thể xem rõ khi có độ phóng to phù hợp
Cấu trúc của Mode-S sử dụng 80 bit tín hiệu trong phần đầu và phần dữ liệu chứa 56 hoặc 112 bit dữ liệu.

Tín hiệu ADS-B có phần mở đầu gói tin là 8 bit (tương đường 8 miro giây) và sau đó là 112 bit dữ liệu được truyền đi. Để xác định được nguồn dữ liệu chính xác, đầu tiên tôi sẽ tăng tần số lấy mẫu dữ liệu (sample rate) lên 12 MHz sử dụng FIRInterpolator System trong bộ công cụ DSP System Toolbox, tiếp theo ta sẽ xem tương quan dữ liệu với mẫu ban đầu đã biết từ đó căn chỉnh thời gian chính xác.

% Upsample the IQ samples by 5x to improve time resolution
interpFIR=dsp.FIRInterpolator(5);
data = step(interpFIR,IQSamples);
% Calculate correlation to ADS-B preamble (Use this calculation to find message bit #1)
preamble = [ones(1,6) zeros(1,6) ones(1,6) zeros(1,24) ones(1,6)...
zeros(1,6) ones(1,6)];
correlatedData = xcorr(preamble', flipud(double(abs(data))));

 

Trong phần đồ thị so sánh, chúng ta thấy được dữ liệu preamable được xác định tại vị trí chính xác bằng cách sử dụng công thức trên, việc này sẽ giúp thiết bị xử lý các định chính xác vùng dữ liệu bắt đầu giải mã. Việc giải mã dữ liệu cần nhanh chóng và liên tục, do vậy người dùng có thể sử dụng Simulink (Airplane Tracking Using ADS-B Signals) để tiếp tục phân tích sâu hơn về lược đồ và thuật toán trích xuất dữ liệu thời gian thực.

Tham khảo