āĻšā§āĻ¯āĻžāĻ˛ā§ āĻšāĻžāĻŦāĻ°āĨ¤ āĻ¸āĻŽā§āĻāĻŦāĻ¤ āĻĒā§āĻ°āĻ¤ā§āĻ¯ā§āĻā§ āĻ¯āĻžāĻ°āĻž āĻāĻāĻ¨āĻ āĻŦāĻŋāĻŽāĻžāĻ¨ā§ āĻāĻ¤ā§āĻŽā§āĻ¯āĻŧ āĻŦāĻž āĻŦāĻ¨ā§āĻ§ā§āĻĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻĻā§āĻāĻž āĻāĻ°ā§āĻā§āĻ¨ āĻŦāĻž āĻĻā§āĻā§āĻā§āĻ¨ āĻ¤āĻžāĻ°āĻž āĻŦāĻŋāĻ¨āĻžāĻŽā§āĻ˛ā§āĻ¯ā§ Flightradar24 āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĻā§āĻ¨āĨ¤ āĻ°āĻŋāĻ¯āĻŧā§āĻ˛ āĻāĻžāĻāĻŽā§ āĻŦāĻŋāĻŽāĻžāĻ¨ā§āĻ° āĻ āĻŦāĻ¸ā§āĻĨāĻžāĻ¨ āĻā§āĻ°ā§āĻ¯āĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻā§āĻŦ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻāĻ¨āĻ āĻāĻĒāĻžāĻ¯āĻŧāĨ¤
Đ
ĐŅŅĐžŅиŅ
āĻ¸ā§āĻĒāĻˇā§āĻāĻ¤āĻ, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻĻā§āĻ° āĻ¤āĻžāĻĻā§āĻ° āĻ¸ā§āĻŽāĻžāĻ°ā§āĻāĻĢā§āĻ¨ā§ āĻĻā§āĻāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻŦāĻŋāĻŽāĻžāĻ¨ā§āĻ° āĻĄā§āĻāĻž āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽāĻāĻŋāĻā§ āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ ADS-B (āĻ¸ā§āĻŦāĻ¯āĻŧāĻāĻā§āĻ°āĻŋāĻ¯āĻŧ āĻ¨āĻŋāĻ°ā§āĻāĻ°āĻļā§āĻ˛ āĻ¨āĻāĻ°āĻĻāĻžāĻ°āĻŋâāĻ¸āĻŽā§āĻĒā§āĻ°āĻāĻžāĻ°), āĻāĻŦāĻ āĻāĻāĻŋ āĻ¸ā§āĻŦāĻ¯āĻŧāĻāĻā§āĻ°āĻŋāĻ¯āĻŧāĻāĻžāĻŦā§ āĻŦāĻŋāĻŽāĻžāĻ¨ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻ¤āĻĨā§āĻ¯ āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻā§āĻ¨ā§āĻĻā§āĻ°ā§ āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻ¤ā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧ - āĻāĻ° āĻ¸āĻ¨āĻžāĻā§āĻ¤āĻāĻžāĻ°ā§, āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻā§āĻ, āĻĻāĻŋāĻ, āĻāĻ¤āĻŋ, āĻāĻā§āĻāĻ¤āĻž āĻāĻŦāĻ āĻ āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĄā§āĻāĻž āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻĒā§āĻ°ā§āĻŦā§, āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽā§āĻ° āĻāĻŦāĻŋāĻ°ā§āĻāĻžāĻŦā§āĻ° āĻāĻā§, āĻĒā§āĻ°ā§āĻ°āĻŖāĻāĻžāĻ°ā§ āĻ°āĻžāĻĄāĻžāĻ°ā§ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻāĻāĻŋ āĻŦāĻŋāĻ¨ā§āĻĻā§ āĻĻā§āĻāĻ¤ā§ āĻĒā§āĻ¤āĨ¤ āĻ¯āĻāĻ¨ āĻ āĻ¨ā§āĻ āĻĒā§āĻ˛ā§āĻ¨ āĻāĻŋāĻ˛ āĻ¤āĻāĻ¨ āĻāĻāĻŋ āĻāĻ° āĻ¯āĻĨā§āĻˇā§āĻ āĻāĻŋāĻ˛ āĻ¨āĻžāĨ¤
āĻĒā§āĻ°āĻ¯ā§āĻā§āĻ¤āĻŋāĻāĻ¤āĻāĻžāĻŦā§, ADS-B āĻāĻāĻāĻŋ āĻŦāĻŋāĻŽāĻžāĻ¨ā§ āĻāĻāĻāĻŋ āĻā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻāĻžāĻ° āĻ¨āĻŋāĻ¯āĻŧā§ āĻāĻ āĻŋāĻ¤ āĻ¯āĻž āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧāĻā§āĻ°āĻŽā§ 1090 MHz āĻāĻ° āĻŽā§āĻāĻžāĻŽā§āĻāĻŋ āĻāĻā§āĻ āĻĢā§āĻ°āĻŋāĻā§āĻ¯āĻŧā§āĻ¨ā§āĻ¸āĻŋāĻ¤ā§ āĻ¤āĻĨā§āĻ¯ā§āĻ° āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāĻ¯āĻŧ (āĻ āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻŽā§āĻĄ āĻāĻā§, āĻ¤āĻŦā§ āĻāĻŽāĻ°āĻž āĻ¸ā§āĻā§āĻ˛āĻŋāĻ¤ā§ āĻāĻ¤ āĻāĻā§āĻ°āĻšā§ āĻ¨āĻ, āĻ¯ā§āĻšā§āĻ¤ā§ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻā§āĻāĻā§āĻ˛āĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻāĻžāĻ¨ā§ āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧ)āĨ¤ āĻ āĻŦāĻļā§āĻ¯āĻ, āĻā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻāĻžāĻ° āĻāĻžāĻĄāĻŧāĻžāĻ, āĻŦāĻŋāĻŽāĻžāĻ¨āĻŦāĻ¨ā§āĻĻāĻ°ā§ āĻā§āĻĨāĻžāĻ āĻāĻāĻāĻŋ āĻ°āĻŋāĻ¸āĻŋāĻāĻžāĻ°āĻ āĻ°āĻ¯āĻŧā§āĻā§, āĻ¤āĻŦā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻ¨ā§āĻ¯, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§ āĻšāĻŋāĻ¸āĻžāĻŦā§, āĻāĻŽāĻžāĻĻā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻ°āĻŋāĻ¸āĻŋāĻāĻžāĻ°āĻāĻŋ āĻāĻāĻ°ā§āĻˇāĻŖā§āĻ¯āĻŧāĨ¤
āĻ¯āĻžāĻāĻšā§āĻ, āĻ¤ā§āĻ˛āĻ¨āĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ, Airnav āĻ°āĻžāĻĄāĻžāĻ°āĻŦāĻā§āĻ¸, āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĄāĻŋāĻāĻžāĻāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛, 2007 āĻ¸āĻžāĻ˛ā§ āĻāĻĒāĻ¸ā§āĻĨāĻŋāĻ¤ āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛ āĻāĻŦāĻ āĻāĻ° āĻĻāĻžāĻŽ āĻĒā§āĻ°āĻžāĻ¯āĻŧ $900; āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻžāĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻŦāĻ¸ā§āĻā§āĻ°āĻŋāĻĒāĻļāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦāĻāĻ°ā§ āĻāĻ°āĻ $250 āĻāĻ°āĻ āĻšāĻ¯āĻŧāĨ¤
āĻ¸ā§āĻ āĻĒā§āĻ°āĻĨāĻŽ āĻ°āĻžāĻļāĻŋāĻ¯āĻŧāĻžāĻ¨ āĻŽāĻžāĻ˛āĻŋāĻāĻĻā§āĻ° āĻĒāĻ°ā§āĻ¯āĻžāĻ˛ā§āĻāĻ¨āĻž āĻĢā§āĻ°āĻžāĻŽā§ āĻĒāĻĄāĻŧāĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§
āĻ¸āĻāĻā§āĻ¤ āĻā§āĻ°āĻšāĻŖ
āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻ¸āĻāĻā§āĻ¤ āĻ°ā§āĻāĻ°ā§āĻĄ āĻāĻ°āĻž āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨āĨ¤ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻ¸āĻāĻā§āĻ¤ā§āĻ° āĻ¸āĻŽāĻ¯āĻŧāĻāĻžāĻ˛ āĻŽāĻžāĻ¤ā§āĻ° 120 āĻŽāĻžāĻāĻā§āĻ°ā§āĻ¸ā§āĻā§āĻ¨ā§āĻĄ, āĻ¤āĻžāĻ āĻāĻ° āĻāĻĒāĻžāĻĻāĻžāĻ¨āĻā§āĻ˛āĻŋāĻā§ āĻāĻ°āĻžāĻŽāĻĻāĻžāĻ¯āĻŧāĻāĻāĻžāĻŦā§ āĻŦāĻŋāĻā§āĻāĻŋāĻ¨ā§āĻ¨ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻĒāĻā§āĻˇā§ 5 MHz āĻāĻ° āĻ¸ā§āĻ¯āĻžāĻŽā§āĻĒāĻ˛āĻŋāĻ āĻĢā§āĻ°āĻŋāĻā§āĻ¯āĻŧā§āĻ¨ā§āĻ¸āĻŋ āĻ¸āĻš āĻāĻāĻāĻŋ SDR āĻ°āĻŋāĻ¸āĻŋāĻāĻžāĻ° āĻŦāĻžāĻā§āĻāĻ¨ā§āĻ¯āĻŧāĨ¤
āĻ°ā§āĻāĻ°ā§āĻĄāĻŋāĻāĻ¯āĻŧā§āĻ° āĻĒāĻ°ā§, āĻāĻŽāĻ°āĻž 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()
āĻĢāĻ˛āĻžāĻĢāĻ˛: āĻāĻŽāĻ°āĻž āĻĒāĻāĻā§āĻŽāĻŋāĻ° āĻļāĻŦā§āĻĻā§āĻ° āĻŦāĻŋāĻĒāĻ°ā§āĻ¤ā§ āĻ¸ā§āĻ¸ā§āĻĒāĻˇā§āĻ "āĻĄāĻžāĻ˛" āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻāĨ¤
āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ "āĻĒāĻžāĻ˛āĻ¸" āĻāĻāĻāĻŋ āĻ¸āĻāĻā§āĻ¤, āĻ¯āĻžāĻ° āĻāĻ āĻ¨āĻāĻŋ āĻ¸ā§āĻĒāĻˇā§āĻāĻāĻžāĻŦā§ āĻĻā§āĻļā§āĻ¯āĻŽāĻžāĻ¨ āĻšāĻ¯āĻŧ āĻ¯āĻĻāĻŋ āĻāĻĒāĻ¨āĻŋ āĻā§āĻ°āĻžāĻĢā§ āĻ°ā§āĻā§āĻ˛āĻŋāĻāĻļāĻ¨ āĻŦāĻžāĻĄāĻŧāĻžāĻ¨āĨ¤
āĻāĻĒāĻ¨āĻŋ āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻā§āĻā§āĻ¨, āĻāĻĒāĻ°ā§āĻ° āĻŦāĻ°ā§āĻŖāĻ¨āĻžāĻ¯āĻŧ āĻ¯āĻž āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§āĻā§ āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻāĻŦāĻŋāĻāĻŋ āĻŦā§āĻļ āĻ¸āĻžāĻŽāĻā§āĻāĻ¸ā§āĻ¯āĻĒā§āĻ°ā§āĻŖāĨ¤ āĻāĻĒāĻ¨āĻŋ āĻĄā§āĻāĻž āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ°āĻŖ āĻļā§āĻ°ā§ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨āĨ¤
āĻĄāĻŋāĻā§āĻĄāĻŋāĻ
āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻāĻĒāĻ¨āĻŋ āĻāĻāĻāĻŋ āĻŦāĻŋāĻ āĻ¸ā§āĻā§āĻ°āĻŋāĻŽ āĻĒā§āĻ¤ā§ āĻšāĻŦā§. āĻ¸āĻāĻā§āĻ¤ āĻ¨āĻŋāĻā§āĻ āĻŽā§āĻ¯āĻžāĻ¨āĻā§āĻ¸ā§āĻāĻžāĻ° āĻāĻ¨āĻā§āĻĄāĻŋāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻ¨āĻā§āĻĄ āĻāĻ°āĻž āĻšāĻ¯āĻŧ:
āĻ¨āĻŋāĻŦāĻ˛ā§āĻ° āĻ¸ā§āĻ¤āĻ°ā§āĻ° āĻĒāĻžāĻ°ā§āĻĨāĻā§āĻ¯ āĻĨā§āĻā§ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦ "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"
āĻ¸āĻāĻā§āĻ¤ā§āĻ° āĻāĻ āĻ¨ āĻ¨āĻŋāĻā§āĻ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§āĻĒ:
āĻāĻ¸ā§āĻ¨ āĻāĻ°āĻ āĻŦāĻŋāĻļāĻĻā§ āĻā§āĻˇā§āĻ¤ā§āĻ°āĻā§āĻ˛āĻŋ āĻĻā§āĻā§āĻ¨āĨ¤
DF (āĻĄāĻžāĻāĻ¨āĻ˛āĻŋāĻāĻ āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻ, 5 āĻŦāĻŋāĻ) - āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻ§āĻ°āĻ¨ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻāĻ°ā§āĨ¤ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻ§āĻ°āĻ¨ā§āĻ° āĻāĻā§:
āĻāĻŽāĻ°āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° DF17 āĻāĻžāĻāĻĒ āĻāĻ°āĻ¤ā§ āĻāĻā§āĻ°āĻšā§, āĻāĻžāĻ°āĻŖ... āĻāĻāĻŋāĻ āĻŦāĻŋāĻŽāĻžāĻ¨ā§āĻ° āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻā§āĻ āĻ§āĻžāĻ°āĻŖ āĻāĻ°ā§āĨ¤
āĻāĻāĻ¸āĻŋāĻāĻ (24 āĻŦāĻŋāĻ) - āĻŦāĻŋāĻŽāĻžāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¤āĻ°ā§āĻāĻžāĻ¤āĻŋāĻ āĻ
āĻ¨āĻ¨ā§āĻ¯ āĻā§āĻĄāĨ¤ āĻāĻĒāĻ¨āĻŋ āĻ¤āĻžāĻ° āĻā§āĻĄ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ˛ā§āĻ¨ āĻā§āĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨
āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨āĻž: āĻāĻ¨
āĻ¤āĻĨā§āĻ¯ (56 āĻŦāĻž 112 āĻŦāĻŋāĻ) - āĻĒā§āĻ°āĻā§āĻ¤ āĻĄā§āĻāĻž āĻ¯āĻž āĻāĻŽāĻ°āĻž āĻĄāĻŋāĻā§āĻĄ āĻāĻ°āĻŦāĨ¤ āĻĄā§āĻāĻžāĻ° āĻĒā§āĻ°āĻĨāĻŽ 5 āĻŦāĻŋāĻ āĻšāĻ˛ āĻĢāĻŋāĻ˛ā§āĻĄ āĻāĻžāĻāĻĒ āĻā§āĻĄ, āĻ¸āĻāĻ°āĻā§āĻˇāĻŋāĻ¤ āĻĄā§āĻāĻžāĻ° āĻ¸āĻžāĻŦāĻāĻžāĻāĻĒ āĻ°āĻ¯āĻŧā§āĻā§ (DF āĻāĻ° āĻ¸āĻžāĻĨā§ āĻŦāĻŋāĻā§āĻ°āĻžāĻ¨ā§āĻ¤ āĻšāĻŦā§āĻ¨ āĻ¨āĻž)āĨ¤ āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻŦā§āĻļ āĻāĻ¯āĻŧā§āĻāĻāĻŋ āĻāĻā§:
āĻāĻ¸ā§āĻ¨ āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻāĻ¯āĻŧā§āĻāĻāĻŋ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻĻā§āĻāĻŋāĨ¤
āĻŦāĻŋāĻŽāĻžāĻ¨ āĻļāĻ¨āĻžāĻā§āĻ¤āĻāĻ°āĻŖ
āĻŦāĻžāĻāĻ¨āĻžāĻ°āĻŋ āĻāĻāĻžāĻ°ā§ āĻāĻĻāĻžāĻšāĻ°āĻŖ:
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āĨ¤
āĻā§āĻĄāĻŧ āĻāĻŦāĻ āĻŦāĻŋāĻā§āĻĄāĻŧ āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖ:
01011 000 000101110110 00 10111000111001000 10000110101111001
01011 000 000110010000 01 10010011110000110 10000011110001000
āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻā§āĻā§āĻ° āĻāĻŖāĻ¨āĻž āĻ¨āĻŋāĻā§āĻ āĻāĻāĻāĻŋ āĻāĻāĻŋāĻ˛ āĻ¸ā§āĻ¤ā§āĻ° āĻ āĻ¨ā§āĻ¸āĻžāĻ°ā§ āĻāĻā§:
āĻāĻŽāĻŋ āĻāĻāĻāĻ¨ GIS āĻŦāĻŋāĻļā§āĻˇāĻā§āĻ āĻ¨āĻ, āĻ¤āĻžāĻ āĻāĻŽāĻŋ āĻāĻžāĻ¨āĻŋ āĻ¨āĻž āĻāĻāĻŋ āĻā§āĻĨāĻž āĻĨā§āĻā§ āĻāĻ¸ā§āĻā§āĨ¤ āĻā§ āĻāĻžāĻ¨ā§, āĻāĻŽā§āĻ¨ā§āĻā§ āĻ˛āĻŋāĻā§āĻ¨āĨ¤
āĻāĻā§āĻāĻ¤āĻž āĻ¸āĻšāĻ āĻŦāĻ˛ā§ āĻŽāĻ¨ā§ āĻāĻ°āĻž āĻšāĻ¯āĻŧ - āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻŦāĻŋāĻā§āĻ° āĻāĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻāĻ° āĻāĻ°ā§, āĻāĻāĻŋāĻā§ 25 āĻŦāĻž 100 āĻĢā§āĻā§āĻ° āĻāĻāĻžāĻ§āĻŋāĻ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻāĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
āĻŦāĻžāĻ¯āĻŧā§āĻŦāĻžāĻšāĻŋāĻ¤ āĻŦā§āĻ
TC=19 āĻ¸āĻš āĻĒā§āĻ¯āĻžāĻā§āĻāĨ¤ āĻāĻāĻžāĻ¨ā§ āĻŽāĻāĻžāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻšāĻ˛ āĻ¯ā§ āĻāĻ¤āĻŋ āĻšāĻ¯āĻŧ āĻ¨āĻŋāĻ°ā§āĻā§āĻ˛ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻ¸ā§āĻĨāĻ˛ā§āĻ° āĻ¸āĻžāĻĒā§āĻā§āĻˇā§ (āĻā§āĻ°āĻžāĻāĻ¨ā§āĻĄ āĻ¸ā§āĻĒā§āĻĄ), āĻŦāĻž āĻŦāĻžāĻ¯āĻŧā§āĻŦāĻžāĻšāĻŋāĻ¤, āĻāĻāĻāĻŋ āĻŦāĻŋāĻŽāĻžāĻ¨ āĻ¸ā§āĻ¨ā§āĻ¸āĻ° (āĻāĻ¯āĻŧāĻžāĻ°āĻ¸ā§āĻĒāĻŋāĻĄ) āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒāĻ°āĻŋāĻŽāĻžāĻĒ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ āĻ¨ā§āĻāĻā§āĻ˛āĻŋ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻā§āĻˇā§āĻ¤ā§āĻ°āĻ āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧ:
āĻāĻĒāĻ¸āĻāĻšāĻžāĻ°
āĻāĻĒāĻ¨āĻŋ āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻā§āĻā§āĻ¨, 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