āĻšā§āϝāĻžāϞ⧠āĻšāĻžāĻŦāϰāĨ¤ āϏāĻŽā§āĻāĻŦāϤ āĻĒā§āϰāϤā§āϝā§āĻā§ āϝāĻžāϰāĻž āĻāĻāύāĻ āĻŦāĻŋāĻŽāĻžāύ⧠āĻāϤā§āĻŽā§āϝāĻŧ āĻŦāĻž āĻŦāύā§āϧā§āĻĻā§āϰ āϏāĻžāĻĨā§ āĻĻā§āĻāĻž āĻāϰā§āĻā§āύ āĻŦāĻž āĻĻā§āĻā§āĻā§āύ āϤāĻžāϰāĻž āĻŦāĻŋāύāĻžāĻŽā§āϞā§āϝ⧠Flightradar24 āĻĒāϰāĻŋāώā§āĻŦāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĻā§āύāĨ¤ āϰāĻŋāϝāĻŧā§āϞ āĻāĻžāĻāĻŽā§ āĻŦāĻŋāĻŽāĻžāύā§āϰ āĻ āĻŦāϏā§āĻĨāĻžāύ āĻā§āϰā§āϝāĻžāĻ āĻāϰāĻžāϰ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻā§āĻŦ āϏā§āĻŦāĻŋāϧāĻžāĻāύāĻ āĻāĻĒāĻžāϝāĻŧāĨ¤

Đ āĻāĻ āϧāϰāύā§āϰ āĻāĻāĻāĻŋ āĻ
āύāϞāĻžāĻāύ āĻĒāϰāĻŋāώā§āĻŦāĻžāϰ āĻ
āĻĒāĻžāϰā§āĻāĻŋāĻ āύā§āϤāĻŋ āĻŦāϰā§āĻŖāύāĻž āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ āĻāĻŽāϰāĻž āĻāĻāύ āĻāĻāĻŋāϝāĻŧā§ āϝāĻžāĻŦ āĻāĻŦāĻ āĻĒāĻžāĻāĻĨāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦāĻŋāĻŽāĻžāύ āĻĨā§āĻā§ āϰāĻŋāϏāĻŋāĻāĻŋāĻ āϏā§āĻā§āĻļāύ⧠āĻā§ āĻĄā§āĻāĻž āĻĒāĻžāĻ āĻžāύ⧠āĻāĻŦāĻ āĻā§āϰāĻšāĻŖ āĻāϰāĻž āĻšāĻā§āĻā§ āϤāĻž āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰāĻŦ āĻāĻŦāĻ āύāĻŋāĻā§āϰāĻžāĻ āĻĄāĻŋāĻā§āĻĄāĻŋāĻ āĻāϰāĻŦāĨ¤
ĐŅŅĐžŅиŅ
āϏā§āĻĒāώā§āĻāϤāĻ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϤāĻžāĻĻā§āϰ āϏā§āĻŽāĻžāϰā§āĻāĻĢā§āύ⧠āĻĻā§āĻāĻžāϰ āĻāύā§āϝ āĻŦāĻŋāĻŽāĻžāύā§āϰ āĻĄā§āĻāĻž āĻĒā§āϰā§āϰāĻŖ āĻāϰāĻž āĻšāϝāĻŧ āύāĻžāĨ¤ āϏāĻŋāϏā§āĻā§āĻŽāĻāĻŋāĻā§ āĻŦāϞāĻž āĻšāϝāĻŧ ADS-B (āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧ āύāĻŋāϰā§āĻāϰāĻļā§āϞ āύāĻāϰāĻĻāĻžāϰāĻŋâāϏāĻŽā§āĻĒā§āϰāĻāĻžāϰ), āĻāĻŦāĻ āĻāĻāĻŋ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āĻŦāĻŋāĻŽāĻžāύ āϏāĻŽā§āĻĒāϰā§āĻā§ āϤāĻĨā§āϝ āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻā§āύā§āĻĻā§āϰ⧠āĻĒā§āϰā§āϰāĻŖ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ - āĻāϰ āϏāύāĻžāĻā§āϤāĻāĻžāϰā§, āϏā§āĻĨāĻžāύāĻžāĻā§āĻ, āĻĻāĻŋāĻ, āĻāϤāĻŋ, āĻāĻā§āĻāϤāĻž āĻāĻŦāĻ āĻ āύā§āϝāĻžāύā§āϝ āĻĄā§āĻāĻž āĻĒā§āϰā§āϰāĻŖ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻĒā§āϰā§āĻŦā§, āĻāĻ āϧāϰāύā§āϰ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻāĻŦāĻŋāϰā§āĻāĻžāĻŦā§āϰ āĻāĻā§, āĻĒā§āϰā§āϰāĻŖāĻāĻžāϰ⧠āϰāĻžāĻĄāĻžāϰ⧠āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻŋ āĻŦāĻŋāύā§āĻĻā§ āĻĻā§āĻāϤ⧠āĻĒā§āϤāĨ¤ āϝāĻāύ āĻ āύā§āĻ āĻĒā§āϞā§āύ āĻāĻŋāϞ āϤāĻāύ āĻāĻāĻŋ āĻāϰ āϝāĻĨā§āώā§āĻ āĻāĻŋāϞ āύāĻžāĨ¤
āĻĒā§āϰāϝā§āĻā§āϤāĻŋāĻāϤāĻāĻžāĻŦā§, ADS-B āĻāĻāĻāĻŋ āĻŦāĻŋāĻŽāĻžāύ⧠āĻāĻāĻāĻŋ āĻā§āϰāĻžāύā§āϏāĻŽāĻŋāĻāĻžāϰ āύāĻŋāϝāĻŧā§ āĻāĻ āĻŋāϤ āϝāĻž āĻĒāϰā§āϝāĻžāϝāĻŧāĻā§āϰāĻŽā§ 1090 MHz āĻāϰ āĻŽā§āĻāĻžāĻŽā§āĻāĻŋ āĻāĻā§āĻ āĻĢā§āϰāĻŋāĻā§āϝāĻŧā§āύā§āϏāĻŋāϤ⧠āϤāĻĨā§āϝā§āϰ āĻĒā§āϝāĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāϝāĻŧ (āĻ āύā§āϝāĻžāύā§āϝ āĻŽā§āĻĄ āĻāĻā§, āϤāĻŦā§ āĻāĻŽāϰāĻž āϏā§āĻā§āϞāĻŋāϤ⧠āĻāϤ āĻāĻā§āϰāĻšā§ āύāĻ, āϝā§āĻšā§āϤ⧠āϏā§āĻĨāĻžāύāĻžāĻā§āĻāĻā§āϞāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻžāύ⧠āĻĒā§āϰā§āϰāĻŖ āĻāϰāĻž āĻšāϝāĻŧ)āĨ¤ āĻ āĻŦāĻļā§āϝāĻ, āĻā§āϰāĻžāύā§āϏāĻŽāĻŋāĻāĻžāϰ āĻāĻžāĻĄāĻŧāĻžāĻ, āĻŦāĻŋāĻŽāĻžāύāĻŦāύā§āĻĻāϰ⧠āĻā§āĻĨāĻžāĻ āĻāĻāĻāĻŋ āϰāĻŋāϏāĻŋāĻāĻžāϰāĻ āϰāϝāĻŧā§āĻā§, āϤāĻŦā§ āĻāĻŽāĻžāĻĻā§āϰ āĻāύā§āϝ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻšāĻŋāϏāĻžāĻŦā§, āĻāĻŽāĻžāĻĻā§āϰ āύāĻŋāĻāϏā§āĻŦ āϰāĻŋāϏāĻŋāĻāĻžāϰāĻāĻŋ āĻāĻāϰā§āώāĻŖā§āϝāĻŧāĨ¤
āĻĒā§āϰāϏāĻā§āĻāϤ, āϤā§āϞāύāĻžāϰ āĻāύā§āϝ āĻŦāϞāĻž āϝāĻžāϝāĻŧ, āϏāĻžāϧāĻžāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāύā§āϝ āϤā§āϰāĻŋ āĻĒā§āϰāĻĨāĻŽ āĻāĻ āϧāϰāύā§āϰ āϏāĻŋāϏā§āĻā§āĻŽ, āĻāϝāĻŧāĻžāϰāύāĻžāĻ āϰāĻžāĻĄāĻžāϰāĻŦāĻā§āϏ, ⧍ā§Ļā§Ļā§ āϏāĻžāϞ⧠āĻŦāĻžāĻāĻžāϰ⧠āĻāϏ⧠āĻāĻŦāĻ āĻāϰ āĻĻāĻžāĻŽ āĻāĻŋāϞ āĻĒā§āϰāĻžāϝāĻŧ ⧝ā§Ļā§Ļ āĻĄāϞāĻžāϰāĨ¤ 250$ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻĒāϰāĻŋāώā§āĻŦāĻžāϰ āϏāĻžāĻŦāϏā§āĻā§āϰāĻŋāĻĒāĻļāύā§āϰ āĻāύā§āϝ āĻĒā§āϰāϤāĻŋ āĻŦāĻāϰ āĻāϰāĻ āĻšāϝāĻŧāĨ¤

āϏā§āĻ āĻĒā§āϰāĻĨāĻŽ āϰāĻžāĻļāĻŋāϝāĻŧāĻžāύ āĻŽāĻžāϞāĻŋāĻāĻĻā§āϰ āĻĒāϰā§āϝāĻžāϞā§āĻāύāĻž āĻĢā§āϰāĻžāĻŽā§ āĻĒāĻĄāĻŧāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠. āĻāĻāύ āϝā§āĻšā§āϤ⧠RTL-SDR āϰāĻŋāϏāĻŋāĻāĻžāϰāĻā§āϞāĻŋ āĻŦā§āϝāĻžāĻĒāĻāĻāĻžāĻŦā§ āĻāĻĒāϞāĻŦā§āϧ āĻšāϝāĻŧā§ āĻāĻ ā§āĻā§, āĻ
āύā§āϰā§āĻĒ āĻāĻāĻāĻŋ āĻĄāĻŋāĻāĻžāĻāϏ $30 āĻāϰ āĻāύā§āϝ āĻāĻāϤā§āϰāĻŋāϤ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§; āĻāĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻāĻŋāĻā§ āĻāĻŋāϞ . āĻāϏā§āύ āĻĒā§āϰā§āĻā§āĻāϞā§āϰ āĻĻāĻŋāĻā§ āĻāĻāĻŋāϝāĻŧā§ āϝāĻžāĻ - āĻāϏā§āύ āĻĻā§āĻāĻŋ āĻāĻāĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§āĨ¤
āϏāĻāĻā§āϤ āĻā§āϰāĻšāĻŖ
āĻĒā§āϰāĻĨāĻŽāϤ, āϏāĻāĻā§āϤ āϰā§āĻāϰā§āĻĄ āĻāϰāĻž āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āϏāĻāĻā§āϤā§āϰ āϏāĻŽāϝāĻŧāĻāĻžāϞ āĻŽāĻžāϤā§āϰ 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 āĻŦāĻŋāĻ) - āĻŦāĻŋāĻŽāĻžāύā§āϰ āĻāύā§āϤāϰā§āĻāĻžāϤāĻŋāĻ āĻ āύāύā§āϝ āĻā§āĻĄāĨ¤ āĻāĻĒāύāĻŋ āϤāĻžāϰ āĻā§āĻĄ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϞā§āύ āĻā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ (āĻĻā§āϰā§āĻāĻžāĻā§āϝāĻŦāĻļāϤ, āϞā§āĻāĻ āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻāĻĒāĻĄā§āĻ āĻāϰāĻž āĻŦāύā§āϧ āĻāϰā§āĻā§āύ, āĻāĻŋāύā§āϤ⧠āĻāĻāĻŋ āĻāĻāύāĻ āĻĒā§āϰāĻžāϏāĻā§āĻāĻŋāĻ)āĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻā§āĻĄ 3c5ee2 āĻāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āϤāĻĨā§āϝ āϰāϝāĻŧā§āĻā§:

āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž: āĻāύ ICAO āĻā§āĻĄā§āϰ āĻŦāĻŋāĻŦāϰāĻŖ āĻāϰāĻ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤāĻāĻžāĻŦā§ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧā§āĻā§; āĻāĻŽāĻŋ āϏā§āĻĒāĻžāϰāĻŋāĻļ āĻāϰāĻāĻŋ āϝ⧠āϝāĻžāϰāĻž āĻāĻā§āϰāĻšā§ āϤāĻžāϰāĻž āĻāĻāĻŋ āĻĒāĻĄāĻŧāĻŦā§āύāĨ¤
āϤāĻĨā§āϝ (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 āĻĒā§āϰāϝā§āĻā§āϤāĻŋ āĻāĻāĻāĻŋ āĻāĻāϰā§āώāĻŖā§āϝāĻŧ āϏāĻŋāĻŽā§āĻŦāĻŋāĻāϏāĻŋāϏ āĻšāϝāĻŧā§ āĻāĻ ā§āĻā§, āϝāĻāύ āĻāĻāĻāĻŋ āĻŽāĻžāύ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĒā§āĻļāĻžāĻĻāĻžāϰāĻĻā§āϰ āĻāύā§āϝāĻ āύāϝāĻŧ, āϏāĻžāϧāĻžāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāύā§āϝāĻ āĻĻāϰāĻāĻžāϰā§āĨ¤ āϤāĻŦā§ āĻ āĻŦāĻļā§āϝāĻ, āĻĄāĻŋāĻāĻŋāĻāĻžāϞ āĻāϏāĻĄāĻŋāĻāϰ āϰāĻŋāϏāĻŋāĻāĻžāϰāĻā§āϞāĻŋāϰ āϏāϏā§āϤāĻž āĻĒā§āϰāϝā§āĻā§āϤāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āĻāϤ⧠āĻāĻāĻāĻŋ āĻŽā§āϞ āĻā§āĻŽāĻŋāĻāĻž āĻĒāĻžāϞāύ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ, āϝāĻž āĻĄāĻŋāĻāĻžāĻāϏāĻāĻŋāĻā§ āĻāĻā§āώāϰāĻŋāĻ āĻ āϰā§āĻĨā§ "āĻĒā§āύāĻŋāϏā§āϰ āĻāύā§āϝ" āĻāĻŋāĻāĻžāĻšāĻžāϰā§āĻāĻā§āϰ āĻāĻĒāϰ⧠āĻĢā§āϰāĻŋāĻā§āϝāĻŧā§āύā§āϏāĻŋ āϏāĻš āϏāĻāĻā§āϤ āĻā§āϰāĻšāĻŖ āĻāϰāϤ⧠āĻĻā§āϝāĻŧāĨ¤
āĻŽāĻžāύ āύāĻŋāĻā§āĻ, āĻ āĻŦāĻļā§āϝāĻ, āĻāϰ⧠āĻ āύā§āĻ āĻāĻŋāĻā§ āĻāĻā§. āϝāĻžāϰāĻž āĻāĻā§āϰāĻšā§ āϤāĻžāϰāĻž āĻĒā§āĻā§ āĻĒāĻŋāĻĄāĻŋāĻāĻĢ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰā§āύ āĻ āĻĨāĻŦāĻž āĻāϤāĻŋāĻŽāϧā§āϝ⧠āĻāĻĒāϰ⧠āĻāϞā§āϞāĻŋāĻāĻŋāϤ āĻāĻāĻāĻŋ āĻĻā§āĻā§āύ .
āĻāĻāĻŋ āĻ āϏāĻŽā§āĻāĻžāĻŦā§āϝ āϝ⧠āĻāĻĒāϰā§āϰ āϏāĻŽāϏā§āϤāĻā§āϞāĻŋ āĻ āύā§āĻā§āϰ āĻĒāĻā§āώ⧠āĻāĻžāϰā§āϝāĻāϰ āĻšāĻŦā§, āϤāĻŦā§ āĻāĻāĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰ⧠āϏ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻŽāĻĒāĻā§āώ⧠āϏāĻžāϧāĻžāϰāĻŖ āϧāĻžāϰāĻŖāĻž, āĻāĻŽāĻŋ āĻāĻļāĻž āĻāϰāĻŋ, āϰāϝāĻŧā§ āĻā§āĻā§āĨ¤
āϝāĻžāĻāĻšā§āĻ, āĻĒāĻžāĻāĻĨāύ⧠āĻāĻāĻāĻŋ āϰā§āĻĄāĻŋāĻŽā§āĻĄ āĻĄāĻŋāĻā§āĻĄāĻžāϰ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ, āĻāĻĒāύāĻŋ āĻāĻāĻŋ āĻ āϧā§āϝāϝāĻŧāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ . āĻāĻŦāĻ āĻāϏāĻĄāĻŋāĻāϰ āϰāĻŋāϏāĻŋāĻāĻžāϰā§āϰ āĻŽāĻžāϞāĻŋāĻāϰāĻž āĻāĻāĻāĻŋ āϤā§āϰāĻŋ 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
