Flightradar24 - рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ? рднрд╛рдЧ 2, ADS-B рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рд╣реЕрд▓реЛ рд╣реЕрдмреНрд░. рдХрджрд╛рдЪрд┐рдд рдкреНрд░рддреНрдпреЗрдХрдЬрдг рдЬреЗ рдХрдзреАрд╣реА рдирд╛рддреЗрд╡рд╛рдИрдХ рдХрд┐рдВрд╡рд╛ рдорд┐рддреНрд░рд╛рдВрдирд╛ рд╡рд┐рдорд╛рдирд╛рдд рднреЗрдЯрд▓реЗ рдХрд┐рдВрд╡рд╛ рдкрд╛рд╣рд┐рд▓реЗ рдЕрд╕реЗрд▓ рддреНрдпрд╛рдВрдиреА рд╡рд┐рдирд╛рдореВрд▓реНрдп Flightradar24 рд╕реЗрд╡рд╛ рд╡рд╛рдкрд░рд▓реА рдЕрд╕реЗрд▓. рд░рд┐рдЕрд▓ рдЯрд╛рдЗрдордордзреНрдпреЗ рд╡рд┐рдорд╛рдирд╛рдЪреНрдпрд╛ рд╕реНрдерд┐рддреАрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреНрдпрд╛рдЪрд╛ рд╣рд╛ рдПрдХ рдЕрддрд┐рд╢рдп рд╕реЛрдпреАрд╕реНрдХрд░ рдорд╛рд░реНрдЧ рдЖрд╣реЗ.

Flightradar24 - рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ? рднрд╛рдЧ 2, ADS-B рдкреНрд░реЛрдЯреЛрдХреЙрд▓

╨Т рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ рдЕрд╢рд╛ рдСрдирд▓рд╛рдЗрди рд╕реЗрд╡реЗрдЪреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рддрддреНрддреНрд╡ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рд╣реЛрддреЗ. рдЖрдореНрд╣реА рдЖрддрд╛ рдкреБрдвреЗ рдЬрд╛рдК рдЖрдгрд┐ рд╡рд┐рдорд╛рдирд╛рддреВрди рд░рд┐рд╕реАрд╡реНрд╣рд┐рдВрдЧ рд╕реНрдЯреЗрд╢рдирд▓рд╛ рдХреЛрдгрддрд╛ рдбреЗрдЯрд╛ рдкрд╛рдард╡рд▓рд╛ рдЖрдгрд┐ рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓рд╛ рдЬрд╛рдд рдЖрд╣реЗ рддреЗ рд╢реЛрдзреВрди рдХрд╛рдвреВ рдЖрдгрд┐ рдкрд╛рдпрдерди рд╡рд╛рдкрд░реВрди рддреЗ рд╕реНрд╡рддрдГ рдбреАрдХреЛрдб рдХрд░реВ.

рдХрдерд╛

рдЕрд░реНрдерд╛рдд, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕реНрдорд╛рд░реНрдЯрдлреЛрдирд╡рд░ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рдорд╛рдирд╛рдЪрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдд рдирд╛рд╣реА. рдпрд╛ рдкреНрд░рдгрд╛рд▓реАрд▓рд╛ рдПрдбреАрдПрд╕-рдмреА (рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдЕрд╡рд▓рдВрдмрд┐рдд рдкрд╛рд│рдд рдареЗрд╡рдгреЗтАФрдкреНрд░рд╕рд╛рд░рдг) рдЕрд╕реЗ рдореНрд╣рдгрддрд╛рдд рдЖрдгрд┐ рд╡рд┐рдорд╛рдирд╛рд╡рд┐рд╖рдпреАрдЪреА рдорд╛рд╣рд┐рддреА рдирд┐рдпрдВрддреНрд░рдг рдХреЗрдВрджреНрд░рд╛рдХрдбреЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ - рддреНрдпрд╛рдЪреЗ рдЕрднрд┐рдЬреНрдЮрд╛рдкрдХ, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рджрд┐рд╢рд╛, рд╡реЗрдЧ, рдЙрдВрдЪреА рдЖрдгрд┐ рдЗрддрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. рдкреВрд░реНрд╡реА, рдЕрд╢рд╛ рдкреНрд░рдгрд╛рд▓реАрдЪреНрдпрд╛ рдЖрдЧрдордирд╛рдкреВрд░реНрд╡реА, рдбрд┐рд╕реНрдкреЕрдЪрд░ рдлрдХреНрдд рд░рдбрд╛рд░рд╡рд░ рдПрдХ рдмрд┐рдВрджреВ рдкрд╛рд╣реВ рд╢рдХрдд рд╣реЛрддрд╛. рдЦреВрдк рд╡рд┐рдорд╛рдиреЗ рдЕрд╕рддрд╛рдирд╛ рд╣реЗ рдкреБрд░реЗрд╕реЗ рдирд╡реНрд╣рддреЗ.

рддрд╛рдВрддреНрд░рд┐рдХрджреГрд╖реНрдЯреНрдпрд╛, ADS-B рдордзреНрдпреЗ рд╡рд┐рдорд╛рдирд╛рд╡рд░реАрд▓ рдЯреНрд░рд╛рдиреНрд╕рдореАрдЯрд░ рдЕрд╕рддреЛ рдЬреЛ рд╡реЗрд│реЛрд╡реЗрд│реА 1090 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЭрдЪреНрдпрд╛ рдмрд░реНтАНрдпрд╛рдкреИрдХреА рдЙрдЪреНрдЪ рд╡рд╛рд░рдВрд╡рд╛рд░рддреЗрд╡рд░ рдорд╛рд╣рд┐рддреАрдЪреЗ рдкреЕрдХреЗрдЯ рдкрд╛рдард╡рддреЛ (рдЗрддрд░ рдореЛрдб рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рдЖрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛рдордзреНрдпреЗ рдлрд╛рд░рд╕рд╛ рд░рд╕ рдирд╛рд╣реА, рдХрд╛рд░рдг рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдлрдХреНрдд рдпреЗрдереЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд). рдЕрд░реНрдерд╛рдд, рдЯреНрд░рд╛рдиреНрд╕рдореАрдЯрд░ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд╡рд┐рдорд╛рдирддрд│рд╛рд╡рд░ рдХреБрдареЗрддрд░реА рдПрдХ рд░рд┐рд╕реАрд╡реНрд╣рд░ рджреЗрдЦреАрд▓ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА, рд╡рд╛рдкрд░рдХрд░реНрддреЗ рдореНрд╣рдгреВрди, рдЖрдордЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ рд░рд┐рд╕реАрд╡реНрд╣рд░ рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ.

рддрд╕реЗ, рддреБрд▓рдирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЕрд╢реА рдкрд╣рд┐рд▓реА рдкреНрд░рдгрд╛рд▓реА, рдПрдЕрд░рдирд╡ рд░рдбрд╛рд░рдмреЙрдХреНрд╕, рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓реА, 2007 рдордзреНрдпреЗ рджрд┐рд╕рд▓реА рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдХрд┐рдВрдордд рд╕реБрдорд╛рд░реЗ $900 рдЖрд╣реЗ; рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдВрдЪреНрдпрд╛ рд╕рджрд╕реНрдпрддреЗрд╕рд╛рдареА рд╡рд░реНрд╖рд╛рд▓рд╛ рдЖрдгрдЦреА $250 рдЦрд░реНрдЪ рдпреЗрддреЛ.

Flightradar24 - рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ? рднрд╛рдЧ 2, ADS-B рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рддреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рд░рд╢рд┐рдпрди рдорд╛рд▓рдХрд╛рдВрдЪреА рдкреБрдирд░рд╛рд╡рд▓реЛрдХрдиреЗ рдлреЛрд░рдорд╡рд░ рд╡рд╛рдЪрд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд рд░реЗрдбрд┐рдУрд╕реНрдХреЕрдирд░. рдЖрддрд╛ рдЖрд░рдЯреАрдПрд▓-рдПрд╕рдбреАрдЖрд░ рд░рд┐рд╕реАрд╡реНрд╣рд░реНрд╕ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ рдЙрдкрд▓рдмреНрдз рдЭрд╛рд▓реЗ рдЖрд╣реЗрдд, рддрддреНрд╕рдо рдбрд┐рд╡реНрд╣рд╛рдЗрд╕ $30 рдордзреНрдпреЗ рдПрдХрддреНрд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ; рдпрд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ. рдЪрд▓рд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓рд╡рд░ рдЬрд╛рдКрдпрд╛ - рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рддреЗ рдкрд╛рд╣реВрдпрд╛.

рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреЗ

рдкреНрд░рдердо, рд╕рд┐рдЧреНрдирд▓ рд░реЗрдХреЙрд░реНрдб рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╕рдВрдкреВрд░реНрдг рд╕рд┐рдЧреНрдирд▓рдЪрд╛ рдХрд╛рд▓рд╛рд╡рдзреА рдлрдХреНрдд 120 рдорд╛рдпрдХреНрд░реЛрд╕реЗрдХрдВрдж рдЕрд╕рддреЛ, рддреНрдпрд╛рдореБрд│реЗ рддреНрдпрд╛рдЪреЗ рдШрдЯрдХ рдЖрд░рд╛рдорд╛рдд рд╡реЗрдЧрд│реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдХрд┐рдорд╛рди 5 MHz рдЪреНрдпрд╛ рд╕реЕрдореНрдкрд▓рд┐рдВрдЧ рд╡рд╛рд░рдВрд╡рд╛рд░рддрд╛ рдЕрд╕рд▓реЗрд▓рд╛ SDR рд░рд┐рд╕реАрд╡реНрд╣рд░ рдШреЗрдгреЗ рдЗрд╖реНрдЯ рдЖрд╣реЗ.

Flightradar24 - рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ? рднрд╛рдЧ 2, ADS-B рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рд░реЗрдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣рд╛рд▓рд╛ 5000000 рдирдореБрдиреЗ/рд╕реЗрдХрдВрдж рд╕реЕрдореНрдкрд▓рд┐рдВрдЧ рд░реЗрдЯ рдЕрд╕рд▓реЗрд▓реА WAV рдлрд╛рдЗрд▓ рдорд┐рд│рддреЗ; рдЕрд╢рд╛ рд░реЗрдХреЙрд░реНрдбрд┐рдВрдЧрдЪреЗ 30 рд╕реЗрдХрдВрдж "рд╡рдЬрди" рд╕реБрдорд╛рд░реЗ 500MB рдЕрд╕рддреЗ. рдореАрдбрд┐рдпрд╛ рдкреНрд▓реЗрдпрд░рд╕рд╣ рддреЗ рдРрдХрдгреЗ, рдЕрд░реНрдерд╛рддрдЪ, рдирд┐рд░реБрдкрдпреЛрдЧреА рдЖрд╣реЗ - рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдзреНрд╡рдиреА рдирд╕рддреЛ, рдкрд░рдВрддреБ рдереЗрдЯ рдбрд┐рдЬрд┐рдЯрд╛рдпрдЭреНрдб рд░реЗрдбрд┐рдУ рд╕рд┐рдЧреНрдирд▓ - рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░реЗрдбрд┐рдУ рд╣реЗрдЪ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ.

рдЖрдореНрд╣реА рдкрд╛рдпрдерди рд╡рд╛рдкрд░реВрди рдлрд╛рдЗрд▓ рдЙрдШрдбреВ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реВ. рдЬреНрдпрд╛рдВрдирд╛ рд╕реНрд╡рддрдГ рдкреНрд░рдпреЛрдЧ рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗрдд рддреЗ рдЙрджрд╛рд╣рд░рдг рд░реЗрдХреЙрд░реНрдбрд┐рдВрдЧ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рд╢рдХрддрд╛рдд рджреБрд╡рд╛.

рдЪрд▓рд╛ рдлрд╛рдИрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рдЖрдгрд┐ рдЖрдд рдХрд╛рдп рдЖрд╣реЗ рддреЗ рдкрд╛рд╣реВ.

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 рдкреНрд░реЛрдЯреЛрдХреЙрд▓
(рд╕реНрддреНрд░реЛрдд)

рдирд┐рд╖реНрдХрд░реНрд╖

рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддрд╛, рдПрдбреАрдПрд╕-рдмреА рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдПрдХ рдордиреЛрд░рдВрдЬрдХ рд╕рд╣рдЬреАрд╡рди рдмрдирд▓реЗ рдЖрд╣реЗ, рдЬреЗрд╡реНрд╣рд╛ рдорд╛рдирдХ рдХреЗрд╡рд│ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХрд╛рдВрд╕рд╛рдареАрдЪ рдирд╛рд╣реА рддрд░ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрд╕рд╛рдареА рджреЗрдЦреАрд▓ рдЙрдкрдпреБрдХреНрдд рдЖрд╣реЗ. рдкрд░рдВрддреБ рдЕрд░реНрдерд╛рддрдЪ, рдпрд╛рдордзреНрдпреЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреА рднреВрдорд┐рдХрд╛ рдбрд┐рдЬрд┐рдЯрд▓ рдПрд╕рдбреАрдЖрд░ рд░рд┐рд╕реАрд╡реНрд╣рд░реНрд╕рдЪреНрдпрд╛ рд╕реНрд╡рд╕реНрдд рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рджреНрд╡рд╛рд░реЗ рдЦреЗрд│рд▓реА рдЧреЗрд▓реА, рдЬреА рдбрд┐рд╡реНрд╣рд╛рдЗрд╕рд▓рд╛ рд╢рдмреНрджрд╢рдГ "рдкреЗрдиреАрд╕рд╛рдареА" рдЧрд┐рдЧрд╛рд╣рд░реНрдЯреНрдЭрдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдлреНрд░рд┐рдХреНрд╡реЗрдиреНрд╕реАрд╕рд╣ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ.

рдорд╛рдирдХрд╛рддрдЪ, рдЕрд░реНрдерд╛рддрдЪ рдмрд░реЗрдЪ рдХрд╛рд╣реА рдЖрд╣реЗ. рдЬреНрдпрд╛рдВрдирд╛ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЖрд╣реЗ рддреЗ рдкреГрд╖реНрдард╛рд╡рд░реАрд▓ PDF рдкрд╛рд╣реВ рд╢рдХрддрд╛рдд рдЖрдпрд╕реАрдПрдУ рдХрд┐рдВрд╡рд╛ рд╡рд░ рдирдореВрдж рдХреЗрд▓реЗрд▓реНрдпрд╛рд▓рд╛ рднреЗрдЯ рджреНрдпрд╛ рд╡реЗрдмрд╕рд╛рдЗрдЯ.

рд╡рд░реАрд▓ рд╕рд░реНрд╡ рдЕрдиреЗрдХрд╛рдВрд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рдард░рддреАрд▓ рдЕрд╢реА рд╢рдХреНрдпрддрд╛ рдирд╛рд╣реА, рдкрд░рдВрддреБ рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдпрд╛рдмрджреНрджрд▓ рдХрд┐рдорд╛рди рд╕рд╛рдорд╛рдиреНрдп рдХрд▓реНрдкрдирд╛, рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ, рд░рд╛рд╣рддреЗ.

рддрд╕реЗ, рдкрд╛рдпрдердирдордзреНрдпреЗ рддрдпрд╛рд░ рдбреАрдХреЛрдбрд░ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗ, рдЖрдкрдг рддреНрдпрд╛рдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реВ рд╢рдХрддрд╛ рдпреЗрдереЗ. рдЖрдгрд┐ рдПрд╕рдбреАрдЖрд░ рд░рд┐рд╕реАрд╡реНрд╣рд░реНрд╕рдЪреЗ рдорд╛рд▓рдХ рд░реЗрдбреАрдореЗрдб рдПрдбреАрдПрд╕-рдмреА рдбреАрдХреЛрдбрд░ рдПрдХрддреНрд░ рдЖрдгрд┐ рд▓реЙрдиреНрдЪ рдХрд░реВ рд╢рдХрддрд╛рдд рдкреГрд╖реНрдард╛рд╡рд░реВрди, рдпрд╛рд╡рд░ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдЪрд░реНрдЪрд╛ рдХреЗрд▓реА рд╣реЛрддреА рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ.

рд▓реЗрдЦрд╛рдд рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкрд╛рд░реНрд╕рд░рдЪрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдХрдЯ рдЦрд╛рд▓реА рджрд┐рд▓реЗрд▓рд╛ рдЖрд╣реЗ. рд╣реЗ рдПрдХ рдЪрд╛рдЪрдгреА рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ рдЬреЗ рдЙрддреНрдкрд╛рджрди рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рднрд╛рд╕рд╡рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдХрд╛рд╣реА рдЧреЛрд╖реНрдЯреА рддреНрдпрд╛рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд рдЖрдгрд┐ рддреЗ рд╡рд░ рд░реЗрдХреЙрд░реНрдб рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрд╛рдЗрд▓рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.
рд╕реНрд░реЛрдд рдХреЛрдб (рдкрд╛рдпрдерди)

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛