Flightradar24 - เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡? เชญเชพเช— 2, ADS-B เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ

เชนเซ‡เชฒเซ‹ เชนเซ‡เชฌเซเชฐ. เชธเช‚เชญเชตเชคเชƒ เชฆเชฐเซ‡เช• เชตเซเชฏเช•เซเชคเชฟ เช•เซ‡ เชœเซ‡เชฃเซ‡ เช•เซเชฏเชพเชฐเซ‡เชฏ เชธเช—เชพเช‚เช“ เช•เซ‡ เชฎเชฟเชคเซเชฐเซ‹เชจเซ‡ เชชเซเชฒเซ‡เชจเชฎเชพเช‚ เชฎเชณเซเชฏเชพ เชนเซ‹เชฏ เช…เชฅเชตเชพ เชœเซ‹เชฏเชพ เชนเซ‹เชฏ เชคเซ‡เชฎเชฃเซ‡ เชซเซเชฐเซ€ Flightradar24 เชธเซ‡เชตเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เชนเซ‹เชฏ. เชตเชพเชธเซเชคเชตเชฟเช• เชธเชฎเชฏเชฎเชพเช‚ เชเชฐเช•เซเชฐเชพเชซเซเชŸเชจเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซ‡ เชŸเซเชฐเซ…เช• เช•เชฐเชตเชพเชจเซ€ เช† เช–เซ‚เชฌ เชœ เช…เชจเซเช•เซ‚เชณ เชฐเซ€เชค เช›เซ‡.

Flightradar24 - เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡? เชญเชพเช— 2, ADS-B เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ

ะ’ เชชเซเชฐเชฅเชฎ เชญเชพเช— เช†เชตเซ€ เช“เชจเชฒเชพเชˆเชจ เชธเซ‡เชตเชพเชจเชพ เชธเช‚เชšเชพเชฒเชจ เชธเชฟเชฆเซเชงเชพเช‚เชคเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚. เช…เชฎเซ‡ เชนเชตเซ‡ เช†เช—เชณ เชตเชงเซ€เชถเซเช‚ เช…เชจเซ‡ เชœเชพเชฃเซ€เชถเซเช‚ เช•เซ‡ เชเชฐเช•เซเชฐเชพเชซเซเชŸเชฎเชพเช‚เชฅเซ€ เชฐเซ€เชธเซ€เชตเชฟเช‚เช— เชธเซเชŸเซ‡เชถเชจ เชชเชฐ เช•เชฏเซ‹ เชกเซ‡เชŸเชพ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชฐเชนเซเชฏเซ‹ เช›เซ‡ เช…เชจเซ‡ เชชเซเชฐเชพเชชเซเชค เชฅเชˆ เชฐเชนเซเชฏเซ‹ เช›เซ‡ เช…เชจเซ‡ เชชเชพเชฏเชฅเซ‹เชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชจเซ‡ เชœเชพเชคเซ‡ เชกเซ€เช•เซ‹เชก เช•เชฐเซ€เชถเซเช‚.

ะ˜ัั‚ะพั€ะธั

เชฆเซ‡เช–เซ€เชคเซ€ เชฐเซ€เชคเซ‡, เชฏเซเชเชฐเซเชธเชจเซ‡ เชคเซ‡เชฎเชจเชพ เชธเซเชฎเชพเชฐเซเชŸเชซเซ‹เชจ เชชเชฐ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เชเชฐเช•เซเชฐเชพเชซเซเชŸ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เชฅเชคเซ‹ เชจเชฅเซ€. เชธเชฟเชธเซเชŸเชฎเชจเซ‡ ADS-B (เช“เชŸเซ‹เชฎเซ‡เชŸเชฟเช• เชกเชฟเชชเซ‡เชจเซเชกเชจเซเชŸ เชธเชฐเซเชตเซ‡เชฒเชจเซเชธ-เชฌเซเชฐเซ‹เชกเช•เชพเชธเซเชŸ) เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชเชฐเช•เซเชฐเชพเชซเซเชŸ เชตเชฟเชถเซ‡เชจเซ€ เชฎเชพเชนเชฟเชคเซ€เชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เช•เซ‡เชจเซเชฆเซเชฐเชฎเชพเช‚ เช†เชชเชฎเซ‡เชณเซ‡ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡ - เชคเซ‡เชจเชพ เช“เชณเช–เช•เชฐเซเชคเชพ, เช•เซ‹เช“เชฐเซเชกเชฟเชจเซ‡เชŸเซเชธ, เชฆเชฟเชถเชพ, เชเชกเชช, เชŠเช‚เชšเชพเชˆ เช…เชจเซ‡ เช…เชจเซเชฏ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เชฅเชพเชฏ เช›เซ‡. เช…เช—เชพเช‰, เช†เชตเซ€ เชธเชฟเชธเซเชŸเชฎเซ‹เชจเชพ เช†เช—เชฎเชจ เชชเชนเซ‡เชฒเชพเช‚, เชฐเชตเชพเชจเช—เซ€ เชฐเชกเชพเชฐ เชชเชฐ เชฎเชพเชคเซเชฐ เชเช• เชฌเชฟเช‚เชฆเซ เชœเซ‹เชˆ เชถเช•เชคเซ€ เชนเชคเซ€. เชœเซเชฏเชพเชฐเซ‡ เช˜เชฃเชพ เชฌเชงเชพ เชตเชฟเชฎเชพเชจเซ‹ เชนเชคเชพ เชคเซเชฏเชพเชฐเซ‡ เช† เชชเซ‚เชฐเชคเซเช‚ เชจ เชนเชคเซเช‚.

เชคเช•เชจเซ€เช•เซ€ เชฐเซ€เชคเซ‡, ADS-B เชฎเชพเช‚ เชเชฐเช•เซเชฐเชพเชซเซเชŸ เชชเชฐ เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡ เชœเซ‡ เชธเชฎเชฏเชพเช‚เชคเชฐเซ‡ 1090 MHz เชจเซ€ เชเช•เชฆเชฎ เชŠเช‚เชšเซ€ เช†เชตเชฐเซเชคเชจ เชชเชฐ เชฎเชพเชนเชฟเชคเซ€เชจเชพ เชชเซ‡เช•เซ‡เชŸเซ‹ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡ (เชคเซเชฏเชพเช‚ เช…เชจเซเชฏ เชฎเซ‹เชกเซเชธ เช›เซ‡, เชชเชฐเช‚เชคเซ เช…เชฎเชจเซ‡ เชคเซ‡เชฎเชพเช‚ เชเชŸเชฒเซ€ เชฐเซเชšเชฟ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เช•เซ‹เช“เชฐเซเชกเชฟเชจเซ‡เชŸเซเชธ เชซเช•เซเชค เช…เชนเซ€เช‚ เชœ เชชเซเชฐเชธเชพเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡). เช…เชฒเชฌเชคเซเชค, เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐ เช‰เชชเชฐเชพเช‚เชค, เชเชฐเชชเซ‹เชฐเซเชŸ เชชเชฐ เช•เซเชฏเชพเช‚เช• เชฐเซ€เชธเซ€เชตเชฐ เชชเชฃ เช›เซ‡, เชชเชฐเช‚เชคเซ เช…เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชคเชฐเซ€เช•เซ‡, เช†เชชเชฃเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ เชฐเซ€เชธเซ€เชตเชฐ เชฐเชธเชชเซเชฐเชฆ เช›เซ‡.

เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เชธเชฐเช–เชพเชฎเชฃเซ€ เชฎเชพเชŸเซ‡, เช†เชตเซ€ เชชเชนเซ‡เชฒเซ€ เชธเชฟเชธเซเชŸเชฎ, เชเชฐเชจเซ‡เชต เชฐเชกเชพเชฐเชฌเซ‹เช•เซเชธ, เชœเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เชฐเชšเชพเชฏเซ‡เชฒ เช›เซ‡, 2007 เชฎเชพเช‚ เชฆเซ‡เช–เชพเชˆ เชนเชคเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เช•เชฟเช‚เชฎเชค เชฒเช—เชญเช— $900 เชนเชคเซ€, เช…เชจเซ‡ เชฒเช—เชญเช— 250$ เชจเซ‡เชŸเชตเชฐเซเช• เชธเซ‡เชตเชพเช“เชจเชพ เชธเชฌเซเชธเซเช•เซเชฐเชฟเชชเซเชถเชจเชจเซ‹ เชฆเชฐ เชตเชฐเซเชทเซ‡ เช–เชฐเซเชš เชฅเชพเชฏ เช›เซ‡.

Flightradar24 - เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡? เชญเชพเช— 2, ADS-B เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ

เชคเซ‡ เชชเซเชฐเชฅเชฎ เชฐเชถเชฟเชฏเชจ เชฎเชพเชฒเชฟเช•เซ‹เชจเซ€ เชธเชฎเซ€เช•เซเชทเชพเช“ เชซเซ‹เชฐเชฎ เชชเชฐ เชตเชพเช‚เชšเซ€ เชถเช•เชพเชฏ เช›เซ‡ เชฐเซ‡เชกเชฟเชฏเซ‹เชธเซเช•เซ‡เชจเชฐ. เชนเชตเซ‡ เชœเซเชฏเชพเชฐเซ‡ RTL-SDR เชฐเซ€เชธเซ€เชตเชฐเซ‹ เชตเซเชฏเชพเชชเช•เชชเชฃเซ‡ เช‰เชชเชฒเชฌเซเชง เชฅเชฏเชพ เช›เซ‡, เชธเชฎเชพเชจ เช‰เชชเช•เชฐเชฃ $30 เชฎเชพเช‚ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡; เช† เชตเชฟเชถเซ‡ เชตเชงเซ เชชเซเชฐเชฅเชฎ เชญเชพเช—. เชšเชพเชฒเซ‹ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชชเชฐ เชœ เช†เช—เชณ เชตเชงเซ€เช - เชšเชพเชฒเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡.

เชธเช‚เช•เซ‡เชคเซ‹ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เชชเซเชฐเชฅเชฎ, เชธเชฟเช—เซเชจเชฒ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชธเชฎเช—เซเชฐ เชธเชฟเช—เซเชจเชฒเชจเซ‹ เชธเชฎเชฏเช—เชพเชณเซ‹ เชฎเชพเชคเซเชฐ 120 เชฎเชพเช‡เช•เซเชฐเซ‹เชธเซ‡เช•เชจเซเชกเชจเซ‹ เช›เซ‡, เชคเซ‡เชฅเซ€ เชคเซ‡เชจเชพ เช˜เชŸเช•เซ‹เชจเซ‡ เช†เชฐเชพเชฎเชฅเซ€ เชกเชฟเชธเชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช“เช›เชพเชฎเชพเช‚ เช“เช›เชพ 5 เชฎเซ‡เช—เชพเชนเชฐเซเชŸเชเชจเซ€ เชธเซ‡เชฎเซเชชเชฒเชฟเช‚เช— เช†เชตเชฐเซเชคเชจ เชธเชพเชฅเซ‡ เชเชธเชกเซ€เช†เชฐ เชฐเซ€เชธเซ€เชตเชฐ เช‡เชšเซเช›เชจเซ€เชฏ เช›เซ‡.

Flightradar24 - เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡? เชญเชพเช— 2, ADS-B เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ

เชฐเซ‡เช•เซ‹เชฐเซเชกเชฟเช‚เช— เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช…เชฎเซ‡ 5000000 เชจเชฎเซ‚เชจเชพ/เชธเซ‡เช•เช‚เชกเชจเชพ เชจเชฎเซ‚เชจเชพ เชฆเชฐ เชธเชพเชฅเซ‡ WAV เชซเชพเช‡เชฒ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ€เช เช›เซ€เช; เช†เชตเชพ เชฐเซ‡เช•เซ‹เชฐเซเชกเชฟเช‚เช—เชจเซ€ 30 เชธเซ‡เช•เชจเซเชกเชจเซเช‚ "เชตเชœเชจ" เชฒเช—เชญเช— 500MB เช›เซ‡. เชฎเซ€เชกเชฟเชฏเชพ เชชเซเชฒเซ‡เชฏเชฐ เชธเชพเชฅเซ‡ เชคเซ‡เชจเซ‡ เชธเชพเช‚เชญเชณเชตเซเช‚, เช…เชฒเชฌเชคเซเชค, เชจเช•เชพเชฎเซเช‚ เช›เซ‡ - เชซเชพเช‡เชฒเชฎเชพเช‚ เชงเซเชตเชจเชฟ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชธเซ€เชงเซ‹ เชกเชฟเชœเชฟเชŸเชพเช‡เชเซเชก เชฐเซ‡เชกเชฟเชฏเซ‹ เชธเชฟเช—เซเชจเชฒ - เช† เชฐเซ€เชคเซ‡ เชธเซ‰เชซเซเชŸเชตเซ‡เชฐ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เชฐเซ‡เชกเชฟเชฏเซ‹ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡.

เช…เชฎเซ‡ 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 เชชเซเชฐเช•เชพเชฐเชฎเชพเช‚ เชœ เชฐเชธ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡... เช† เชคเซ‡ เช›เซ‡ เชœเซ‡ เชตเชฟเชฎเชพเชจเชจเชพ เช•เซ‹เช“เชฐเซเชกเชฟเชจเซ‡เชŸเซเชธ เชงเชฐเชพเชตเซ‡ เช›เซ‡.

เช†เชˆเชธเซ€เชเช“ (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#####

เชถเชฌเซเชฆเชฎเชพเชณเชพเชจเซ‡ เชกเซ€เช•เซ‹เชก เช•เชฐเซ€เชจเซ‡, เชเชฐเช•เซเชฐเชพเชซเซเชŸ เช•เซ‹เชก เชฎเซ‡เชณเชตเชตเซ‹ เชธเชฐเชณ เช›เซ‡: 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 เชธเชพเชฅเซ‡เชจเซเช‚ เชชเซ‡เช•เซ‡เชœ. เช…เชนเซ€เช‚ เชฐเชธเชชเซเชฐเชฆ เชฌเชพเชฌเชค เช เช›เซ‡ เช•เซ‡ เชเชกเชช เช•เชพเช‚ เชคเซ‹ เชธเชšเซ‹เชŸ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡, เชœเชฎเซ€เชจเชจเซ€ เชธเชพเชชเซ‡เช•เซเชท (เช—เซเชฐเชพเช‰เชจเซเชก เชธเซเชชเซ€เชก), เช…เชฅเชตเชพ เชเชฐเชฌเซ‹เชฐเซเชจ, เชเชฐเช•เซเชฐเชพเชซเซเชŸ เชธเซ‡เชจเซเชธเชฐ (เชเชฐเชธเซเชชเซ€เชก) เชฆเซเชตเชพเชฐเชพ เชฎเชพเชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช˜เชฃเชพเช‚ เชตเชฟเชตเชฟเชง เช•เซเชทเซ‡เชคเซเชฐเซ‹ เชชเชฃ เชชเซเชฐเชธเชพเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡:

Flightradar24 - เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡? เชญเชพเช— 2, ADS-B เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ
(เชธเซเชฐเซ‹เชค)

เชจเชฟเชทเซเช•เชฐเซเชท

เชœเซ‡เชฎ เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹, ADS-B เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€ เช เชเช• เชฐเชธเชชเซเชฐเชฆ เชธเชนเชœเซ€เชตเชจ เชฌเชจเซ€ เช—เชฏเซเช‚ เช›เซ‡, เชœเซเชฏเชพเชฐเซ‡ เชงเซ‹เชฐเชฃ เชฎเชพเชคเซเชฐ เชตเซเชฏเชพเชตเชธเชพเชฏเชฟเช•เซ‹ เชฎเชพเชŸเซ‡ เชœ เชจเชนเซ€เช‚, เชชเชฃ เชธเชพเชฎเชพเชจเซเชฏ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เชชเชฃ เช‰เชชเชฏเซ‹เช—เซ€ เช›เซ‡. เชชเชฐเช‚เชคเซ เช…เชฒเชฌเชคเซเชค, เช†เชฎเชพเช‚ เชฎเซเช–เซเชฏ เชญเซ‚เชฎเชฟเช•เชพ เชกเชฟเชœเชฟเชŸเชฒ SDR เชฐเซ€เชธเซ€เชตเชฐเซ‹เชจเซ€ เชธเชธเซเชคเซ€ เชคเช•เชจเซ€เช• เชฆเซเชตเชพเชฐเชพ เชญเชœเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€, เชœเซ‡ เช‰เชชเช•เชฐเชฃเชจเซ‡ "เชชเซ‡เชจเชฟเชธ เชฎเชพเชŸเซ‡" เช—เซ€เช—เชพเชนเชฐเซเชŸเซเชเชฅเซ€ เช‰เชชเชฐเชจเซ€ เชซเซเชฐเซ€เช•เซเชตเชจเซเชธเซ€เช เชธเชพเชฅเซ‡ เชถเชพเชฌเซเชฆเชฟเช• เชฐเซ€เชคเซ‡ เชธเชฟเช—เซเชจเชฒ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เชงเซ‹เชฐเชฃเชฎเชพเช‚ เชœ, เช…เชฒเชฌเชคเซเชค, เชคเซเชฏเชพเช‚ เช˜เชฃเซเช‚ เชฌเชงเซเช‚ เช›เซ‡. เชฐเชธ เชงเชฐเชพเชตเชคเชพ เชฒเซ‹เช•เซ‹ เชชเซƒเชทเซเช  เชชเชฐ เชชเซ€เชกเซ€เชเชซ เชœเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡ เช†เชˆเชธเซ€เชเช“ เช…เชฅเชตเชพ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เช‰เชชเชฐ เชœเชฃเชพเชตเซ‡เชฒ เชเช•เชจเซ€ เชฎเซเชฒเชพเช•เชพเชค เชฒเซ‹ เชตเซ‡เชฌเชธเชพเช‡เชŸ.

เชคเซ‡ เช…เชธเช‚เชญเชตเชฟเชค เช›เซ‡ เช•เซ‡ เช‰เชชเชฐเซ‹เช•เซเชค เชคเชฎเชพเชฎ เช˜เชฃเชพ เชฒเซ‹เช•เซ‹ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เชฅเชถเซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเซ‹ เช“เช›เชพเชฎเชพเช‚ เช“เช›เซ‹ เชธเชพเชฎเชพเชจเซเชฏ เชตเชฟเชšเชพเชฐ, เชฎเชจเซ‡ เช†เชถเชพ เช›เซ‡, เชฐเชนเซ‡ เช›เซ‡.

เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เชชเชพเชฏเชฅเซ‹เชจเชฎเชพเช‚ เชคเซˆเชฏเชพเชฐ เชกเซ€เช•เซ‹เชกเชฐ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เช›เซ‡, เชคเชฎเซ‡ เชคเซ‡เชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชนเซ€เช‚. เช…เชจเซ‡ SDR เชฐเซ€เชธเซ€เชตเชฐเซ‹เชจเชพ เชฎเชพเชฒเชฟเช•เซ‹ เชคเซˆเชฏเชพเชฐ ADS-B เชกเซ€เช•เซ‹เชกเชฐ เชเชธเซ‡เชฎเซเชฌเชฒ เช…เชจเซ‡ เชฒเซ‹เชจเซเชš เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เชชเซƒเชทเซเช  เชชเชฐเชฅเซ€, เช†เชฎเชพเช‚ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชšเชฐเซเชšเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ เชชเซเชฐเชฅเชฎ เชญเชพเช—.

เชฒเซ‡เช–เชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เชชเชพเชฐเซเชธเชฐเชจเซ‹ เชธเซเชฐเซ‹เชค เช•เซ‹เชก เช•เชŸเชจเซ€ เชจเซ€เชšเซ‡ เช†เชชเซ‡เชฒ เช›เซ‡. เช† เชเช• เชชเชฐเซ€เช•เซเชทเชฃ เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡ เชœเซ‡ เช‰เชคเซเชชเชพเชฆเชจ เชนเซ‹เชตเชพเชจเซ‹ เชกเซ‹เชณ เช•เชฐเชคเซเช‚ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชคเซ‡เชฎเชพเช‚ เช•เซ‡เชŸเชฒเซ€เช• เชตเชธเซเชคเซเช“ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช‰เชชเชฐ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเซ‡เชฒเซ€ เชซเชพเช‡เชฒเชจเซ‡ เชชเชพเชฐเซเชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡.
เชธเซ‹เชฐเซเชธ เช•เซ‹เชก (เชชเชพเชฏเชฅเซ‹เชจ)

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

DDoS เชธเซเชฐเช•เซเชทเชพ, VPS VDS เชธเชฐเซเชตเชฐ เชงเชฐเชพเชตเชคเซ€ เชธเชพเช‡เชŸเซเชธ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชนเซ‹เชธเซเชŸเชฟเช‚เช— เช–เชฐเซ€เชฆเซ‹ ๐Ÿ”ฅ DDoS เชธเซเชฐเช•เซเชทเชพ, VPS VDS เชธเชฐเซเชตเชฐเซเชธ เชธเชพเชฅเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชตเซ‡เชฌเชธเชพเช‡เชŸ เชนเซ‹เชธเซเชŸเชฟเช‚เช— เช–เชฐเซ€เชฆเซ‹ | ProHoster