Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B

Π—Π΄Ρ€Π°Π²ΠΎ Π₯Π°Π±Ρ€. Π’Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ сСкој ΡˆΡ‚ΠΎ нСкогаш срСтнал ΠΈΠ»ΠΈ испратил Ρ€ΠΎΠ΄Π½ΠΈΠ½ΠΈ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΡ˜Π°Ρ‚Π΅Π»ΠΈ Π²ΠΎ Π°Π²ΠΈΠΎΠ½, ја користСл бСсплатната услуга Flightradar24. Ова Π΅ ΠΌΠ½ΠΎΠ³Ρƒ ΡƒΠ΄ΠΎΠ±Π΅Π½ Π½Π°Ρ‡ΠΈΠ½ Π·Π° слСдСњС Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Π°Π²ΠΈΠΎΠ½ΠΎΡ‚ Π²ΠΎ Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅.

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B

Π’ ΠΏΡ€Π²ΠΈΠΎΡ‚ Π΄Π΅Π» Π‘Π΅ΡˆΠ΅ опишан ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΡ‚ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° Ρ‚Π°ΠΊΠ²Π° онлајн услуга. Π‘Π΅Π³Π° ќС ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌΠ΅ ΠΈ ќС ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ΠΌΠ΅ ΠΊΠΎΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ сС ΠΈΡΠΏΡ€Π°ΡœΠ°Π°Ρ‚ ΠΈ ΠΏΡ€ΠΈΠΌΠ°Π°Ρ‚ ΠΎΠ΄ Π°Π²ΠΈΠΎΠ½ΠΎΡ‚ Π΄ΠΎ станицата Π·Π° ΠΏΡ€ΠΈΠΌΠ°ΡšΠ΅ ΠΈ самитС ќС Π³ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°ΠΌΠ΅ со помош Π½Π° Python.

ΠŸΡ€ΠΈΠΊΠ°Π·Π½Π°

ΠžΡ‡ΠΈΠ³Π»Π΅Π΄Π½ΠΎ, ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π·Π° Π°Π²ΠΈΠΎΠ½ΠΈΡ‚Π΅ Π½Π΅ сС прСнСсуваат Π·Π° корисницитС Π΄Π° Π³ΠΈ Π²ΠΈΠ΄Π°Ρ‚ Π½Π° Π½ΠΈΠ²Π½ΠΈΡ‚Π΅ ΠΏΠ°ΠΌΠ΅Ρ‚Π½ΠΈ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΈ. БистСмот сС Π½Π°Ρ€Π΅ΠΊΡƒΠ²Π° ADS-B (Automatic dependent surveillance-broadcast) ΠΈ сС користи Π·Π° автоматско ΠΏΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° Π°Π²ΠΈΠΎΠ½ΠΎΡ‚ Π΄ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈΠΎΡ‚ Ρ†Π΅Π½Ρ‚Π°Ρ€ - сС прСнСсуваат Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΈΡ‚Π΅, насоката, Π±Ρ€Π·ΠΈΠ½Π°Ρ‚Π°, надморската височина ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. ΠŸΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ, ΠΏΡ€Π΅Π΄ ΠΏΠΎΡ˜Π°Π²Π°Ρ‚Π° Π½Π° Ρ‚Π°ΠΊΠ²ΠΈ систСми, диспСчСрот моТСшС Π΄Π° Π²ΠΈΠ΄ΠΈ само Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° Ρ€Π°Π΄Π°Ρ€ΠΎΡ‚. Ова вСќС Π½Π΅ бСшС Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΠΊΠΎΠ³Π° имашС ΠΏΡ€Π΅ΠΌΠ½ΠΎΠ³Ρƒ Π°Π²ΠΈΠΎΠ½ΠΈ.

Π’Π΅Ρ…Π½ΠΈΡ‡ΠΊΠΈ, ADS-B сС состои ΠΎΠ΄ ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚Π΅Π» Π½Π° Π°Π²ΠΈΠΎΠ½ кој ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎ ΠΈΡΠΏΡ€Π°ΡœΠ° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ со ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π° ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ висока Ρ„Ρ€Π΅ΠΊΠ²Π΅Π½Ρ†ΠΈΡ˜Π° ΠΎΠ΄ 1090 MHz (ΠΈΠΌΠ° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠΈ, Π½ΠΎ Π½ΠΈΠ΅ Π½Π΅ смС Ρ‚ΠΎΠ»ΠΊΡƒ заинтСрСсирани Π·Π° Π½ΠΈΠ², бидСјќи ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΈΡ‚Π΅ сС прСнСсуваат само ΠΎΠ²Π΄Π΅). Π‘Π΅ΠΊΠ°ΠΊΠΎ, ΠΏΠΎΠΊΡ€Π°Ρ˜ ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚Π΅Π»ΠΎΡ‚, Π½Π΅ΠΊΠ°Π΄Π΅ Π½Π° Π°Π΅Ρ€ΠΎΠ΄Ρ€ΠΎΠΌΠΎΡ‚ ΠΈΠΌΠ° ΠΈ рСсивСр, Π½ΠΎ Π·Π° нас ΠΊΠ°ΠΊΠΎ корисници интСрСсСн Π΅ Π½Π°ΡˆΠΈΠΎΡ‚ сопствСн рСсивСр.

ΠŸΠ°Ρ‚Π΅ΠΌ, Π·Π° спорСдба, ΠΏΡ€Π²ΠΈΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ² систСм, Airnav Radarbox, Π΄ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°Π½ Π·Π° ΠΎΠ±ΠΈΡ‡Π½ΠΈ корисници, сС појави Π²ΠΎ 2007 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ Ρ‡ΠΈΠ½Π΅ΡˆΠ΅ ΠΎΠΊΠΎΠ»Ρƒ 900 Π΄ΠΎΠ»Π°Ρ€ΠΈ; ΠΏΡ€Π΅Ρ‚ΠΏΠ»Π°Ρ‚Π° Π½Π° ΠΌΡ€Π΅ΠΆΠ½ΠΈΡ‚Π΅ услуги Ρ‡ΠΈΠ½Π΅ΡˆΠ΅ ΡƒΡˆΡ‚Π΅ 250 Π΄ΠΎΠ»Π°Ρ€ΠΈ годишно.

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B

ΠžΡΠ²Ρ€Ρ‚ΠΈ Π½Π° Ρ‚ΠΈΠ΅ ΠΏΡ€Π²ΠΈ руски сопствСници ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π°Ρ‚ Π½Π° Ρ„ΠΎΡ€ΡƒΠΌΠΎΡ‚ радиоскСнСр. Π‘Π΅Π³Π° ΠΊΠΎΠ³Π° RTL-SDR ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΡ†ΠΈΡ‚Π΅ станаа ΡˆΠΈΡ€ΠΎΠΊΠΎ достапни, сличСн ΡƒΡ€Π΅Π΄ ΠΌΠΎΠΆΠ΅ Π΄Π° сС состави Π·Π° 30 Π΄ΠΎΠ»Π°Ρ€ΠΈ; повСќС Π·Π° ΠΎΠ²Π° бСшС Π²ΠΎ ΠΏΡ€Π²ΠΈΠΎΡ‚ Π΄Π΅Π». АјдС Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌΠ΅ Π½Π° самиот ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» - Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°.

ΠŸΡ€ΠΈΠΌΠ°ΡšΠ΅ сигнали

ΠŸΡ€Π²ΠΎ, сигналот Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС сними. Π¦Π΅Π»ΠΈΠΎΡ‚ сигнал ΠΈΠΌΠ° Π²Ρ€Π΅ΠΌΠ΅Ρ‚Ρ€Π°Π΅ΡšΠ΅ ΠΎΠ΄ само 120 микросСкунди, ΠΏΠ° Π·Π° ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°ΡΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΡšΠ΅ Π½Π° Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ, ΠΏΠΎΠΆΠ΅Π»Π΅Π½ Π΅ SDR ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ со Ρ„Ρ€Π΅ΠΊΠ²Π΅Π½Ρ†ΠΈΡ˜Π° Π½Π° зСмањС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ†ΠΈ ΠΎΠ΄ Π½Π°Ρ˜ΠΌΠ°Π»ΠΊΡƒ 5 MHz.

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B

По ΡΠ½ΠΈΠΌΠ°ΡšΠ΅Ρ‚ΠΎ, Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ WAV-Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° со Π±Ρ€Π·ΠΈΠ½Π° Π½Π° зСмањС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ†ΠΈ ΠΎΠ΄ 5000000 ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ†ΠΈ/сСк; 30 сСкунди ΠΎΠ΄ Ρ‚Π°ΠΊΠ²ΠΎΡ‚ΠΎ снимањС β€žΡ‚Π΅ΠΆΠ°Ρ‚β€œ ΠΎΠΊΠΎΠ»Ρƒ 500 MB. Π‘Π»ΡƒΡˆΠ°ΡšΠ΅Ρ‚ΠΎ со ΠΌΠ΅Π΄ΠΈΠ° ΠΏΠ»Π΅Π΅Ρ€, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, Π΅ бСскорисно - Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π½Π΅ содрТи Π·Π²ΡƒΠΊ, Ρ‚ΡƒΠΊΡƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π΄ΠΈΠ³ΠΈΡ‚Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ радиосигнал - Ρ‚ΠΎΠΊΠΌΡƒ Π²Π°ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚ΠΈ Software Defined Radio.

ЌС ја ΠΎΡ‚Π²ΠΎΡ€ΠΈΠΌΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌΠ΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Python. ОниС ΠΊΠΎΠΈ сакаат сами Π΄Π° СкспСримСнтираат ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° ΠΏΡ€Π΅Π·Π΅ΠΌΠ°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° снимањС ΠΏΠΎ ссылкС.

АјдС Π΄Π° ја ΠΏΡ€Π΅Π·Π΅ΠΌΠ΅ΠΌΠ΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΡˆΡ‚ΠΎ ΠΈΠΌΠ° Π²Π½Π°Ρ‚Ρ€Π΅.

from scipy.io import wavfile
import matplotlib.pyplot as plt
import numpy as np

fs, data = wavfile.read("adsb_20190311_191728Z_1090000kHz_RF.wav")
data = data.astype(float)
I, Q = data[:, 0], data[:, 1]
A = np.sqrt(I*I + Q*Q)

plt.plot(A)
plt.show()

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚: Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΡ‡ΠΈΠ³Π»Π΅Π΄Π½ΠΈ β€žΠΏΡƒΠ»ΡΠΈΡ€Π°ΡšΠ°β€œ наспроти Π±ΡƒΡ‡Π°Π²Π°Ρ‚Π° Π²ΠΎ ΠΏΠΎΠ·Π°Π΄ΠΈΠ½Π°.

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B

БСкој β€žΠΏΡƒΠ»Ρβ€œ Π΅ сигнал, Ρ‡ΠΈΡ˜Π° структура Π΅ јасно Π²ΠΈΠ΄Π»ΠΈΠ²Π° Π°ΠΊΠΎ ја Π·Π³ΠΎΠ»Π΅ΠΌΠΈΡ‚Π΅ Ρ€Π΅Π·ΠΎΠ»ΡƒΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΎΡ‚.

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B

Како ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, сликата Π΅ сосСма конзистСнтна со ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π΅ Π΄Π°Π΄Π΅Π½ΠΎ Π²ΠΎ описот ΠΏΠΎΠ³ΠΎΡ€Π΅. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ со ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅.

Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅

ΠŸΡ€Π²ΠΎ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅Ρ‚Π΅ ΠΌΠ°Π»ΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊ. Π‘Π°ΠΌΠΈΠΎΡ‚ сигнал Π΅ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½ со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ ΠœΠ°Π½Ρ‡Π΅ΡΡ‚Π΅Ρ€:

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B

Од Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° Π²ΠΎ Π½ΠΈΠ²ΠΎΠ°Ρ‚Π° Π²ΠΎ Π³Ρ€ΠΈΡ†ΠΊΠ°ΡšΠ΅Ρ‚ΠΎ лСсно Π΅ Π΄Π° сС Π΄ΠΎΠ±ΠΈΡ˜Π°Ρ‚ вистински β€ž0β€œ ΠΈ β€ž1β€œ.

    bits_str = ""
    for p in range(8):
        pos = start_data + bit_len*p
        p1, p2 = A[pos: pos + bit_len/2], A[pos + bit_len/2: pos + bit_len]
        avg1, avg2 = np.average(p1), np.average(p2)
        if avg1 < avg2:
            bits_str += "0"
        elif avg1 > avg2:
            bits_str += "1"

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π½Π° самиот сигнал Π΅ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ слСдува:

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B

Π”Π° Π³ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΏΠΎΠ»ΠΈΡšΠ°Ρ‚Π° ΠΏΠΎΠ΄Π΅Ρ‚Π°Π»Π½ΠΎ.

DF (Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° Π΄ΠΎΠ»Π½Π° врска, 5 Π±ΠΈΡ‚Π°) - Π³ΠΎ ΠΎΠ΄Ρ€Π΅Π΄ΡƒΠ²Π° Ρ‚ΠΈΠΏΠΎΡ‚ Π½Π° ΠΏΠΎΡ€Π°ΠΊΠ°Ρ‚Π°. ΠŸΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π²ΠΈΠ΄ΠΎΠ²ΠΈ:

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B
(ΠΈΠ·Π²ΠΎΡ€ Π½Π° Ρ‚Π°Π±Π΅Π»Π°)

Нас Π½Γ¨ интСрСсира само Ρ‚ΠΈΠΏΠΎΡ‚ DF17, бидСјќи ... Π’ΠΎΠΊΠΌΡƒ Ρ‚ΠΎΠ° Π³ΠΈ содрТи ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΈΡ‚Π΅ Π½Π° Π°Π²ΠΈΠΎΠ½ΠΎΡ‚.

ICAO (24 Π±ΠΈΡ‚Π°) - ΠΌΠ΅Ρ“ΡƒΠ½Π°Ρ€ΠΎΠ΄Π΅Π½ СдинствСн ΠΊΠΎΠ΄ Π½Π° Π°Π²ΠΈΠΎΠ½ΠΎΡ‚. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ Π°Π²ΠΈΠΎΠ½ΠΎΡ‚ спорСд Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ онлајн (Π·Π° ΠΆΠ°Π», Π°Π²Ρ‚ΠΎΡ€ΠΎΡ‚ прСстана Π΄Π° ја Π°ΠΆΡƒΡ€ΠΈΡ€Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, Π½ΠΎ Ρ‚Π°Π° сè ΡƒΡˆΡ‚Π΅ Π΅ Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½Π°). На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π° ΠΊΠΎΠ΄ΠΎΡ‚ 3c5ee2 Π³ΠΈ ΠΈΠΌΠ°ΠΌΠ΅ слСднитС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ:

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B

Π£Ρ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅: Π²ΠΎ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ Π½Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° ΠžΠΏΠΈΡΠΎΡ‚ Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π° ICAO Π΅ Π΄Π°Π΄Π΅Π½ ΠΏΠΎΠ΄Π΅Ρ‚Π°Π»Π½ΠΎ, ΠΈΠΌ ΠΏΡ€Π΅ΠΏΠΎΡ€Π°Ρ‡ΡƒΠ²Π°ΠΌ Π½Π° заинтСрСсиранитС Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π°Ρ‚.

ΠŸΠžΠ”ΠΠ’ΠžΠ¦Π˜ (56 ΠΈΠ»ΠΈ 112 Π±ΠΈΡ‚Π°) - вистинскитС ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΡˆΡ‚ΠΎ ќС Π³ΠΈ Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΠΌΠ΅. ΠŸΡ€Π²ΠΈΡ‚Π΅ 5 Π±ΠΈΡ‚Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ сС ΠΏΠΎΠ»Π΅Ρ‚ΠΎ ВнСсСтС ΠΊΠΎΠ΄, кој Π³ΠΎ содрТи ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΡ‚ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ сС складираат (Π΄Π° Π½Π΅ сС мСша со DF). ΠŸΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΎΠ΄ ΠΎΠ²ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ:

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B
(ΠΈΠ·Π²ΠΎΡ€ Π½Π° Ρ‚Π°Π±Π΅Π»Π°)

АјдС Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ.

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° Π°Π²ΠΈΠΎΠ½

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎ Π±ΠΈΠ½Π°Ρ€Π½Π° Ρ„ΠΎΡ€ΠΌΠ°:

00100 011 000101 010111 000111 110111 110001 111000

Полиња со ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ:

+------+------+------+------+------+------+------+------+------+------+
| TC,5 | EC,3 | C1,6 | C2,6 | C3,6 | C4,6 | C5,6 | C6,6 | C7,6 | C8,6 |
+------+------+------+------+------+------+------+------+------+------+

TC = 00100b = 4, сСкој Π·Π½Π°ΠΊ C1-C8 содрТи ΡˆΠΈΡ„Ρ€ΠΈ ΡˆΡ‚ΠΎ ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°Π°Ρ‚ Π½Π° индСкситС Π²ΠΎ Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π°:
#ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789#################XNUMX######

Π‘ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π½ΠΈΠ·Π°Ρ‚Π°, лСсно Π΅ Π΄Π° сС Π΄ΠΎΠ±ΠΈΠ΅ ΡˆΠΈΡ„Ρ€Π°Ρ‚Π° Π½Π° Π°Π²ΠΈΠΎΠ½ΠΎΡ‚: EWG7184

symbols = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789######"
code_str = ""
for p in range(8):
     c = int(bits_str[8 + 6*p:8 + 6*(p + 1)], 2)
     code_str += symbols[c]
print("Aircraft Identification:", code_str.replace('#', ''))

Π’ΠΎΠ·Π΄ΡƒΡˆΠ½Π° ΠΏΠΎΠ»ΠΎΠΆΠ±Π°

Ако ΠΈΠΌΠ΅Ρ‚ΠΎ Π΅ Сдноставно, Ρ‚ΠΎΠ³Π°Ρˆ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΈΡ‚Π΅ сС ΠΏΠΎΠΊΠΎΠΌΠΏΠ»ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ. Π’ΠΈΠ΅ сС прСнСсуваат Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ° Π½Π° 2, ΠΏΠ°Ρ€Π½ΠΈ ΠΈ Π½Π΅ΠΏΠ°Ρ€Π½ΠΈ Ρ€Π°ΠΌΠΊΠΈ. Код Π½Π° ΠΏΠΎΠ»Π΅ TC = 01011b = 11.

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΠΏΠ°Ρ€Π½ΠΈ ΠΈ Π½Π΅ΠΏΠ°Ρ€Π½ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ:

01011 000 000101110110 00 10111000111001000 10000110101111001
01011 000 000110010000 01 10010011110000110 10000011110001000

Π‘Π°ΠΌΠ°Ρ‚Π° прСсмСтка Π½Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΈΡ‚Π΅ сС случува спорСд ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Π½Π΅Π·Π³ΠΎΠ΄Π½Π° Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°:

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B
(ΠΈΠ·Π²ΠΎΡ€)

Јас Π½Π΅ сум СкспСрт Π·Π° Π“Π˜Π‘, ΠΏΠ° Π½Π΅ Π·Π½Π°ΠΌ ΠΎΠ΄ ΠΊΠ°Π΄Π΅ Π΄ΠΎΠ°Ρ“Π°. Кој Π·Π½Π°Π΅, ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π²ΠΎ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ.

Висината сС смСта Π·Π° поСдноставна - Π²ΠΎ зависност ΠΎΠ΄ спСцифичниот Π±ΠΈΡ‚, ΠΌΠΎΠΆΠ΅ Π΄Π° сС прСтстави ΠΊΠ°ΠΊΠΎ ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π» ΠΎΠ΄ 25 ΠΈΠ»ΠΈ 100 стапки.

Π’ΠΎΠ·Π΄ΡƒΡˆΠ½Π° Π±Ρ€Π·ΠΈΠ½Π°

ΠŸΠ°ΠΊΠ΅Ρ‚ со Π’Π¦=19. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° ΠΎΠ²Π΄Π΅ Π΅ ΡˆΡ‚ΠΎ Π±Ρ€Π·ΠΈΠ½Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΈΠ»ΠΈ Ρ‚ΠΎΡ‡Π½Π°, Π²ΠΎ однос Π½Π° Π·Π΅ΠΌΡ˜Π°Ρ‚Π° (Π±Ρ€Π·ΠΈΠ½Π° Π½Π° Π·Π΅ΠΌΡ˜Π°Ρ‚Π°) ΠΈΠ»ΠΈ Π²ΠΎΠ·Π΄ΡƒΡˆΠ½Π°, ΠΌΠ΅Ρ€Π΅Π½Π° со сСнзор Π½Π° Π°Π²ΠΈΠΎΠ½ (Airspeed). Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, сС прСнСсуваат ΠΌΠ½ΠΎΠ³Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ полиња:

Flightradar24 - ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°? Π”Π΅Π» 2, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ADS-B
(ΠΈΠ·Π²ΠΎΡ€)

Π—Π°ΠΊΠ»ΡƒΡ‡ΠΎΠΊ

Како ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π°Ρ‚Π° ADS-B стана интСрСсна симбиоза, ΠΊΠΎΠ³Π° стандардот Π΅ корисСн Π½Π΅ само Π·Π° профСсионалцитС, Ρ‚ΡƒΠΊΡƒ ΠΈ Π·Π° ΠΎΠ±ΠΈΡ‡Π½ΠΈΡ‚Π΅ корисници. Но, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, ΠΊΠ»ΡƒΡ‡Π½Π° ΡƒΠ»ΠΎΠ³Π° Π²ΠΎ ΠΎΠ²Π° ΠΎΠ΄ΠΈΠ³Ρ€Π° ΠΏΠΎΠ΅Π²Ρ‚ΠΈΠ½Π°Ρ‚Π° Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π° Π½Π° Π΄ΠΈΠ³ΠΈΡ‚Π°Π»Π½ΠΈ SDR ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΡ†ΠΈ, која ΠΌΡƒ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π½Π° ΡƒΡ€Π΅Π΄ΠΎΡ‚ Π±ΡƒΠΊΠ²Π°Π»Π½ΠΎ Π΄Π° ΠΏΡ€ΠΈΠΌΠ° сигнали со Ρ„Ρ€Π΅ΠΊΠ²Π΅Π½Ρ†ΠΈΠΈ Π½Π°Π΄ Π³ΠΈΠ³Π°Ρ…Π΅Ρ€Ρ†ΠΈ β€žΠ·Π° ΠΏΠ΅Π½ΠΈβ€œ.

Π’ΠΎ самиот стандард, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³Ρƒ повСќС. ЗаинтСрСсиранитС ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° Π³ΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Ρ‚ PDF Π½Π° страницата ICAO ΠΈΠ»ΠΈ посСтСтС Π³ΠΎ вСќС спомСнатиот ΠΏΠΎΠ³ΠΎΡ€Π΅ Π²Π΅Π±-страница.

ΠœΠ°Π»ΠΊΡƒ Π΅ Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ Π΄Π΅ΠΊΠ° сСто Π³ΠΎΡ€Π΅Π½Π°Π²Π΅Π΄Π΅Π½ΠΎ ќС Π±ΠΈΠ΄Π΅ корисно Π·Π° ΠΌΠ½ΠΎΠ³ΡƒΠΌΠΈΠ½Π°, Π½ΠΎ Π±Π°Ρ€Π΅ΠΌ ΠΎΠΏΡˆΡ‚Π°Ρ‚Π° идСја Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°, сС Π½Π°Π΄Π΅Π²Π°ΠΌ, останува.

ΠŸΠ°Ρ‚Π΅ΠΌ, Π³ΠΎΡ‚ΠΎΠ² Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ Π²ΠΎ Python вСќС постои, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΡƒΡ‡ΠΈΡ‚Π΅ Ρ‚ΡƒΠΊΠ°. И сопствСницитС Π½Π° SDR ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΡ†ΠΈ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° собСрат ΠΈ лансираат Π³ΠΎΡ‚ΠΎΠ² ADS-B Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ ΠΎΠ΄ страната, ΠΎΠ²Π° бСшС ΠΏΠΎΠ΄Π΅Ρ‚Π°Π»Π½ΠΎ дискутирано Π²ΠΎ ΠΏΡ€Π²ΠΈΠΎΡ‚ Π΄Π΅Π».

Π˜Π·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π° парсСрот опишан Π²ΠΎ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° Π΅ Π΄Π°Π΄Π΅Π½ ΠΏΠΎΠ΄ ΡΠ΅Ρ‡Π΅ΡšΠ΅Ρ‚ΠΎ. Ова Π΅ тСст ΠΏΡ€ΠΈΠΌΠ΅Ρ€ кој Π½Π΅ сС ΠΏΡ€Π΅ΠΏΡ€Π°Π²Π° Π΄Π΅ΠΊΠ° Π΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΡ˜Π°, Π½ΠΎ Π½Π΅ΠΊΠΎΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°Π°Ρ‚ Π²ΠΎ Π½Π΅Π³ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС користи Π·Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° снимСна ΠΏΠΎΠ³ΠΎΡ€Π΅.
Π˜Π·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ (Python)

from __future__ import print_function
from scipy.io import wavfile
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
import math
import sys
def parse_message(data, start, bit_len):
max_len = bit_len*128
A = data[start:start + max_len]
A = signal.resample(A, 10*max_len)
bits = np.zeros(10*max_len)
bit_len *= 10
start_data = bit_len*8
# Parse first 8 bits
bits_str = ""
for p in range(8):
pos = start_data + bit_len*p
p1, p2 = A[pos: pos + bit_len/2], A[pos + bit_len/2: pos + bit_len]
avg1, avg2 = np.average(p1), np.average(p2)
if avg1 < avg2:
bits_str += "0"
elif avg1 > avg2:
bits_str += "1"
df = int(bits_str[0:5], 2)
# Aircraft address (db - https://junzis.com/adb/?q=3b1c5c )
bits_str = ""
for p in range(8, 32):
pos = start_data + bit_len * p
p1, p2 = A[pos: pos + bit_len / 2], A[pos + bit_len / 2: pos + bit_len]
avg1, avg2 = np.average(p1), np.average(p2)
if avg1 < avg2:
bits_str += "0"
elif avg1 > avg2:
bits_str += "1"
# print "Aircraft address:", bits_str, hex(int(bits_str, 2))
address = hex(int(bits_str, 2))
# Filter specific aircraft (optional)
# if address != "0x3c5ee2":
#    return
if df == 16 or df == 17 or df == 18 or df == 19 or df == 20 or df == 21:
# print "Pos:", start, "DF:", msg_type
# Data (56bit)
bits_str = ""
for p in range(32, 88):
pos = start_data + bit_len*p
p1, p2 = A[pos: pos + bit_len/2], A[pos + bit_len/2: pos + bit_len]
avg1, avg2 = np.average(p1), np.average(p2)
if avg1 < avg2:
bits_str += "0"
# bits[pos + bit_len / 2] = 50
elif avg1 > avg2:
bits_str += "1"
# http://www.lll.lu/~edward/edward/adsb/DecodingADSBposition.html
# print "Data:"
# print bits_str[:8], bits_str[8:20],  bits_str[20:22], bits_str[22:22+17], bits_str[39:39+17]
# Type Code:
tc, ec = int(bits_str[:5], 2), int(bits_str[5:8], 2)
# print("DF:", df, "TC:", tc)
# 1 - 4  Aircraft identification
# 5 - 8  Surface position
# 9 - 18  Airborne position (w/ Baro Altitude)
# 19  Airborne velocities
if tc >= 1 and tc <= 4: # and (df == 17 or df == 18):
print("Aircraft address:", address)
print("Data:")
print(bits_str[:8], bits_str[8:14],  bits_str[14:20], bits_str[20:26], bits_str[26:32], bits_str[32:38], bits_str[38:44])
symbols = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789######"
code_str = ""
for p in range(8):
c = int(bits_str[8 + 6*p:8 + 6*(p + 1)], 2)
code_str += symbols[c]
print("Aircraft Identification:", code_str.replace('#', ''))
print()
if tc == 11:
print("Aircraft address:", address)
print("Data: (11)")
print(bits_str[:8], bits_str[8:20],  bits_str[20:22], bits_str[22:22+17], bits_str[39:39+17])
# Bit 22 contains the F flag which indicates which CPR format is used (odd or even)
# First frame has F flag = 0 so is even and the second frame has F flag = 1 so odd
# f = bits_str[21:22]
# print("F:", int(f, 2))
# Altitude
alt1b = bits_str[8:20]
if alt1b[-5] == '1':
bits = alt1b[:-5] + alt1b[-4:]
n = int(bits, 2)
alt_ft = n*25 - 1000
print("Alt (ft)", alt_ft)
# lat_dec = int(bits_str[22:22+17], 2)
# lon_dec = int(bits_str[39:39+17], 2)
# print("Lat/Lon:", lat_dec, lon_dec)
# http://airmetar.main.jp/radio/ADS-B%20Decoding%20Guide.pdf
print()
if tc == 19:
print("Aircraft address:", address)
print("Data:")
# print(bits_str)
print(bits_str[:5], bits_str[5:8], bits_str[8:10], bits_str[10:13], bits_str[13] ,bits_str[14:24], bits_str[24], bits_str[25:35], bits_str[35:36], bits_str[36:65])
subtype = int(bits_str[5:8], 2)
# https://mode-s.org/decode/adsb/airborne-velocity.html
spd, hdg, rocd = -1, -1, -1
if subtype == 1 or subtype == 2:
print("Velocity Subtype 1: Ground speed")
v_ew_sign = int(bits_str[13], 2)
v_ew = int(bits_str[14:24], 2) - 1       # east-west velocity
v_ns_sign = int(bits_str[24], 2)
v_ns = int(bits_str[25:35], 2) - 1       # north-south velocity
v_we = -1*v_ew if v_ew_sign else v_ew
v_sn = -1*v_ns if v_ns_sign else v_ns
spd = math.sqrt(v_sn*v_sn + v_we*v_we)  # unit in kts
hdg = math.atan2(v_we, v_sn)
hdg = math.degrees(hdg)                 # convert to degrees
hdg = hdg if hdg >= 0 else hdg + 360    # no negative val
if subtype == 3:
print("Subtype Subtype 3: Airspeed")
hdg = int(bits_str[14:24], 2)/1024.0*360.0
spd = int(bits_str[25:35], 2)
vr_sign = int(bits_str[36], 2)
vr = int(bits_str[36:45], 2)
rocd = -1*vr if vr_sign else vr         # rate of climb/descend
print("Speed (kts):", spd, "Rate:", rocd, "Heading:", hdg)
print()
# print()
def calc_coordinates():
def _cprN(lat, is_odd):
nl = _cprNL(lat) - is_odd
return nl if nl > 1 else 1
def _cprNL(lat):
try:
nz = 15
a = 1 - math.cos(math.pi / (2 * nz))
b = math.cos(math.pi / 180.0 * abs(lat)) ** 2
nl = 2 * math.pi / (math.acos(1 - a/b))
return int(math.floor(nl))
except:
# happens when latitude is +/-90 degree
return 1
def floor_(x):
return int(math.floor(x))
lat1b, lon1b, alt1b = "10111000111010011", "10000110111111000", "000101111001"
lat2b, lon2b, alt2b = "10010011101011100", "10000011000011011", "000101110111"
lat1, lon1, alt1 = int(lat1b, 2), int(lon1b, 2), int(alt1b, 2)
lat2, lon2, alt2 = int(lat2b, 2), int(lon2b, 2), int(alt2b, 2)
# 131072 is 2^17, since CPR lat and lon are 17 bits each
cprlat_even, cprlon_even = lat1/131072.0, lon1/131072.0
cprlat_odd, cprlon_odd = lat2/131072.0, lon2/131072.0
print(cprlat_even, cprlon_even)
j = floor_(59*cprlat_even - 60*cprlat_odd)
print(j)
air_d_lat_even = 360.0 / 60
air_d_lat_odd = 360.0 / 59
# Lat
lat_even = float(air_d_lat_even * (j % 60 + cprlat_even))
lat_odd = float(air_d_lat_odd * (j % 59 + cprlat_odd))
if lat_even >= 270:
lat_even = lat_even - 360
if lat_odd >= 270:
lat_odd = lat_odd - 360
# Lon
ni = _cprN(lat_even, 0)
m = floor_(cprlon_even * (_cprNL(lat_even)-1) - cprlon_odd * _cprNL(lat_even) + 0.5)
lon = (360.0 / ni) * (m % ni + cprlon_even)
print("Lat", lat_even, "Lon", lon)
# Altitude
# Q-bit (bit 48) indicates whether the altitude is encoded in multiples of 25 or 100 ft (0: 100 ft, 1: 25 ft)
# The value can represent altitudes from -1000 to +50175 ft.
if alt1b[-5] == '1':
bits = alt1b[:-5] + alt1b[-4:]
n = int(bits, 2)
alt_ft = n*25 - 1000
print("Alt (ft)", alt_ft)
fs, data = wavfile.read("adsb_20190311_191728Z_1090000kHz_RF.wav")
T = 1/fs
print("Sample rate %f MS/s" % (fs / 1e6))
print("Cnt samples %d" % len(data))
print("Duration: %f s" % (T * len(data)))
data = data.astype(float)
cnt = data.shape[0]
# Processing only part on file (faster):
# cnt = 10000000
# data = data[:cnt]
print("Processing I/Q...")
I, Q = data[:, 0], data[:, 1]
A = np.sqrt(I*I + Q*Q)
bits = np.zeros(cnt)
# To see scope without any processing, uncomment
# plt.plot(A)
# plt.show()
# sys.exit(0)
print("Extracting signals...")
pos = 0
avg = 200
msg_start = 0
# Find beginning of each signal
while pos < cnt - 16*1024:
# P1 - message start
while pos < cnt - 16*1024:
if A[pos] < avg and A[pos+1] > avg and pos - msg_start > 1000:
msg_start = pos
bits[pos] = 100
pos += 4
break
pos += 1
start1, start2, start3, start4 = msg_start, 0, 0, 0
# P2
while pos < cnt - 16*1024:
if A[pos] < avg and A[pos+1] > avg:
start2 = pos
bits[pos] = 90
pos += 1
break
pos += 1
# P3
while pos < cnt - 16*1024:
if A[pos] < avg and A[pos+1] > avg:
start3 = pos
bits[pos] = 80
pos += 1
break
pos += 1
# P4
while pos < cnt - 16*1024:
if A[pos] < avg and A[pos+1] > avg:
start4 = pos
bits[pos] = 70
pos += 1
break
pos += 1
sig_diff = start4 - start1
if 20 < sig_diff < 25:
bits[msg_start] = 500
bit_len = int((start4 - start1) / 4.5)
# print(pos, start1, start4, ' - ', bit_len)
# start = start1 + 8*bit_len
parse_message(A, msg_start, bit_len)
pos += 450
# For debugging: check signal start
# plt.plot(A)
# plt.plot(bits)
# plt.show()

Π‘Π΅ Π½Π°Π΄Π΅Π²Π°ΠΌ Π΄Π΅ΠΊΠ° нСкој бСшС заинтСрСсиран, Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π°ΠΌ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅Ρ‚ΠΎ.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€