Flightradar24 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓

рдирдорд╕реНрддреЗ рд╣рдмрд░ред рд╕рд╛рдпрдж рдЬреЛ рдХреЛрд╣реАрд▓реЗ рдкрдирд┐ рд╡рд┐рдорд╛рдирдорд╛ рдЖрдлрдиреНрдд рд╡рд╛ рд╕рд╛рдереАрднрд╛рдЗрд▓рд╛рдИ рднреЗрдЯреЗрдХрд╛ рдЫрдиреН рд╡рд╛ рдмрд┐рджрд╛рдИ рдЧрд░реЗрдХрд╛ рдЫрдиреН, рдЙрдиреАрд╣рд░реВрд▓реЗ рдирд┐:рд╢реБрд▓реНрдХ рд╕реЗрд╡рд╛ Flightradar24 рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдХрд╛ рдЫрдиреНред рдпреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордпрдорд╛ рд╣рд╡рд╛рдИрдЬрд╣рд╛рдЬрдХреЛ рд╕реНрдерд┐рддрд┐ рдЯреНрд░реНрдпрд╛рдХ рдЧрд░реНрдиреЗ рдзреЗрд░реИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░рд┐рдХрд╛ рд╣реЛред

Flightradar24 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓

╨Т рдкрд╣рд┐рд▓реЛ рднрд╛рдЧ рдпрд╕реНрддреЛ рдЕрдирд▓рд╛рдЗрди рд╕реЗрд╡рд╛рдХреЛ рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рд╕рд┐рджреНрдзрд╛рдиреНрдд рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред рдЕрдм рд╣рд╛рдореА рдЕрдЧрд╛рдбрд┐ рдмрдвреНрдиреЗрдЫреМрдВ рд░ рд╡рд┐рдорд╛рдирдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рд╕реНрдЯреЗрд╢рдирдорд╛ рдХреБрди рдбреЗрдЯрд╛ рдкреНрд░рд╕рд╛рд░рдг рд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░рд┐рдиреНрдЫ рднрдиреЗрд░ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдБрдиреЗрдЫреМрдВ, рд░ рдкрд╛рдЗрдерди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЖрдлреИрдВ рдбрд┐рдХреЛрдб рдЧрд░реНрдиреЗрдЫреМрдВред

рдХрдерд╛

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

рдкреНрд░рд╛рд╡рд┐рдзрд┐рдХ рд░реВрдкрдорд╛, ADS-B рдорд╛ рд╡рд┐рдорд╛рдирдорд╛ рдЯреНрд░рд╛рдиреНрд╕рдорд┐рдЯрд░ рд╣реБрдиреНрдЫ рдЬрд╕рд▓реЗ рдЖрд╡рдзрд┐рдХ рд░реВрдкрдорд╛ резрежрепреж рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬрдХреЛ рдЙрдЪреНрдЪ рдЖрд╡реГрддреНрддрд┐рдорд╛ рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рдкреНрдпрд╛рдХреЗрдЯрд╣рд░реВ рдкрдард╛рдЙрдБрдЫ (рддреНрдпрд╣рд╛рдБ рдЕрдиреНрдп рдореЛрдбрд╣рд░реВ рдЫрдиреН, рддрд░ рд╣рд╛рдореАрд▓рд╛рдИ рддрд┐рдиреАрд╣рд░реВрдорд╛ рддреНрдпрддрд┐ рд░реБрдЪрд┐ рдЫреИрди, рдХрд┐рдирдХрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╣рд░реВ рдпрд╣рд╛рдБ рдорд╛рддреНрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реБрдиреНрдЫрдиреН)ред рдЕрд╡рд╢реНрдп рдкрдирд┐, рдЯреНрд░рд╛рдиреНрд╕рдорд┐рдЯрд░рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╡рд┐рдорд╛рдирд╕реНрдерд▓рдорд╛ рдХрддреИ рд░рд┐рд╕реАрднрд░ рдкрдирд┐ рдЫ, рддрд░ рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛, рд░реЛрдЪрдХ рд░рд┐рд╕реАрднрд░ рд╣рд╛рдореНрд░реЛ рдЖрдлреНрдиреИ рд╣реЛред

рдЦреИрд░, рддреБрд▓рдирд╛рдХреЛ рд▓рд╛рдЧрд┐, рдкрд╣рд┐рд▓реЛ рдпрд╕реНрддреЛ рдкреНрд░рдгрд╛рд▓реА, Airnav Radarbox, рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдбрд┐рдЬрд╛рдЗрди рдЧрд░рд┐рдПрдХреЛ, реирежрежрен рдорд╛ рджреЗрдЦрд╛ рдкрд░реНтАНрдпреЛ рд░ рдпрд╕рдХреЛ рд▓рд╛рдЧрдд рд▓рдЧрднрдЧ $репрежреж рдерд┐рдпреЛ, рд░ рд▓рдЧрднрдЧ 250$ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд╕рджрд╕реНрдпрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддрд┐ рд╡рд░реНрд╖ рд╢реБрд▓реНрдХ рд▓рд╛рдЧреНрдЫред

Flightradar24 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓

рддреА рдкрд╣рд┐рд▓реЛ рд░реВрд╕реА рдорд╛рд▓рд┐рдХрд╣рд░реВрдХреЛ рд╕рдореАрдХреНрд╖рд╛ рдлреЛрд░рдордорд╛ рдкрдвреНрди рд╕рдХрд┐рдиреНрдЫред рд░реЗрдбрд┐рдпреЛрд╕реНрдХреНрдпрд╛рдирд░ред рдЕрдм RTL-SDR рд░рд┐рд╕реАрднрд░рд╣рд░реВ рд╡реНрдпрд╛рдкрдХ рд░реВрдкрдорд╛ рдЙрдкрд▓рдмреНрдз рднрдЗрд╕рдХреЗрдХрд╛ рдЫрдиреН, рдпрд╕реНрддреИ рдЙрдкрдХрд░рдг $рейреж рдорд╛ рднреЗрд▓рд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдпрд╕ рдмрд╛рд░реЗ рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВ рдпрд╕ рд▓реЗрдЦрдорд╛ рдЫрдиреНред рдкрд╣рд┐рд▓реЛ рднрд╛рдЧред рдкреНрд░реЛрдЯреЛрдХрд▓рдореИ рдЬрд╛рдФрдВ - рд╣реЗрд░реМрдВ рдпреЛ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫред

рд╕рдВрдХреЗрддрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджреИ

рдкрд╣рд┐рд▓реЗ, рд╕рд┐рдЧреНрдирд▓ рд░реЗрдХрд░реНрдб рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рд╕рдореНрдкреВрд░реНрдг рд╕рд┐рдЧреНрдирд▓ рдХреЗрд╡рд▓ резреиреж рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХреЗрдиреНрдб рд▓рд╛рдореЛ рдЫ, рддреНрдпрд╕реИрд▓реЗ рдпрд╕рдХреЛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ рд╕рд╣рдЬ рд░реВрдкрдорд╛ рдкрд╛рд░реНрд╕ рдЧрд░реНрди, рдХрдореНрддрд┐рдорд╛ рел рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬрдХреЛ рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рднрдПрдХреЛ SDR рд░рд┐рд╕реАрднрд░ рд╡рд╛рдВрдЫрдиреАрдп рдЫред

Flightradar24 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓

рд░реЗрдХрд░реНрдбрд┐рдЩ рдкрдЫрд┐, рд╣рд╛рдореАрд▓реЗ рел,режрежреж,режрежреж рдирдореВрдирд╛/рд╕реЗрдХреЗрдиреНрдбрдХреЛ рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рднрдПрдХреЛ WAV рдлрд╛рдЗрд▓ рдкрд╛рдЙрдБрдЫреМрдВ, рдпрд╕реНрддреЛ рд░реЗрдХрд░реНрдбрд┐рдЩрдХреЛ рейреж рд╕реЗрдХреЗрдиреНрдбрдХреЛ "рддреМрд▓" рд▓рдЧрднрдЧ релрежреж MB рд╣реБрдиреНрдЫред рдЕрд╡рд╢реНрдп рдкрдирд┐, рдорд┐рдбрд┐рдпрд╛ рдкреНрд▓реЗрдпрд░рдХреЛ рд╕рд╛рде рд╕реБрдиреНрдиреБ рдмреЗрдХрд╛рд░ рдЫ - рдлрд╛рдЗрд▓рдорд╛ рдзреНрд╡рдирд┐ рдЫреИрди, рддрд░ рдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдкрдорд╛ рдбрд┐рдЬрд┐рдЯрд▓рд╛рдЗрдЬреНрдб рд░реЗрдбрд┐рдпреЛ рд╕рд┐рдЧреНрдирд▓ рдЫ - рдпрд╕рд░реА рд╕рдлреНрдЯрд╡реЗрдпрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░реЗрдбрд┐рдпреЛрд▓реЗ рдХрд╛рдо рдЧрд░реНрдЫред

рд╣рд╛рдореА рдкрд╛рдЗрдерди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдлрд╛рдЗрд▓ рдЦреЛрд▓реНрдиреЗрдЫреМрдВ рд░ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдиреЗрдЫреМрдВред рдЖрдлреИрдВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЪрд╛рд╣рдиреЗрд╣рд░реВрд▓реЗ рдЙрджрд╛рд╣рд░рдг рд░реЗрдХрд░реНрдбрд┐рдЩ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рд╕рдХреНрдЫрдиреНред рд▓рд┐рдЩреНрдХ.

рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реМрдВ рд░ рднрд┐рддреНрд░ рдХреЗ рдЫ рд╣реЗрд░реМрдВред

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 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓

рдкреНрд░рддреНрдпреЗрдХ "рдкрд▓реНрд╕" рдПрдЙрдЯрд╛ рд╕рдВрдХреЗрдд рд╣реЛ, рдЬрд╕рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдЧреНрд░рд╛рдлрдорд╛ рд░рд┐рдЬреЛрд▓реНрдпреБрд╕рди рдмрдврд╛рдЙрдиреБрднрдпреЛ рднрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рджреЗрдЦрд┐рдиреНрдЫред

Flightradar24 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓

рддрдкрд╛рдИрдВрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрд╕реНрд╡реАрд░ рдорд╛рдерд┐рдХреЛ рд╡рд┐рд╡рд░рдгрдорд╛ рджрд┐рдЗрдПрдХреЛ рдХреБрд░рд╛рд╕рдБрдЧ рдПрдХрджрдореИ рдорд┐рд▓реНрджреЛрдЬреБрд▓реНрджреЛ рдЫред рддрдкрд╛рдИрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╢реЛрдзрди рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдбрд┐рдХреЛрдбрд┐рдЩ

рдкрд╣рд┐рд▓реЗ, рддрдкрд╛рдИрдВрд▓реЗ рдмрд┐рдЯрд╕реНрдЯреНрд░рд┐рдо рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рд╕рд┐рдЧреНрдирд▓ рдЖрдлреИрдВ рдореНрдпрд╛рдирдЪреЗрд╕реНрдЯрд░ рдПрдиреНрдХреЛрдбрд┐рдЩ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдПрдиреНрдХреЛрдб рдЧрд░рд┐рдПрдХреЛ рдЫ:

Flightradar24 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓

рдирд┐рдмрд▓рд╣рд░реВрдорд╛ рд╕реНрддрд░рд╣рд░реВрдХреЛ рднрд┐рдиреНрдирддрд╛рдмрд╛рдЯ рд╡рд╛рд╕реНрддрд╡рд┐рдХ "реж" рд░ "рез" рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рдЫред

    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 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓

рдХреНрд╖реЗрддреНрд░рд╣рд░реВрд▓рд╛рдИ рдЕрдЭ рд╡рд┐рд╕реНрддреГрдд рд░реВрдкрдорд╛ рд╣реЗрд░реМрдВред

DF (рдбрд╛рдЙрдирд▓рд┐рдЩреНрдХ рдврд╛рдБрдЪрд╛, рел рдмрд┐рдЯ) тАФ рд╕рдиреНрджреЗрд╢ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрджрдЫред рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдкреНрд░рдХрд╛рд░рд╣рд░реВ рдЫрдиреН:

Flightradar24 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓
(рддрд╛рд▓рд┐рдХрд╛рдХреЛ рд╕реНрд░реЛрдд)

рд╣рд╛рдореАрд▓рд╛рдИ рдХреЗрд╡рд▓ DF17 рдкреНрд░рдХрд╛рд░рдорд╛ рд░реБрдЪрд┐ рдЫ, рдХрд┐рдирдХрд┐ рдпрд╕рдорд╛ рд╡рд┐рдорд╛рди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╣рд░реВ рдЫрдиреНред

ICAO (реирек рдмрд┐рдЯ) тАФ рд╡рд┐рдорд╛рдирдХреЛ рдЕрдиреНрддрд░реНрд░рд╛рд╖реНрдЯреНрд░рд┐рдп рдЕрджреНрд╡рд┐рддреАрдп рдХреЛрдбред рддрдкрд╛рдИрдВрд▓реЗ рд╡рд┐рдорд╛рдирд▓рд╛рдИ рдпрд╕рдХреЛ рдХреЛрдбрджреНрд╡рд╛рд░рд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдЕрдирд▓рд╛рдЗрди (рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рд▓реЗрдЦрдХрд▓реЗ рдбрд╛рдЯрд╛рдмреЗрд╕ рдЕрдкрдбреЗрдЯ рдЧрд░реНрди рдмрдиреНрдж рдЧрд░реЗ, рддрд░ рдпреЛ рдЕрдЭреИ рдкрдирд┐ рд╕рд╛рдиреНрджрд░реНрднрд┐рдХ рдЫ)ред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдХреЛрдб 3c5ee2 рдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдирд┐рдореНрди рдЬрд╛рдирдХрд╛рд░реА рдЫ:

Flightradar24 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓

рд╕рдореНрдкрд╛рджрди: рдорд╛ рд▓реЗрдЦрдорд╛ рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВ ICAO рдХреЛрдбрдХреЛ рд╡рд┐рд╡рд░рдг рдердк рд╡рд┐рд╕реНрддреГрддрдорд╛ рджрд┐рдЗрдПрдХреЛ рдЫ, рдо рдЗрдЪреНрдЫреБрдХ рд╡реНрдпрдХреНрддрд┐рд╣рд░реВрд▓рд╛рдИ рдпреЛ рдкрдвреНрди рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫреБред

рддрдереНрдпрд╛рдВрдХ (релрем рд╡рд╛ резрезреи рдмрд┐рдЯ) тАФ рд╣рд╛рдореАрд▓реЗ рдбрд┐рдХреЛрдб рдЧрд░реНрдиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ред рдбреЗрдЯрд╛рдХреЛ рдкрд╣рд┐рд▓реЛ рел рдмрд┐рдЯрд╣рд░реВ рдХреНрд╖реЗрддреНрд░ рд╣реБрдиреН рдкреНрд░рдХрд╛рд░ рдХреЛрдб, рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдПрдХреЛ рдбреЗрдЯрд╛рдХреЛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ (DF рд╕рдБрдЧ рднреНрд░рдорд┐рдд рдирд╣реБрдиреЗ)ред рддреНрдпрд╕реНрддрд╛ рдзреЗрд░реИ рдкреНрд░рдХрд╛рд░рд╣рд░реВ рдЫрдиреН:

Flightradar24 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, 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('#', ''))

рд╣рд╛рд╡рд╛рдорд╛ рдЙрдбреНрдиреЗ рд╕реНрдерд╛рди

рдпрджрд┐ рдирд╛рдо рд╕рд░рд▓ рдЫ рднрдиреЗ, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╣рд░реВ рдЕрдЭ рдЬрдЯрд┐рд▓ рд╣реБрдиреНрдЫрдиреНред рддрд┐рдиреАрд╣рд░реВ реиx, рд╕рдо рд░ рд╡рд┐рд╖рдо рдлреНрд░реЗрдорд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реБрдиреНрдЫрдиреНред рдХреНрд╖реЗрддреНрд░ рдХреЛрдб TC = режрезрежрезрезb = резрезред

Flightradar24 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓

рд╕рдо рд░ рд╡рд┐рд╖рдо рдкреНрдпрд╛рдХреЗрдЯрд╣рд░реВрдХреЛ рдЙрджрд╛рд╣рд░рдг:

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

рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╣рд░реВрдХреЛ рдЧрдгрдирд╛ рдЖрдлреИрдВрдорд╛ рдПрдЙрдЯрд╛ рдЬрдЯрд┐рд▓ рд╕реВрддреНрд░ рдЕрдиреБрд╕рд╛рд░ рд╣реБрдиреНрдЫ:

Flightradar24 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓
(рд╕реНрд░реЛрдд)

рдо GIS рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реЛрдЗрди, рддреНрдпрд╕реИрд▓реЗ рдорд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫреИрди рдпреЛ рдХрд╣рд╛рдБрдмрд╛рдЯ рдЖрдЙрдБрдЫред рдпрджрд┐ рдХрд╕реИрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рднрдиреЗ, рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВрдорд╛ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реНред

рдЙрдЪрд╛рдЗ рдЕрдЭ рд╕рд░рд▓ рд░реВрдкрдорд╛ рдЧрдгрдирд╛ рдЧрд░рд┐рдиреНрдЫ - рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдЯрдХреЛ рдЖрдзрд╛рд░рдорд╛, рдпрд╕рд▓рд╛рдИ реирел рд╡рд╛ резрежреж рдлрд┐рдЯрдХреЛ рдЧреБрдгрдирдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рд╣рд╛рд╡рд╛рдорд╛ рдЙрдбреНрдиреЗ рдЧрддрд┐

TC=резреп рднрдПрдХреЛ рдкреНрдпрд╛рдХреЗрдЯред рдпрд╣рд╛рдБ рд░реЛрдЪрдХ рдХреБрд░рд╛ рдХреЗ рдЫ рднрдиреЗ рдЧрддрд┐ рдпрд╛ рдд рд╕рдЯреАрдХ рд╣реБрди рд╕рдХреНрдЫ, рдЬрдорд┐рдирдХреЛ рд╕рд╛рдкреЗрдХреНрд╖рдорд╛ (рдЬрдорд┐рдирдХреЛ рдЧрддрд┐), рд╡рд╛ рд╣рд╛рд╡рд╛рдХреЛ рдЧрддрд┐, рд╡рд┐рдорд╛рди рд╕реЗрдиреНрд╕рд░ (рдПрдпрд░рд╕реНрдкреАрдб) рджреНрд╡рд╛рд░рд╛ рдорд╛рдкрди рдЧрд░рд┐рдПрдХреЛред рдзреЗрд░реИ рдлрд░рдХ рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рдкрдирд┐ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реБрдиреНрдЫрдиреН:

Flightradar24 - рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ? рднрд╛рдЧ реи, ADS-B рдкреНрд░реЛрдЯреЛрдХрд▓
(рд╕реНрд░реЛрдд)

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

рддрдкрд╛рдИрдВрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, ADS-B рдкреНрд░рд╡рд┐рдзрд┐ рдПрдХ рд░реЛрдЪрдХ рд╕рд╣рдЬреАрд╡рди рдмрдиреЗрдХреЛ рдЫ, рдЬрдм рдХреБрдиреИ рдкрдирд┐ рдорд╛рдирдХ рдкреЗрд╢реЗрд╡рд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рддрд░ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкрдирд┐ рдЙрдкрдпреЛрдЧреА рд╣реБрдиреНрдЫред рддрд░ рдЕрд╡рд╢реНрдп рдкрдирд┐, рдпрд╕рдорд╛ рдореБрдЦреНрдп рднреВрдорд┐рдХрд╛ рдбрд┐рдЬрд┐рдЯрд▓ SDR рд░рд┐рд╕реАрднрд░ рдкреНрд░рд╡рд┐рдзрд┐рдХреЛ рд╕рд╕реНрддреЛрддрд╛рд▓реЗ рдЦреЗрд▓реЗрдХреЛ рдерд┐рдпреЛ, рдЬрд╕рд▓реЗ рдЙрдкрдХрд░рдгрд▓рд╛рдИ рдЧрд┐рдЧрд╛рд╣рд░реНрдЯреНрдЬ рднрдиреНрджрд╛ рдмрдвреА рдлреНрд░рд┐рдХреНрд╡реЗрдиреНрд╕реАрдХрд╛ рд╕рд╛рде рд╕рдВрдХреЗрддрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдпреЛ, рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдкрдорд╛ "рдкреИрд╕рд╛рдХреЛ рд▓рд╛рдЧрд┐"ред

рдЕрд╡рд╢реНрдп рдкрдирд┐, рдорд╛рдирдХрдорд╛ рдиреИ рдзреЗрд░реИ рдХреБрд░рд╛рд╣рд░реВ рдЫрдиреНред рдЪрд╛рд╣рдиреЗрд╣рд░реВрд▓реЗ рдкреГрд╖реНрдардорд╛ PDF рд╣реЗрд░реНрди рд╕рдХреНрдЫрдиреНред ICAO рд╡рд╛ рдорд╛рдерд┐ рдЙрд▓реНрд▓реЗрдЦ рдЧрд░рд┐рдПрдХреЛ рдард╛рдЙрдБрдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН рд╡реЗрдмрд╕рд╛рдЗрдЯ.

рдорд╛рдерд┐ рд▓реЗрдЦрд┐рдПрдХрд╛ рд╕рдмреИ рдХреБрд░рд╛ рдзреЗрд░реИрд▓рд╛рдИ рдЙрдкрдпреЛрдЧреА рд▓рд╛рдЧреНрдиреЗ рд╕рдореНрднрд╛рд╡рдирд╛ рдХрдо рдЫ, рддрд░ рдорд▓рд╛рдИ рдЖрд╢рд╛ рдЫ рдХрд┐ рдпреЛ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреНрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рднрдиреЗ рдХрд╛рдпрдореИ рд░рд╣рдиреЗрдЫред

рдЦреИрд░, рдкрд╛рдЗрдердирдорд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рддрдпрд╛рд░ рдбрд┐рдХреЛрдбрд░ рдЕрд╡рд╕реНрдерд┐рдд рдЫ, рддрдкрд╛рдИрдВ рдпрд╕рд▓рд╛рдИ рдЕрдзреНрдпрдпрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпрд╣рд╛рдБред рд░ 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