Flightradar24 - ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜? ื˜ื™ื™ืœ 2, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ

ื”ืขืœื ื”ืื‘ืจ. ืžื™ืกื˜ืึธืžืข ืึทืœืขืžืขืŸ ื•ื•ืืก ืœืคึผื—ื•ืช ืึทืžืึธืœ ื‘ืื’ืขื’ื ื˜ ืึธื“ืขืจ ื’ืขื–ืขืŸ ืึทื•ื•ืขืง ืงืจื•ื‘ื™ื ืึธื“ืขืจ ืคืจืขื ื“ื– ืื•ื™ืฃ ืึท ืคืœืึทืš ื’ืขื•ื•ื™ื™ื ื˜ ื“ื™ ืคืจื™ื™ Flightradar24 ื“ื™ื ืกื˜. ื“ืึธืก ืื™ื– ืึท ื–ื™ื™ืขืจ ื‘ืึทืงื•ื•ืขื ื•ื•ืขื’ ืฆื• ืฉืคึผื•ืจ ื“ื™ ืฉื˜ืขืœืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืขืจืงืจืึทืคื˜ ืื™ืŸ ืคืึทืงื˜ื™ืฉ ืฆื™ื™ื˜.

Flightradar24 - ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜? ื˜ื™ื™ืœ 2, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ

ะ’ ื“ืขืจ ืขืจืฉื˜ืขืจ ื˜ื™ื™ืœ ื“ืขืจ ืคึผืจื™ื ืฆื™ืคึผ ืคื•ืŸ ืึธืคึผืขืจืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹ืึทื–ืึท ืึทืŸ ืึธื ืœื™ื™ืŸ ื“ื™ื ืกื˜ ืื™ื– ื“ื™ืกืงืจื™ื™ื‘ื“. ืื™ืฆื˜ ืžื™ืจ ื•ื•ืขืœืŸ ื’ื™ื™ืŸ ื•ื•ื™ื™ึทื˜ืขืจ ืื•ืŸ ื’ืขืคึฟื™ื ืขืŸ ืื•ื™ืก ื•ื•ืึธืก ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ื˜ืจืึทื ืกืžื™ื˜ื˜ืขื“ ืื•ืŸ ื‘ืืงื•ืžืขืŸ ืคื•ืŸ ื“ื™ ืขืจืงืจืึทืคื˜ ืฆื• ื“ื™ ืจื™ืกื™ื•ื•ื™ื ื’ ืกื˜ืึทื ืฆื™ืข, ืื•ืŸ ื“ืขืงืึธื“ืข ืขืก ื–ื™ืš ืžื™ื˜ ืคึผื™ื˜ื”ืึธืŸ.

ื’ืขืฉื™ื›ื˜ืข

ืงืœืืจ, ืขืจืงืจืึทืคื˜ ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืฉืขืจื“ ืคึฟืึทืจ ื™ื•ื–ืขืจื– ืฆื• ื–ืขืŸ ืื•ื™ืฃ ื–ื™ื™ืขืจ ืกืžืึทืจื˜ืคืึธื ืขืก. ื“ื™ ืกื™ืกื˜ืขื ื•ื•ืขืจื˜ ืื ื’ืขืจื•ืคืŸ ADS-B (ืื•ื™ื˜ืืžืื˜ื™ืฉืข ืืคื”ืขื ื’ื™ื’ืข ืกืขืจื•ื•ื™ื™ืœืึทื ืก โ€” ื‘ืจืึธื“ืงืึทืกื˜), ืื•ืŸ ื•ื•ืขืจื˜ ื’ืขื ื•ืฆื˜ ืฆื• ืื•ื™ื˜ืืžืื˜ื™ืฉ ืื™ื‘ืขืจืฉื™ืงืŸ ืื™ื ืคืืจืžืืฆื™ืข ืื™ื‘ืขืจ ื“ื™ ืขืจืืคืœืืŸ ืฆื•ื ืงืื ื˜ืจืืœ ืฆืขื ื˜ืขืจ - ืื™ืจ ืื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจ, ืงืืืจื“ื™ื ืึทื˜ืขืก, ืจื™ื›ื˜ื•ื ื’, ื’ื™ื›ืงื™ื™ึทื˜, ื”ื™ื™ืš ืื•ืŸ ืื ื“ืขืจืข ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ื˜ืจืึทื ืกืžื™ื˜ื˜ืขื“. ื‘ื™ื– ืึทื”ืขืจ, ืื™ื™ื“ืขืจ ื“ื™ ืึทื“ื•ื•ืขื ื˜ ืคื•ืŸ ืึทื–ืึท ืกื™ืกื˜ืขืžืขืŸ, ื“ื™ ื“ื™ืกืคึผืึทื˜ืฉืขืจ ืงืขืŸ ื ืึธืจ ื–ืขืŸ ืึท ืคึผื•ื ืงื˜ ืื•ื™ืฃ ื“ื™ ืจืึทื“ืึทืจ. ื“ืืก ืื™ื– ื ื™ืฉื˜ ื’ืขื•ื•ืขืŸ ื’ืขื ื•ื’ ื•ื•ืขืŸ ืขืก ื–ืขื ืขืŸ ื’ืขื•ื•ืขืŸ ืฆื•ืคื™ืœ ืขืจืืคืœืื ืขืŸ.

ื˜ืขืงื ื™ืงืœื™, ADS-B ื‘ืืฉื˜ื™ื™ื˜ ืคื•ืŸ ืึท ืขืจืงืจืึทืคื˜ ื˜ืจืึทื ืกืžื™ื˜ืขืจ ื•ื•ืึธืก ืคึผื™ืจื™ืึทื“ื™ืงืœื™ ืกืขื ื“ื– ืคึผืึทืงื™ืฅ ืžื™ื˜ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื™ืŸ ืึท ืคืขืจืœื™ ื”ื•ื™ืš ืึธืคื˜ืงื™ื™ึทื˜ ืคื•ืŸ 1090 ืžื”ื– (ืขืก ื–ืขื ืขืŸ ืื ื“ืขืจืข ืžืึธื“ืขืก, ืึธื‘ืขืจ ื–ื™ื™ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืึทื–ื•ื™ ื˜ืฉื™ืงืึทื•ื•ืข ืคึฟืึทืจ ืื•ื ื“ื–, ื•ื•ื™ื™ึทืœ ื“ื™ ืงืึธื•ืึธืจื“ืึทื ืึทืฅ ื–ืขื ืขืŸ ื˜ืจืึทื ืกืžื™ื˜ื˜ืขื“ ื‘ืœื•ื™ื– ื“ืึธ). ืคื•ืŸ ืงื•ืจืก, ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ื“ื™ ื˜ืจืึทื ืกืžื™ื˜ืขืจ, ืขืก ืื™ื– ืื•ื™ืš ืึท ื•ืคื ืขืžืขืจ ืขืจื’ืขืฅ ืื™ืŸ ื“ื™ ืึทืขืจืึธืคึผืึธืจื˜, ืึธื‘ืขืจ ืคึฟืึทืจ ืื•ื ื“ื–, ื•ื•ื™ ื ื™ืฆืขืจืก, ืื•ื ื“ื–ืขืจ ืื™ื™ื’ืขื ืข ื•ืคื ืขืžืขืจ ืื™ื– ืคื•ืŸ ืื™ื ื˜ืขืจืขืก.

ื“ื•ืจืš ื“ืขื ื•ื•ืขื’, ืคึฟืึทืจ ืคืึทืจื’ืœื™ื™ึทืš, ื“ืขืจ ืขืจืฉื˜ืขืจ ืึทื–ืึท ืกื™ืกื˜ืขื, ืึทื™ืจื ืึทื•ื• ืจืึทื“ืึทืจื‘ืึธืงืก, ื“ื™ื–ื™ื™ื ื“ ืคึฟืึทืจ ืคึผืจืึธืกื˜ ื ื™ืฆืขืจืก, ืืจื•ื™ืก ืื™ืŸ 2007 ืื•ืŸ ืงืึธืกื˜ืŸ ื•ื•ืขื’ืŸ $ 900, ืื•ืŸ ืึท ืึทื‘ืึธื ืขืžืขื ื˜ ืฆื• ื ืขืฅ ื‘ืึทื“ื™ื ื•ื ื’ืก ืงืึธืก ื•ื•ืขื’ืŸ $ 250 ืคึผืขืจ ื™ืึธืจ.

Flightradar24 - ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜? ื˜ื™ื™ืœ 2, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ

ืชื’ื•ื‘ื•ืช ืคื•ืŸ ื“ื™ ืขืจืฉื˜ืข ืจื•ืกื™ืฉ ืึธื•ื ืขืจื– ืงืขื ืขืŸ ื–ื™ื™ืŸ ืœื™ื™ืขื ืขืŸ ืื•ื™ืฃ ื“ืขื ืคืึธืจื•ื ืจืึทื“ื™ืึธืกืงืึทื ืขืจ. ืื™ืฆื˜ ืึทื– RTL-SDR ืจื™ืกื™ื•ื•ืขืจื– ื”ืึธื‘ืŸ ื•ื•ืขืจืŸ ืžืึทืกื™ื•ื•ืœื™ ื‘ื ื™ืžืฆื, ืึท ืขื ืœืขืš ืžื™ื˜ืœ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืคืืจื–ืืžืœื˜ ืคึฟืึทืจ $ 30, ืžืขืจ ื•ื•ืขื’ืŸ ื“ืขื ืื™ื– ื’ืขื•ื•ืขืŸ ืื™ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ื˜ื™ื™ืœ. ืžื™ืจ ื•ื•ืขืœืŸ ื’ื™ื™ืŸ ืฆื• ื“ื™ ืคึผืจืึธื˜ืึธืงืึธืœ ื–ื™ืš - ืœืึธืžื™ืจ ื–ืขืŸ ื•ื•ื™ ืขืก ืึทืจื‘ืขื˜.

ืกื™ื’ื ืึทืœ ืึธืคึผื˜ืจืึธื’

ืขืจืฉื˜ืขืจ, ื“ืขืจ ืกื™ื’ื ืึทืœ ืžื•ื–ืŸ ื–ื™ื™ืŸ ืจืขืงืึธืจื“ืขื“. ื“ืขืจ ื’ืื ืฆืขืจ ืกื™ื’ื ืึทืœ ื”ืื˜ ืึท ื’ืขื“ื•ื™ืขืจ ืคื•ืŸ ื‘ืœื•ื™ื– 120 ืžื™ืงืจืึธืกืขืงืึธื ื“ืก, ืึทื–ื•ื™ ืฆื• ืงืึทืžืคืขืจื˜ืึทื‘ืœื™ ื“ื™ืกืึทืกืขืžื‘ืึทืœ ื–ื™ื™ึทืŸ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ, ืึท SDR ื•ืคื ืขืžืขืจ ืžื™ื˜ ืึท ืžื•ืกื˜ืขืจื•ื ื’ ืงื•ืจืก ืคื•ืŸ ื‘ื™ื™ึท ืžื™ื ื“ืกื˜ืขืจ 5 ืžื”ื– ืื™ื– ื“ื™ื–ื™ื™ืจืึทื‘ืึทืœ.

Flightradar24 - ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜? ื˜ื™ื™ืœ 2, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ

ื ืึธืš ืจืขืงืึธืจื“ื™ื ื’, ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ืึท ื•ื•ืึทื•ื• ื˜ืขืงืข ืžื™ื˜ ืึท ืžื•ืกื˜ืขืจื•ื ื’ ืงื•ืจืก ืคื•ืŸ 5000000 ืกืึทืžืคึผืึทืœื– / ืกืขืง, 30 ืกืขืงื•ื ื“ืขืก ืคื•ืŸ ืึทื–ืึท ืึท ืจืขืงืึธืจื“ื™ื ื’ "ื•ื•ืขื’ืŸ" ื•ื•ืขื’ืŸ 500 ืžื‘. ืคื•ืŸ ืงื•ืจืก, ืขืก ืื™ื– ืึทืจื•ื™ืกื’ืขื•ื•ืึธืจืคืŸ ืฆื• ื”ืขืจืŸ ืฆื• ืขืก ืžื™ื˜ ืึท ืžืขื“ื™ืข ืฉืคึผื™ืœืขืจ - ื“ื™ ื˜ืขืงืข ื›ึผื•ืœืœ ืงื™ื™ืŸ ื’ืขื–ื•ื ื˜, ืึธื‘ืขืจ ืึท ื’ืœื™ื™ึทืš ื“ื™ื“ื–ืฉืึทื˜ื™ื™ื–ื“ ืจืึทื“ื™ืึธ ืกื™ื’ื ืึทืœ - ื“ืึธืก ืื™ื– ื•ื•ื™ ื•ื•ื™ื™ื›ื•ื•ืืจื’ 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, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ

ื™ืขื“ืขืจ "ื™ืžืคึผืึทืœืก" ืื™ื– ืึท ืกื™ื’ื ืึทืœ, ื“ื™ ืกื˜ืจื•ืงื˜ื•ืจ ืคื•ืŸ ื•ื•ืึธืก ืื™ื– ืงืœืืจ ืงืขื ื˜ื™ืง ืื•ื™ื‘ ืื™ืจ ืคืึทืจื’ืจืขืกืขืจืŸ ื“ื™ ื”ืึทื›ืœืึธื˜ืข ืื•ื™ืฃ ื“ื™ ื’ืจืึทืคื™ืง.

Flightradar24 - ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜? ื˜ื™ื™ืœ 2, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ

ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ื–ืขืŸ, ื“ื™ ื‘ื™ืœื“ ืื™ื– ื’ืึทื ืฅ ืงืึธื ืกื™ืกื˜ืขื ื˜ ืžื™ื˜ ื•ื•ืึธืก ืื™ื– ื’ืขื’ืขื‘ืŸ ืื™ืŸ ื“ื™ ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืื•ื™ื‘ืŸ. ืื™ืจ ืงืขื ืขืŸ ืึธื ื”ื™ื™ื‘ืŸ ืคึผืจืึทืกืขืกื™ื ื’ ื“ื™ ื“ืึทื˜ืŸ.

ื“ื™ืงืึธื•ื“ื™ื ื’

ืขืจืฉื˜ืขืจ, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื‘ืึทืงื•ืžืขืŸ ืึท ื‘ื™ืกืœ ื˜ื™ื™ึทืš. ื“ืขืจ ืกื™ื’ื ืึทืœ ื–ื™ืš ืื™ื– ืงืึธื“ืขื“ ืžื™ื˜ ืžืึทื ื˜ืฉืขืกื˜ืขืจ ืงืึธื“ื™ืจื•ื ื’:

Flightradar24 - ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜? ื˜ื™ื™ืœ 2, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ

ืขืก ืื™ื– ื’ืจื™ื ื’ ืฆื• ื‘ืึทืงื•ืžืขืŸ ืคืึทืงื˜ื™ืฉ "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, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ

ื–ืืœ ืก ืงื•ืง ืื™ืŸ ื“ื™ ืคืขืœื“ืขืจ ืื™ืŸ ืžืขืจ ื“ืขื˜ืึทืœ.

DF (ื“ืึทื•ื ืœื™ื ืง ืคึฟืึธืจืžืึทื˜, 5 ื‘ื™ื˜ืŸ) - ื“ื™ืคื™ื™ื ื– ื“ื™ ืึธื ื–ืึธื’ ื˜ื™ืคึผ. ืขืก ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ื˜ื™ื™ืคึผืก:

Flightradar24 - ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜? ื˜ื™ื™ืœ 2, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ
(ื˜ื™ืฉ ืžืงื•ืจ)

ืžื™ืจ ื–ืขื ืขืŸ ื‘ืœื•ื™ื– ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ื“ื™ DF17 ื˜ื™ืคึผ, ื•ื•ื™ื™ึทืœ ืขืก ื›ึผื•ืœืœ ื“ื™ ืงืึธื•ืึธืจื“ืึทื ืึทืฅ ืคื•ืŸ ื“ื™ ืขืจืงืจืึทืคื˜.

ื™ืงืึทืึธ (24 ื‘ื™ืฅ) - ื“ื™ ืื™ื ื˜ืขืจื ืึทืฆื™ืึธื ืึทืœืข ื™ื™ื ืฆื™ืง ืงืึธื“ ืคื•ืŸ ื“ื™ ืขืจืงืจืึทืคื˜. ืื™ืจ ืงืขื ืขืŸ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืขืจืงืจืึทืคื˜ ื“ื•ืจืš ื–ื™ื™ึทืŸ ืงืึธื“ ืึธื ืœื™ื™ืŸ (ืฆื•ื ื‘ืึทื“ื•ื™ืขืจืŸ ื”ืึธื˜ ื“ืขืจ ืžื—ื‘ืจ ืื•ื™ืคื’ืขื”ืขืจื˜ ืฆื• ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก, ืึธื‘ืขืจ ืขืก ืื™ื– ื ืึธืš ื‘ืึทื˜ื™ื™ึทื˜ื™ืง). ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืคึฟืึทืจ ื“ื™ ืงืึธื“ 3c5ee2 ืžื™ืจ ื”ืึธื‘ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข:

Flightradar24 - ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜? ื˜ื™ื™ืœ 2, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ

ืจืขื“ืึทื’ื™ืจืŸ: ืื™ืŸ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ ืื•ื™ืฃ ื“ืขื ืึทืจื˜ื™ืงืœ ื“ื™ ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคื•ืŸ ื“ื™ ICAO ืงืึธื“ ืื™ื– ื’ืขื’ืขื‘ืŸ ืื™ืŸ ืžืขืจ ื“ืขื˜ืึทืœ, ืื™ืš ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืึทื– ื™ืขื ืข ื•ื•ืืก ื–ืขื ืขืŸ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืœื™ื™ืขื ืขืŸ ืขืก.

ื“ืึทื˜ืข (56 ืึธื“ืขืจ 112 ื‘ื™ืฅ) - ื“ื™ ืคืึทืงื˜ื™ืฉ ื“ืึทื˜ืŸ ื•ื•ืึธืก ืžื™ืจ ื•ื•ืขืœืŸ ื“ืขืงืึธื“ืข. ื“ืขืจ ืขืจืฉื˜ืขืจ 5 ื‘ื™ื˜ืŸ ืคื•ืŸ ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ื“ื™ ืคืขืœื“ ื˜ื™ืคึผ ืงืึธื“ื ืžื™ื˜ ื“ื™ ืกื•ื‘ื˜ื™ืคึผืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืกื˜ืึธืจื“ ื“ืึทื˜ืŸ (ื ื™ื˜ ืฆื• ื–ื™ื™ืŸ ืฆืขืžื™ืฉื˜ ืžื™ื˜ DF). ืขืก ื–ืขื ืขืŸ ืึท ื‘ื™ืกืœ ืคื•ืŸ ื“ื™ ื˜ื™ื™ืคึผืก:

Flightradar24 - ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜? ื˜ื™ื™ืœ 2, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ
(ื˜ื™ืฉ ืžืงื•ืจ)

ื–ืืœ ืก ืงื•ืง ื‘ื™ื™ึท ืขื˜ืœืขื›ืข ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ืคึผืึทืงืึทื“ื–ืฉืึทื–.

ืขืจืงืจืึทืคื˜ ืœืขื’ื™ื˜ื™ืžืึทืฆื™ืข

ื‘ื™ื™ื ืขืจื™ ื‘ื™ื™ืฉืคึผื™ืœ:

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######

ื ืึธืš ื“ื™ืงืึธื•ื“ืึทื“ ื“ื™ ืฉื˜ืจื™ืงืœ, ืขืก ืื™ื– ื’ืจื™ื ื’ ืฆื• ื‘ืึทืงื•ืžืขืŸ ื“ื™ ืขืจืงืจืึทืคื˜ ืงืึธื“: 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('#', ''))

ืขืจื‘ืึธืจืŸ ืฉื˜ืขืœืข

ืื•ื™ื‘ ืึทืœืฅ ืื™ื– ืคึผืฉื•ื˜ ืžื™ื˜ ื“ื™ ื ืึธืžืขืŸ, ืžื™ื˜ ื“ื™ ืงืึธื•ืึธืจื“ืึทื ืึทืฅ ืขืก ืื™ื– ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜. ื–ื™ื™ ื–ืขื ืขืŸ ื˜ืจืึทื ืกืžื™ื˜ื˜ืขื“ ื•ื•ื™ 2x, ืžืึธื“ื ืข ืื•ืŸ ืืคื™ืœื• ืจืึธืžืขืŸ. ืคืขืœื“ ืงืึธื“ ื˜ืง = 01011ื‘ = 11.

Flightradar24 - ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜? ื˜ื™ื™ืœ 2, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ

ื ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืืคื™ืœื• ืื•ืŸ ืžืึธื“ื ืข ืคึผืึทืงื™ืฅ:

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

ื“ืขืจ ื›ืขื–ืฉื‘ืŸ ืคื•ืŸ ื“ื™ ืงืึธื•ืึธืจื“ืึทื ืึทืฅ ื–ื™ืš ื ืขืžื˜ ืึธืจื˜ ืœื•ื™ื˜ ืึท ื’ืึทื ืฅ ื˜ืจื™ืงื™ ืคืึธืจืžื•ืœืข:

Flightradar24 - ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜? ื˜ื™ื™ืœ 2, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ
(ืžืึธืงืขืจ)

ืื™ืš ื‘ื™ืŸ ื ื™ืฉื˜ ืึท GIS ืžื•ืžื›ืข, ืึทื–ื•ื™ ืื™ืš ื˜ืึธืŸ ื ื™ื˜ ื•ื•ื™ืกืŸ ื•ื•ื• ืขืก ืงื•ืžื˜ ืคื•ืŸ. ื•ื•ืขืจ ื•ื•ื™ื™ืกื˜, ืฉืจื™ื™ื‘ ืื™ืŸ ื“ื™ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ.

ื”ื™ื™ืš ืื™ื– ื’ืขืจืขื›ื ื˜ ื•ื•ื™ ืกื™ืžืคึผืœืขืจ - ื“ื™ืคึผืขื ื“ื™ื ื’ ืื•ื™ืฃ ื“ื™ ืกืคึผืขืฆื™ืคื™ืฉ ื‘ื™ืกืœ, ืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจืขืคึผืจื™ื–ืขื ื˜ื™ื“ ื•ื•ื™ ืึท ืงื™ื™ืคืœ ืคื•ืŸ 25 ืึธื“ืขืจ 100 ืคึฟื™ืก.

ืึทื™ืจื‘ืึธืจื ืข ื•ื•ืขืœืึธืกื™ื˜ื™

ืคึผืึทืงืึทื˜ ืžื™ื˜ TC = 19. ื“ื™ ื˜ืฉื™ืงืึทื•ื•ืข ื–ืึทืš ื“ืึธ ืื™ื– ืึทื– ื“ื™ ื’ื™ื›ืงื™ื™ึทื˜ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื‘ื™ื™ื“ืข ืคึผื™ื ื˜ืœืขืš, ืจืขืœืึทื˜ื™ื•ื• ืฆื• ื“ืขืจ ืขืจื“ (ื’ืจืึธื•ื ื“ ืกืคึผื™ื“), ืื•ืŸ ืœื•ืคื˜, ื’ืขืžืืกื˜ืŸ ื“ื•ืจืš ื“ื™ ืขืจืงืจืึทืคื˜ ืกืขื ืกืขืจ (ืึทื™ืจืกืคึผืขื“). ืคื™ืœืข ืคืึทืจืฉื™ื“ืขื ืข ืคืขืœื“ืขืจ ื–ืขื ืขืŸ ืื•ื™ืš ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ:

Flightradar24 - ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜? ื˜ื™ื™ืœ 2, ืึทื“ืก-ื‘ ืคึผืจืึธื˜ืึธืงืึธืœ
(ืžืึธืงืขืจ)

ืกืึธืฃ

ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ื–ืขืŸ, ืึทื“ืก-ื‘ ื˜ืขื›ื ืึธืœืึธื’ื™ืข ืื™ื– ื’ืขื•ื•ืืจืŸ ืึท ื˜ืฉื™ืงืึทื•ื•ืข ืกื™ืžื‘ื™ื™ืึธื•ืกืึทืก, ื•ื•ืขืŸ ืึท ื ืึธืจืžืึทืœ ืื™ื– ื ื•ืฆื™ืง ื ื™ื˜ ื‘ืœื•ื™ื– ืคึฟืึทืจ ืคึผืจืึธืคืขืกืกื™ืึธื ืึทืœืก, ืึธื‘ืขืจ ืื•ื™ืš ืคึฟืึทืจ ืคึผืจืึธืกื˜ ื ื™ืฆืขืจืก. ืื‘ืขืจ ืคื•ืŸ ืงื•ืจืก, ื“ื™ ืฉืœื™ืกืœ ืจืึธืœืข ืื™ืŸ ื“ืขื ืื™ื– ื’ืขื•ื•ืขืŸ ืคึผืœื™ื™ึทืขื“ ื“ื•ืจืš ื“ื™ ื˜ืฉื™ืคึผืขืจ ื˜ืขื›ื ืึธืœืึธื’ื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ื’ื™ื˜ืึทืœ SDR ืจืึทืกื™ื•ื•ืขืจื–, ื•ื•ืึธืก ืึทืœืึทื•ื– ื“ื™ ืžื™ื˜ืœ ืฆื• ืžืžืฉ "ืคึฟืึทืจ ืึท ืคึผืขื ื™" ื‘ืึทืงื•ืžืขืŸ ืกื™ื’ื ืึทืœื– ืžื™ื˜ ืึท ืึธืคื˜ืงื™ื™ึทื˜ ื”ืขื›ืขืจ ืึท ื’ื™ื’ืึทื”ืขืจืฅ.

ืื™ืŸ ื“ืขืจ ื ืึธืจืžืึทืœ ื–ื™ืš, ืคื•ืŸ ืงื•ืจืก, ืคื™ืœ ืžืขืจ. ื“ื™ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืงืขื ืขืŸ ื–ืขืŸ ื“ื™ PDF ืื•ื™ืฃ ื“ืขื ื‘ืœืึทื˜ ื™ืงืึทืึธ ืึธื“ืขืจ ื‘ืึทื–ื•ื›ืŸ ืฉื•ื™ืŸ ื“ืขืจืžืื ื˜ ืื•ื™ื‘ืŸ ื•ื•ืขื‘ื–ื™ื™ึทื˜ืœ.

ืขืก ืื™ื– ืึทื ืœื™ื™ืงืœื™ ืึทื– ืึทืœืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ืื•ื™ื‘ืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื ื•ืฆื™ืง ืคึฟืึทืจ ืคื™ืœืข, ืึธื‘ืขืจ ืื™ืŸ ืžื™ื ื“ืกื˜ืขืจ ื“ืขืจ ื’ืขื ืขืจืึทืœ ื’ืขื“ืึทื ืง ืคื•ืŸ ื•ื•ื™ ืขืก ืึทืจื‘ืขื˜, ืื™ืš ื”ืึธืคึฟืŸ, ื‘ืœื™ื™ื‘ื˜.

ื“ื•ืจืš ื“ืขื ื•ื•ืขื’, ืึท ืคืึทืจื˜ื™ืง ืคึผื™ื˜ื”ืึธืŸ ื“ื™ืงืึธื•ื“ืขืจ ืื™ื– ืฉื•ื™ืŸ ื™ื’ื–ื™ืกืฅ, ืื™ืจ ืงืขื ืขืŸ ืœืขืจื ืขืŸ ืขืก ื“ืึธ. ืื•ืŸ ืึธื•ื ืขืจื– ืคื•ืŸ SDR ืจื™ืกื™ื•ื•ืขืจื– ืงืขื ืขืŸ ืึทืกืขืžื‘ืึทืœ ืื•ืŸ ืœื•ื™ืคืŸ ืึท ืคืึทืจื˜ื™ืง ืึทื“ืก-ื‘ ื“ื™ืงืึธื•ื“ืขืจ ืคื•ืŸ ื“ื™ ื‘ืœืึทื˜, ื“ืึธืก ืื™ื– ื“ื™ืกืงืึทืกื˜ ืื™ืŸ ืžืขืจ ื“ืขื˜ืึทืœ ืื™ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ื˜ื™ื™ืœ.

ื“ืขืจ ืžืงื•ืจ ืงืึธื“ ืคื•ืŸ ื“ื™ ืคึผืึทืจืกืขืจ ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืื™ื– ื’ืขื’ืขื‘ืŸ ืื•ื ื˜ืขืจ ื“ื™ ืฉื ื™ื™ึทื“ืŸ. ื“ืึธืก ืื™ื– ืึท ืคึผืจืึธื‘ืข ื‘ื™ื™ืฉืคึผื™ืœ ื•ื•ืึธืก ื˜ื•ื˜ ื ื™ืฉื˜ ืคืึทืจื”ื™ื˜ืŸ ืฆื• ื–ื™ื™ืŸ ืคึผืจืึธื“ื•ืงืฆื™ืข, ืึธื‘ืขืจ ืขืคึผืขืก ืึทืจื‘ืขื˜ ืื™ืŸ ืขืก, ืื•ืŸ ื–ื™ื™ ืงืขื ืขืŸ ืคึผืึทืจืก ื“ื™ ื˜ืขืงืข ืจืขืงืึธืจื“ืขื“ ืื•ื™ื‘ืŸ.
ืžืงื•ืจ ืงืึธื“ (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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’