Flightradar24 - เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”? เบชเปˆเบงเบ™เบ—เบต 2, เป‚เบ›เบฃเป‚เบ•เบ„เป ADS-B

เบชเบฐเบšเบฒเบเบ”เบต Habr. เบญเบฒเบ”โ€‹เบˆเบฐโ€‹เป€เบ›เบฑเบ™โ€‹เบ—เบธเบโ€‹เบ„เบปเบ™โ€‹เบ—เบตเปˆโ€‹เป€เบ„เบตเบโ€‹เป„เบ”เป‰โ€‹เบžเบปเบšโ€‹เป€เบซเบฑเบ™โ€‹เบซเบผเบทโ€‹เบเบฒเบ”โ€‹เบžเบตเปˆโ€‹เบ™เป‰เบญเบ‡โ€‹เบซเบผเบทโ€‹เบซเบกเบนเปˆโ€‹เป€เบžเบทเปˆเบญเบ™โ€‹เบขเบนเปˆโ€‹เปƒเบ™โ€‹เบเบปเบ™โ€‹เป„เบ”เป‰โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบšเปโ€‹เบฅเบดโ€‹เบเบฒเบ™ Flightradar24 เบŸเบฃเบตโ€‹. เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบชเบฐเบ”เบงเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเบ•เบดเบ”เบ•เบฒเบกเบ•เปเบฒเปเบซเบ™เปˆเบ‡เบ‚เบญเบ‡เป€เบฎเบทเบญเบšเบดเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡.

Flightradar24 - เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”? เบชเปˆเบงเบ™เบ—เบต 2, เป‚เบ›เบฃเป‚เบ•เบ„เป ADS-B

ะ’ เบชเปˆเบงเบ™เบ—เปเบฒเบญเบดเบ” เบซเบผเบฑเบเบเบฒเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบญเบญเบ™เป„เบฅเบ™เปŒเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป„เบ”เป‰เบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบ. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบทเบšเบ•เปเปˆเป€เบ”เบตเบ™เบซเบ™เป‰เบฒเปเบฅเบฐเบŠเบญเบเบซเบฒเบ‚เปเป‰เบกเบนเบ™เปƒเบ”เบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบเป€เบฎเบทเบญเบšเบดเบ™เป„เบ›เบซเบฒเบชเบฐเบ–เบฒเบ™เบตเบฎเบฑเบšเปเบฅเบฐเบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เบกเบฑเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เป‚เบ”เบเปƒเบŠเป‰ Python.

เป€เบฅเบทเปˆเบญเบ‡

เปเบ™เปˆเบ™เบญเบ™, เบ‚เปเป‰เบกเบนเบ™เป€เบฎเบทเบญเบšเบดเบ™เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ–เปˆเบฒเบเบ—เบญเบ”เปƒเบซเป‰เบœเบนเป‰เปƒเบŠเป‰เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เปƒเบ™เป‚เบ—เบฅเบฐเบชเบฑเบšเบชเบฐเบซเบผเบฒเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ. เบฅเบฐเบšเบปเบšเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบกเบตเบŠเบทเปˆเบงเปˆเบฒ ADS-B (Automatic dependent surveillanceโ€”broadcast), เปเบฅเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบเปˆเบฝเบงเบเบฑเบšเป€เบฎเบทเบญเบšเบดเบ™เป„เบ›เบซเบฒเบชเบนเบ™เบ„เบงเบšเบ„เบธเบก - เบ•เบปเบงเบฅเบฐเบšเบธ, เบˆเบธเบ”เบ›เบฐเบชเบฒเบ™เบ‡เบฒเบ™, เบ—เบดเบ”เบ—เบฒเบ‡, เบ„เบงเบฒเบกเป„เบง, เบ„เบงเบฒเบกเบชเบนเบ‡เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เบญเบทเปˆเบ™เป†เบ‚เบญเบ‡เบกเบฑเบ™เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡. เปƒเบ™เป€เบกเบทเปˆเบญเบเปˆเบญเบ™, เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบกเบฒเป€เบ–เบดเบ‡เบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบœเบนเป‰เบชเบปเปˆเบ‡เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เบˆเบธเบ”เปƒเบ”เบซเบ™เบถเปˆเบ‡เปƒเบ™ radar เป„เบ”เป‰. เบญเบฑเบ™เบ™เบตเป‰เบšเปเปˆเบžเบฝเบ‡เบžเปเบญเบตเบเป€เบกเบทเปˆเบญเบกเบตเบเบปเบ™เบซเบผเบฒเบเป€เบเบตเบ™เป„เบ›.

เบ—เบฒเบ‡เบ”เป‰เบฒเบ™เป€เบ—เบเบ™เบดเบ, ADS-B เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเป€เบ„เบทเปˆเบญเบ‡เบชเบปเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™เปƒเบ™เป€เบฎเบทเบญเบšเบดเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เปเบ•เปˆเบฅเบฐเป„เบฅเบเบฐเปƒเบ™เบ„เบงเบฒเบกเบ–เบตเปˆเบชเบนเบ‡เบ‚เบญเบ‡ 1090 MHz (เบกเบตเป‚เบซเบกเบ”เบญเบทเปˆเบ™เป†, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบปเบ™เปƒเบˆเบกเบฑเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบˆเบธเบ”เบ›เบฐเบชเบฒเบ™เบ‡เบฒเบ™เบ–เบทเบเบชเบปเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆเบ—เบตเปˆเบ™เบตเป‰). เปเบ™เปˆเบ™เบญเบ™, เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เบชเบปเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™, เบเบฑเบ‡เบกเบตเป€เบ„เบทเปˆเบญเบ‡เบฎเบฑเบšเบขเบนเปˆเบšเปˆเบญเบ™เปƒเบ”เบšเปˆเบญเบ™เบซเบ™เบถเปˆเบ‡เบขเบนเปˆเบชเบฐเบซเบ™เบฒเบกเบšเบดเบ™, เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ, เบœเบนเป‰เปƒเบŠเป‰, เป€เบ„เบทเปˆเบญเบ‡เบฎเบฑเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบ‡เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ.

เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบš, เบฅเบฐเบšเบปเบšเบ—เปเบฒเบญเบดเบ”, Airnav Radarbox, เบญเบญเบเปเบšเบšเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบ—เบปเปˆเบงเป„เบ›, เบ›เบฒเบเบปเบ”เปƒเบ™เบ›เบต 2007, เปเบฅเบฐเบกเบตเบฅเบฒเบ„เบฒเบ›เบฐเบกเบฒเบ™ 900 เป‚เบ”เบฅเบฒ; เบเบฒเบ™เบชเบฐเบซเบกเบฑเบเบšเปเบฅเบดเบเบฒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบกเบตเบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเบญเบตเบ 250 เป‚เบ”เบฅเบฒเบ•เปเปˆเบ›เบต.

Flightradar24 - เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”? เบชเปˆเบงเบ™เบ—เบต 2, เป‚เบ›เบฃเป‚เบ•เบ„เป ADS-B

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบฅเบฑเบ”เป€เบŠเบเบ—เปเบฒเบญเบดเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบขเบนเปˆเปƒเบ™ forum เป„เบ”เป‰ เป€เบ„เบทเปˆเบญเบ‡เบชเบฐเปเบเบ™เบงเบดเบ—เบฐเบเบธ. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เบตเปˆเป€เบ„เบทเปˆเบญเบ‡เบฎเบฑเบš RTL-SDR เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆเบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡, เบญเบธเบ›เบฐเบเบญเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบเบญเบšเป„เบ”เป‰เปƒเบ™เบฅเบฒเบ„เบฒ 30 เป‚เบ”เบฅเบฒ; เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™ เบชเปˆเบงเบ™เบ—เปเบฒเบญเบดเบ”. เบ‚เปเปƒเบซเป‰เบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเป‚เบ›เป‚เบ•เบ„เบญเบ™เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡ - เปƒเบซเป‰เป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”.

เบเบฒเบ™โ€‹เบฎเบฑเบšโ€‹เบชเบฑเบ™โ€‹เบเบฒเบ™โ€‹

เบ—เปเบฒเบญเบดเบ”, เบชเบฑเบ™เบเบฒเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบšเบฑเบ™เบ—เบถเบเป„เบงเป‰. เบชเบฑเบ™เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบกเบตเป„เบฅเบเบฐเป€เบงเบฅเบฒเบžเบฝเบ‡เปเบ•เปˆ 120 microseconds, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบžเบทเปˆเบญเบชเบฐเบ”เบงเบเบชเบฐเบšเบฒเบเปƒเบ™เบเบฒเบ™เบ–เบญเบ”เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบกเบฑเบ™, เป€เบ„เบทเปˆเบญเบ‡เบฎเบฑเบš SDR เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบเบฒเบ™เป€เบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ 5 MHz เปเบกเปˆเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™.

Flightradar24 - เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”? เบชเปˆเบงเบ™เบ—เบต 2, เป‚เบ›เบฃเป‚เบ•เบ„เป ADS-B

เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบšเบฑเบ™โ€‹เบ—เบถเบโ€‹, เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เป„เบŸเบฅโ€‹เปŒ WAV เบ—เบตเปˆโ€‹เบกเบตโ€‹เบญเบฑเบ”โ€‹เบ•เบฒโ€‹เบเบฒเบ™โ€‹เป€เบเบฑเบšโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡ 5000000 เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹เบ•เปเปˆโ€‹เบงเบดโ€‹เบ™เบฒโ€‹เบ—เบตโ€‹; 30 เบงเบดโ€‹เบ™เบฒโ€‹เบ—เบตโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบšเบฑเบ™โ€‹เบ—เบถเบโ€‹เบ”เบฑเปˆเบ‡โ€‹เบเปˆเบฒเบง "เบŠเบฑเปˆเบ‡โ€‹เบ™เปเป‰เบฒโ€‹เบซเบ™เบฑเบโ€‹" เบเปˆเบฝเบงโ€‹เบเบฑเบš 500MBโ€‹. เบเบฒเบ™เบŸเบฑเบ‡เบกเบฑเบ™เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบซเบผเบดเป‰เบ™เบชเบทเปˆ, เปเบ™เปˆเบ™เบญเบ™, เปเบกเปˆเบ™เบšเปเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ” - เป„เบŸเบฅเปŒเบšเปเปˆเบกเบตเบชเบฝเบ‡, เปเบ•เปˆเบชเบฑเบ™เบเบฒเบ™เบงเบดเบ—เบฐเบเบธเบ”เบดเบˆเบดเบ•เบญเบ™เป‚เบ”เบเบเบปเบ‡ - เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆ 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

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, เบฎเบนเบšเบžเบฒเบšเปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบชเบญเบ”เบ„เปˆเบญเบ‡เบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™.

เบเบฒเบ™เบ–เบญเบ”เบฅเบฐเบซเบฑเบ”

เบ—เปเบฒเบญเบดเบ”, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบ™เป‰เปเบฒเป€เบฅเบฑเบเบ™เป‰เบญเบ. เบชเบฑเบ™เบเบฒเบ™เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เบ–เบทเบเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป‚เบ”เบเปƒเบŠเป‰เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ” Manchester:

Flightradar24 - เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”? เบชเปˆเบงเบ™เบ—เบต 2, เป‚เบ›เบฃเป‚เบ•เบ„เป ADS-B

เบˆเบฒเบเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡ nibbles เบกเบฑเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบš "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 (Downlink Format, 5 bits) - เบเปเบฒเบ™เบปเบ”เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก. เบกเบตโ€‹เบซเบผเบฒเบโ€‹เบ›เบฐโ€‹เป€เบžเบ”โ€‹:

Flightradar24 - เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”? เบชเปˆเบงเบ™เบ—เบต 2, เป‚เบ›เบฃเป‚เบ•เบ„เป ADS-B
(เปเบซเบผเปˆเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡)

เบžเบงเบเป€เบฎเบปเบฒเบชเบปเบ™เปƒเบˆเบžเบฝเบ‡เปเบ•เปˆเบ›เบฐเป€เบžเบ” DF17, เป€เบžเบฒเบฐเบงเปˆเบฒ ... เบกเบฑเบ™เปเบกเปˆเบ™เบ™เบตเป‰เบ—เบตเปˆเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบˆเบธเบ”เบ›เบฐเบชเบฒเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เป€เบฎเบทเบญเบšเบดเบ™.

ICAO (24 bits) - เบฅเบฐโ€‹เบซเบฑเบ”โ€‹เป€เบญโ€‹เบเบฐโ€‹เบฅเบฑเบโ€‹เบชเบฒโ€‹เบเบปเบ™โ€‹เบ‚เบญเบ‡โ€‹เป€เบฎเบทเบญโ€‹เบšเบดเบ™โ€‹. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเบงเบ”เบชเบญเบšเบเบปเบ™เป‚เบ”เบเบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบกเบฑเบ™ เบญเบญเบ™เป„เบฅเบ™เปŒ (เบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบœเบนเป‰เบ‚เบฝเบ™เป„เบ”เป‰เบขเบธเบ”เป€เบŠเบปเบฒเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เปเบ•เปˆเบกเบฑเบ™เบเบฑเบ‡เบกเบตเบ„เบงเบฒเบกเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡). เบ•เบปเบงเบขเปˆเบฒเบ‡, เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบซเบฑเบ” 3c5ee2 เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ‚เปเป‰เบกเบนเบ™เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

Flightradar24 - เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”? เบชเปˆเบงเบ™เบ—เบต 2, เป‚เบ›เบฃเป‚เบ•เบ„เป ADS-B

เปเบเป‰เป„เบ‚: เปƒเบ™ เบ„เปเบฒโ€‹เป€เบซเบฑเบ™โ€‹เบเบฑเบšโ€‹เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹ เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ” ICAO เปเบกเปˆเบ™เปƒเบซเป‰เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบœเบนเป‰เบ—เบตเปˆเบชเบปเบ™เปƒเบˆเบญเปˆเบฒเบ™เบกเบฑเบ™.

เบ‚เปเป‰เบกเบนเบ™ (56 เบซเบผเบท 112 bits) - เบ‚เปเป‰เบกเบนเบ™เบ•เบปเบงเบˆเบดเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ–เบญเบ”เบฅเบฐเบซเบฑเบ”. เบ‚เปเป‰เบกเบนเบ™ 5 bits เบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก เบฅเบฐเบซเบฑเบ”เบ›เบฐเป€เบžเบ”, เบ›เบฐเบเบญเบšเบกเบตเบ›เบฐเป€เบžเบ”เบเปˆเบญเบเบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰ (เบšเปเปˆเบ„เบงเบ™เบชเบฑเบšเบชเบปเบ™เบเบฑเบš 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######

เป‚เบ”เบเบเบฒเบ™เบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เบชเบฒเบ, เบกเบฑเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบฅเบฐเบซเบฑเบ”เป€เบฎเบทเบญเบšเบดเบ™: 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
(เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™)

เบ‚เป‰เบญเบเบšเปเปˆเปเบกเปˆเบ™เบœเบนเป‰เบŠเปˆเบฝเบงเบŠเบฒเบ™ GIS, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบšเปเปˆเบฎเบนเป‰เบงเปˆเบฒเบกเบฑเบ™เบกเบฒเบˆเบฒเบเปƒเบช. เปƒเบœเบฎเบนเป‰, เบ‚เบฝเบ™เปƒเบ™เบ„เปเบฒเป€เบซเบฑเบ™.

เบฅเบฐเบ”เบฑเบšเบ„เบงเบฒเบกเบชเบนเบ‡เปเบกเปˆเบ™เบ–เบทเบงเปˆเบฒเบ‡เปˆเบฒเบเบ”เบฒเบ - เบ‚เบถเป‰เบ™เบเบฑเบšเบ„เบงเบฒเบกเบ–เบตเปˆเบชเบฐเป€เบžเบฒเบฐ, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบชเบฐเปเบ”เบ‡เป€เบ›เบฑเบ™เบ•เบปเบงเบ„เบนเบ™เบ‚เบญเบ‡ 25 เบซเบผเบท 100 เบŸเบธเบ”.

เบ„เบงเบฒเบกเป„เบงเบ—เบฒเบ‡เบญเบฒเบเบฒเบ”

เบŠเบธเบ”เบ—เบตเปˆเบกเบต TC=19. เบชเบดเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เปœเป‰เบฒโ€‹เบชเบปเบ™โ€‹เปƒเบˆโ€‹เบขเบนเปˆโ€‹เบ—เบตเปˆโ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบงเปˆเบฒโ€‹เบ„เบงเบฒเบกโ€‹เป„เบงโ€‹เบชเบฒเบกเบฒเบ”โ€‹เบ–เบทเบโ€‹เบ•เป‰เบญเบ‡, เบ—เบฝเบšโ€‹เปƒเบชเปˆโ€‹เบเบฑเบšโ€‹เปœเป‰เบฒโ€‹เบ”เบดเบ™ (Ground Speed), เบซเบผเบทโ€‹เปƒเบ™โ€‹เบญเบฒเบเบฒเบ”, โ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบงเบฑเบ”โ€‹เปเบ—เบโ€‹เบ”เป‰เบงเบโ€‹เป€เบŠเบฑเบ™โ€‹เป€เบŠเบตโ€‹เป€เบฎเบทเบญเบšเบดเบ™ (Airspeed). เบซเบผเบฒเบเบ‚เบปเบ‡เป€เบ‚เบ”เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบเบฑเบ‡เบ–เบทเบเบชเบปเปˆเบ‡เบ•เปเปˆ:

Flightradar24 - เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”? เบชเปˆเบงเบ™เบ—เบต 2, เป‚เบ›เบฃเป‚เบ•เบ„เป ADS-B
(เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™)

เบชเบฐเบซเบฅเบธเบš

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบต ADS-B เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™ symbiosis เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ, เป€เบกเบทเปˆเบญเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบŠเปˆเบฝเบงเบŠเบฒเบ™, เปเบ•เปˆเบเบฑเบ‡เบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบ—เบปเปˆเบงเป„เบ›. เปเบ•เปˆเปเบ™เปˆเบ™เบญเบ™, เบšเบปเบ”เบšเบฒเบ”เบชเปเบฒเบ„เบฑเบ™เปƒเบ™เป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เป„เบ”เป‰เบ–เบทเบเบซเบผเบตเป‰เบ™เป‚เบ”เบเป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเบ—เบตเปˆเบกเบตเบฅเบฒเบ„เบฒเบ–เบทเบเบเบงเปˆเบฒเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบฎเบฑเบš SDR เบ”เบดเบˆเบดเบ•เบญเบ™, เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบญเบธเบ›เบฐเบเบญเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบชเบฑเบ™เบเบฒเบ™เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบ–เบตเปˆเบชเบนเบ‡เบเบงเปˆเบฒ gigahertz "เบชเปเบฒเบฅเบฑเบš pennies."

เปƒเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡, เปเบ™เปˆเบ™เบญเบ™, เบกเบตเบซเบผเบฒเบเบซเบผเบฒเบ. เบœเบนเป‰เบ—เบตเปˆเบชเบปเบ™เปƒเบˆเบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡ 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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™