Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓

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

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓

╨Т рдкрд╣рд▓реЗ рднрд╛рдЧ рдРрд╕реА рдСрдирд▓рд╛рдЗрди рд╕реЗрд╡рд╛ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЕрдм рд╣рдо рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рд╡рд┐рдорд╛рди рд╕реЗ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рд╕реНрдЯреЗрд╢рди рдкрд░ рдХреМрди рд╕рд╛ рдбреЗрдЯрд╛ рднреЗрдЬрд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдпрдВ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХрд╣рд╛рдиреА

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╡рд┐рдорд╛рди рдбреЗрдЯрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдирдХреЗ рд╕реНрдорд╛рд░реНрдЯрдлрд╝реЛрди рдкрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдбреАрдПрд╕-рдмреА (рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЖрд╢реНрд░рд┐рдд рдирд┐рдЧрд░рд╛рдиреА-рдкреНрд░рд╕рд╛рд░рдг) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рдХреЗрдВрджреНрд░ рддрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рджрд┐рд╢рд╛, рдЧрддрд┐, рдКрдВрдЪрд╛рдИ рдФрд░ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ, рдРрд╕реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдЖрдЧрдорди рд╕реЗ рдкрд╣рд▓реЗ, рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗрд╡рд▓ рд░рдбрд╛рд░ рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ред рдЬрдм рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдорд╛рди рдереЗ рддреЛ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдерд╛ред

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

рд╡реИрд╕реЗ, рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдмрддрд╛ рджреЗрдВ рдХрд┐ рдЖрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкрд╣рд▓рд╛ рдРрд╕рд╛ рд╕рд┐рд╕реНрдЯрдо, рдПрдпрд░рдиреИрд╡ рд░рдбрд╛рд░рдмреЙрдХреНрд╕, 2007 рдореЗрдВ рдЖрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рдХреА рдХреАрдордд рд▓рдЧрднрдЧ 900 рдбреЙрд▓рд░ рдереАред 250$ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рд╢реБрд▓реНрдХ рдкреНрд░рддрд┐ рд╡рд░реНрд╖ рд╣реЛрддрд╛ рд╣реИред

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рдЙрди рдкрд╣рд▓реЗ рд░реВрд╕реА рдорд╛рд▓рд┐рдХреЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛рдПрдБ рдордВрдЪ рдкрд░ рдкрдврд╝реА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рд░реЗрдбрд┐рдпреЛрд╕реНрдХреИрдирд░. рдЕрдм рдЬрдмрдХрд┐ рдЖрд░рдЯреАрдПрд▓-рдПрд╕рдбреАрдЖрд░ рд░рд┐рд╕реАрд╡рд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЧрдП рд╣реИрдВ, рдПрдХ рд╕рдорд╛рди рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ $30 рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ рдереА рдкрд╣рд▓реЗ рднрд╛рдЧ. рдЖрдЗрдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рд╣реА рдЖрдЧреЗ рдмрдврд╝реЗрдВ - рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреВрд░реЗ рд╕рд┐рдЧреНрдирд▓ рдХреА рдЕрд╡рдзрд┐ рдХреЗрд╡рд▓ 120 рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдЖрд░рд╛рдо рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдо рд╕реЗ рдХрдо 5 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдХреА рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рд╡рд╛рд▓рд╛ рдПрдХ рдПрд╕рдбреАрдЖрд░ рд░рд┐рд╕реАрд╡рд░ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ 5000000 рдирдореВрдиреЛрдВ/рд╕реЗрдХрдВрдб рдХреА рдирдореВрдирд╛ рджрд░ рдХреЗ рд╕рд╛рде рдПрдХ WAV рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ; рдРрд╕реА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ 30 рд╕реЗрдХрдВрдб рдХрд╛ рд╡рдЬрди рд▓рдЧрднрдЧ 500 рдПрдордмреА рд╣реЛрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдореАрдбрд┐рдпрд╛ рдкреНрд▓реЗрдпрд░ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рд╕реБрдирдирд╛ рдмреЗрдХрд╛рд░ рд╣реИ - рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдзреНрд╡рдирд┐ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕реАрдзреЗ рдбрд┐рдЬреАрдЯрд▓ рд░реЗрдбрд┐рдпреЛ рд╕рд┐рдЧреНрдирд▓ рд╣реИ - рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбрд┐рдлрд╛рдЗрдВрдб рд░реЗрдбрд┐рдпреЛ рдареАрдХ рдЗрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рдо Python рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓реЗрдВрдЧреЗ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗред рдЬреЛ рд▓реЛрдЧ рд╕реНрд╡рдпрдВ рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ╨┐╨╛ ╤Б╤Б╤Л╨╗╨║╨╡.

рдЖрдЗрдП рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИред

from scipy.io import wavfile
import matplotlib.pyplot as plt
import numpy as np

fs, data = wavfile.read("adsb_20190311_191728Z_1090000kHz_RF.wav")
data = data.astype(float)
I, Q = data[:, 0], data[:, 1]
A = np.sqrt(I*I + Q*Q)

plt.plot(A)
plt.show()

рдкрд░рд┐рдгрд╛рдо: рд╣рдо рдкреГрд╖реНрдарднреВрдорд┐ рд╢реЛрд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╕реНрдкрд╖реНрдЯ "рд╕реНрдкрдВрджрди" рджреЗрдЦрддреЗ рд╣реИрдВред

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рдкреНрд░рддреНрдпреЗрдХ "рдкрд▓реНрд╕" рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ, рдЬрд┐рд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдЧреНрд░рд╛рдлрд╝ рдкрд░ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрдврд╝рд╛рдиреЗ рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЪрд┐рддреНрд░ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╡рд┐рд╡рд░рдг рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЖрдк рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.

рдбрд┐рдХреЛрдбрд┐рдВрдЧ

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

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рдирд┐рдмрд▓реНрд╕ рдХреЗ рд╕реНрддрд░ рдХреЗ рдЕрдВрддрд░ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ "0" рдФрд░ "1" рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

    bits_str = ""
    for p in range(8):
        pos = start_data + bit_len*p
        p1, p2 = A[pos: pos + bit_len/2], A[pos + bit_len/2: pos + bit_len]
        avg1, avg2 = np.average(p1), np.average(p2)
        if avg1 < avg2:
            bits_str += "0"
        elif avg1 > avg2:
            bits_str += "1"

рд╕рд┐рдЧреНрдирд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕реНрд╡рдпрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рдЖрдЗрдП рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВред

DF (рдбрд╛рдЙрдирд▓рд┐рдВрдХ рдкреНрд░рд╛рд░реВрдк, 5 рдмрд┐рдЯреНрд╕) - рд╕рдВрджреЗрд╢ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ:

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓
(рддрд╛рд▓рд┐рдХрд╛ рд╕реНрд░реЛрдд)

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

рдЖрдИрд╕реАрдПрдУ (24 рдмрд┐рдЯреНрд╕) - рд╡рд┐рдорд╛рди рдХрд╛ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдп рдЕрджреНрд╡рд┐рддреАрдп рдХреЛрдбред рдЖрдк рдкреНрд▓реЗрди рдХреЛ рдЙрд╕рдХреЗ рдХреЛрдб рд╕реЗ рдЪреЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдСрдирд▓рд╛рдЗрди (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд▓реЗрдЦрдХ рдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб 3c5ee2 рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИ:

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореЗрдВ рд▓реЗрдЦ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдЖрдИрд╕реАрдПрдУ рдХреЛрдб рдХрд╛ рд╡рд┐рд╡рд░рдг рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рдЗрд╕реЗ рдкрдврд╝реЗрдВред

рдЖрдВрдХрдбрд╝реЗ (56 рдпрд╛ 112 рдмрд┐рдЯреНрд╕) - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдЬрд┐рд╕реЗ рд╣рдо рдбрд┐рдХреЛрдб рдХрд░реЗрдВрдЧреЗред рдбреЗрдЯрд╛ рдХреЗ рдкрд╣рд▓реЗ 5 рдмрд┐рдЯ рдлрд╝реАрд▓реНрдб рд╣реИрдВ рдкреНрд░рдХрд╛рд░ рдХреЛрдб, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИ (рдбреАрдПрдл рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рдлреА рдХреБрдЫ рд╣реИрдВ:

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓
(рддрд╛рд▓рд┐рдХрд╛ рд╕реНрд░реЛрдд)

рдЖрдЗрдП рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред

рд╡рд┐рдорд╛рди рдХреА рдкрд╣рдЪрд╛рди

рдмрд╛рдЗрдирд░реА рд░реВрдк рдореЗрдВ рдЙрджрд╛рд╣рд░рдг:

00100 011 000101 010111 000111 110111 110001 111000

рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб:

+------+------+------+------+------+------+------+------+------+------+
| TC,5 | EC,3 | C1,6 | C2,6 | C3,6 | C4,6 | C5,6 | C6,6 | C7,6 | C8,6 |
+------+------+------+------+------+------+------+------+------+------+

рдЯреАрд╕реА = 00100рдмреА = 4, рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рд╕реА1-рд╕реА8 рдореЗрдВ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдХреЛрдб рд╣реЛрддреЗ рд╣реИрдВ:
#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, рд╕рдо рдФрд░ рд╡рд┐рд╖рдо рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдлрд╝реАрд▓реНрдб рдХреЛрдб рдЯреАрд╕реА = 01011рдмреА = 11.

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рд╕рдо рдФрд░ рд╡рд┐рд╖рдо рдкреИрдХреЗрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

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

рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рд╕реНрд╡рдпрдВ рдПрдХ рдкреЗрдЪреАрджрд╛ рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реЛрддреА рд╣реИ:

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓
(рд╕реНрд░реЛрдд)

рдореИрдВ рдЬреАрдЖрдИрдПрд╕ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИред рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред

рдКрдВрдЪрд╛рдИ рдХреЛ рд╕рд░рд▓ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрд╕реЗ 25 рдпрд╛ 100 рдлреАрдЯ рдХреЗ рдЧреБрдгрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╛рдпреБрдЬрдирд┐рдд рд╡реЗрдЧ

рдЯреАрд╕реА=19 рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЬред рдпрд╣рд╛рдВ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЧрддрд┐ рдпрд╛ рддреЛ рд╕рдЯреАрдХ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрдореАрди рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ (рдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдкреАрдб), рдпрд╛ рд╣рд╡рд╛рдИ, рдПрдХ рд╡рд┐рдорд╛рди рд╕реЗрдВрд╕рд░ (рдПрдпрд░рд╕реНрдкреАрдб) рджреНрд╡рд╛рд░рд╛ рдорд╛рдкреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░ рднреА рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ:

Flightradar24 - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ 2, рдПрдбреАрдПрд╕-рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓
(рд╕реНрд░реЛрдд)

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

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдбреАрдПрд╕-рдмреА рддрдХрдиреАрдХ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╣рдЬреАрд╡рди рдмрди рдЧрдИ рд╣реИ, рдЬрдм рдПрдХ рдорд╛рдирдХ рди рдХреЗрд╡рд▓ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдЖрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдбрд┐рдЬрд┐рдЯрд▓ рдПрд╕рдбреАрдЖрд░ рд░рд┐рд╕реАрд╡рд░ рдХреА рд╕рд╕реНрддреА рддрдХрдиреАрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рднрд╛рдИ рдЧрдИ рдереА, рдЬреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ "рдкреИрд╕реЗ рдХреЗ рд▓рд┐рдП" рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬрд╝ рд╕реЗ рдКрдкрд░ рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рдмреЗрд╢рдХ, рдорд╛рдирдХ рдореЗрдВ рд╣реА рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реИред рдЗрдЪреНрдЫреБрдХ рд▓реЛрдЧ рдкреЗрдЬ рдкрд░ рдкреАрдбреАрдПрдл рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЖрдИрд╕реАрдПрдУ рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдкрд░ рдЬрд╛рдПрдБ рд╡реЗрдмрд╕рд╛рдЗрдЯ.

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

рд╡реИрд╕реЗ, 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

DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрд╡рд░ рд╡рд╛рд▓реА рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реАрджреЗрдВ ЁЯФе рдбреАрдбреАрдУрдПрд╕ рд╕реБрд░рдХреНрд╖рд╛, рд╡реАрдкреАрдПрд╕ рдФрд░ рд╡реАрдбреАрдПрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реАрджреЗрдВ | ProHoster