Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ

āĻšā§āϝāĻžāϞ⧋ āĻšāĻžāĻŦāϰāĨ¤ āϏāĻŽā§āĻ­āĻŦāϤ āĻĒā§āϰāĻ¤ā§āϝ⧇āϕ⧇ āϝāĻžāϰāĻž āĻ•āĻ–āύāĻ“ āĻŦāĻŋāĻŽāĻžāύ⧇ āφāĻ¤ā§āĻŽā§€āϝāĻŧ āĻŦāĻž āĻŦāĻ¨ā§āϧ⧁āĻĻ⧇āϰ āϏāĻžāĻĨ⧇ āĻĻ⧇āĻ–āĻž āĻ•āϰ⧇āϛ⧇āύ āĻŦāĻž āĻĻ⧇āϖ⧇āϛ⧇āύ āϤāĻžāϰāĻž āĻŦāĻŋāύāĻžāĻŽā§‚āĻ˛ā§āϝ⧇ Flightradar24 āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āϛ⧇āύāĨ¤ āϰāĻŋāϝāĻŧ⧇āϞ āϟāĻžāχāĻŽā§‡ āĻŦāĻŋāĻŽāĻžāύ⧇āϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰāĻžāϰ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āϖ⧁āĻŦ āϏ⧁āĻŦāĻŋāϧāĻžāϜāύāĻ• āωāĻĒāĻžāϝāĻŧāĨ¤

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ

В āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ āĻāχ āϧāϰāύ⧇āϰ āĻāĻ•āϟāĻŋ āĻ…āύāϞāĻžāχāύ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āύ⧀āϤāĻŋ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ āφāĻŽāϰāĻž āĻāĻ–āύ āĻāĻ—āĻŋāϝāĻŧ⧇ āϝāĻžāĻŦ āĻāĻŦāĻ‚ āĻĒāĻžāχāĻĨāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦāĻŋāĻŽāĻžāύ āĻĨ⧇āϕ⧇ āϰāĻŋāϏāĻŋāĻ­āĻŋāĻ‚ āĻ¸ā§āĻŸā§‡āĻļāύ⧇ āϕ⧀ āĻĄā§‡āϟāĻž āĻĒāĻžāĻ āĻžāύ⧋ āĻāĻŦāĻ‚ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇ āϤāĻž āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰāĻŦ āĻāĻŦāĻ‚ āύāĻŋāĻœā§‡āϰāĻžāχ āĻĄāĻŋāϕ⧋āĻĄāĻŋāĻ‚ āĻ•āϰāĻŦāĨ¤

Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ

āĻ¸ā§āĻĒāĻˇā§āϟāϤāχ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϤāĻžāĻĻ⧇āϰ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟāĻĢā§‹āύ⧇ āĻĻ⧇āĻ–āĻžāϰ āϜāĻ¨ā§āϝ āĻŦāĻŋāĻŽāĻžāύ⧇āϰ āĻĄā§‡āϟāĻž āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ āύāĻžāĨ¤ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϟāĻŋāϕ⧇ āĻŦāϞāĻž āĻšāϝāĻŧ ADS-B (āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ āύāĻŋāĻ°ā§āĻ­āϰāĻļā§€āϞ āύāϜāϰāĻĻāĻžāϰāĻŋ—āϏāĻŽā§āĻĒā§āϰāϚāĻžāϰ), āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻŦāĻŋāĻŽāĻžāύ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϤāĻĨā§āϝ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āϕ⧇āĻ¨ā§āĻĻā§āϰ⧇ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ - āĻāϰ āϏāύāĻžāĻ•ā§āϤāĻ•āĻžāϰ⧀, āĻ¸ā§āĻĨāĻžāύāĻžāĻ™ā§āĻ•, āĻĻāĻŋāĻ•, āĻ—āϤāĻŋ, āωāĻšā§āϚāϤāĻž āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĄā§‡āϟāĻž āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻĒā§‚āĻ°ā§āĻŦ⧇, āĻāχ āϧāϰāύ⧇āϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āφāĻŦāĻŋāĻ°ā§āĻ­āĻžāĻŦ⧇āϰ āφāϗ⧇, āĻĒā§āϰ⧇āϰāĻŖāĻ•āĻžāϰ⧀ āϰāĻžāĻĄāĻžāϰ⧇ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻ¨ā§āĻĻ⧁ āĻĻ⧇āĻ–āϤ⧇ āĻĒ⧇āϤāĨ¤ āϝāĻ–āύ āĻ…āύ⧇āĻ• āĻĒā§āϞ⧇āύ āĻ›āĻŋāϞ āϤāĻ–āύ āĻāϟāĻŋ āφāϰ āϝāĻĨ⧇āĻˇā§āϟ āĻ›āĻŋāϞ āύāĻžāĨ¤

āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋāĻ—āϤāĻ­āĻžāĻŦ⧇, ADS-B āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻŽāĻžāύ⧇ āĻāĻ•āϟāĻŋ āĻŸā§āϰāĻžāĻ¨ā§āϏāĻŽāĻŋāϟāĻžāϰ āύāĻŋāϝāĻŧ⧇ āĻ—āĻ āĻŋāϤ āϝāĻž āĻĒāĻ°ā§āϝāĻžāϝāĻŧāĻ•ā§āϰāĻŽā§‡ 1090 MHz āĻāϰ āĻŽā§‹āϟāĻžāĻŽā§āϟāĻŋ āωāĻšā§āϚ āĻĢā§āϰāĻŋāϕ⧋āϝāĻŧ⧇āĻ¨ā§āϏāĻŋāϤ⧇ āϤāĻĨā§āϝ⧇āϰ āĻĒā§āϝāĻžāϕ⧇āϟ āĻĒāĻžāĻ āĻžāϝāĻŧ (āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻŽā§‹āĻĄ āφāϛ⧇, āϤāĻŦ⧇ āφāĻŽāϰāĻž āϏ⧇āϗ⧁āϞāĻŋāϤ⧇ āĻāϤ āφāĻ—ā§āϰāĻšā§€ āύāχ, āϝ⧇āĻšā§‡āϤ⧁ āĻ¸ā§āĻĨāĻžāύāĻžāĻ™ā§āĻ•āϗ⧁āϞāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ–āĻžāύ⧇ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ)āĨ¤ āĻ…āĻŦāĻļā§āϝāχ, āĻŸā§āϰāĻžāĻ¨ā§āϏāĻŽāĻŋāϟāĻžāϰ āĻ›āĻžāĻĄāĻŧāĻžāĻ“, āĻŦāĻŋāĻŽāĻžāύāĻŦāĻ¨ā§āĻĻāϰ⧇ āϕ⧋āĻĨāĻžāĻ“ āĻāĻ•āϟāĻŋ āϰāĻŋāϏāĻŋāĻ­āĻžāϰāĻ“ āϰāϝāĻŧ⧇āϛ⧇, āϤāĻŦ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āϜāĻ¨ā§āϝ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻšāĻŋāϏāĻžāĻŦ⧇, āφāĻŽāĻžāĻĻ⧇āϰ āύāĻŋāϜāĻ¸ā§āĻŦ āϰāĻŋāϏāĻŋāĻ­āĻžāϰāϟāĻŋ āφāĻ•āĻ°ā§āώāĻŖā§€āϝāĻŧāĨ¤

āĻĒā§āϰāϏāĻ™ā§āĻ—āϤ, āϤ⧁āϞāύāĻžāϰ āϜāĻ¨ā§āϝ āĻŦāϞāĻž āϝāĻžāϝāĻŧ, āϏāĻžāϧāĻžāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϜāĻ¨ā§āϝ āϤ⧈āϰāĻŋ āĻĒā§āϰāĻĨāĻŽ āĻāχ āϧāϰāύ⧇āϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ, āĻāϝāĻŧāĻžāϰāύāĻžāĻ­ āϰāĻžāĻĄāĻžāϰāĻŦāĻ•ā§āϏ, ⧍ā§Ļā§Ļā§­ āϏāĻžāϞ⧇ āĻŦāĻžāϜāĻžāϰ⧇ āφāϏ⧇ āĻāĻŦāĻ‚ āĻāϰ āĻĻāĻžāĻŽ āĻ›āĻŋāϞ āĻĒā§āϰāĻžāϝāĻŧ ⧝ā§Ļā§Ļ āĻĄāϞāĻžāϰāĨ¤ 250$ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ⧇āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϤāĻŋ āĻŦāĻ›āϰ āĻ–āϰāϚ āĻšāϝāĻŧāĨ¤

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ

āϏ⧇āχ āĻĒā§āϰāĻĨāĻŽ āϰāĻžāĻļāĻŋāϝāĻŧāĻžāύ āĻŽāĻžāϞāĻŋāĻ•āĻĻ⧇āϰ āĻĒāĻ°ā§āϝāĻžāϞ⧋āϚāύāĻž āĻĢā§‹āϰāĻžāĻŽā§‡ āĻĒāĻĄāĻŧāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ āϰ⧇āĻĄāĻŋāĻ“āĻ¸ā§āĻ•ā§āϝāĻžāύāĻžāϰ. āĻāĻ–āύ āϝ⧇āĻšā§‡āϤ⧁ RTL-SDR āϰāĻŋāϏāĻŋāĻ­āĻžāϰāϗ⧁āϞāĻŋ āĻŦā§āϝāĻžāĻĒāĻ•āĻ­āĻžāĻŦ⧇ āωāĻĒāϞāĻŦā§āϧ āĻšāϝāĻŧ⧇ āωāϠ⧇āϛ⧇, āĻ…āύ⧁āϰ⧂āĻĒ āĻāĻ•āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ $30 āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇; āĻāχ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“ āĻ•āĻŋāϛ⧁ āĻ›āĻŋāϞ āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ. āφāϏ⧁āύ āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ⧇āϰ āĻĻāĻŋāϕ⧇ āĻāĻ—āĻŋāϝāĻŧ⧇ āϝāĻžāχ - āφāϏ⧁āύ āĻĻ⧇āĻ–āĻŋ āĻāϟāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤

āϏāĻ‚āϕ⧇āϤ āĻ—ā§āϰāĻšāĻŖ

āĻĒā§āϰāĻĨāĻŽāϤ, āϏāĻ‚āϕ⧇āϤ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϏāĻ‚āϕ⧇āϤ⧇āϰ āϏāĻŽāϝāĻŧāĻ•āĻžāϞ āĻŽāĻžāĻ¤ā§āϰ 120 āĻŽāĻžāχāĻ•ā§āϰ⧋āϏ⧇āϕ⧇āĻ¨ā§āĻĄ, āϤāĻžāχ āĻāϰ āωāĻĒāĻžāĻĻāĻžāύāϗ⧁āϞāĻŋāϕ⧇ āφāϰāĻžāĻŽāĻĻāĻžāϝāĻŧāĻ•āĻ­āĻžāĻŦ⧇ āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āĻ•āĻŽāĻĒāĻ•ā§āώ⧇ 5 MHz āĻāϰ āĻ¸ā§āϝāĻžāĻŽā§āĻĒāϞāĻŋāĻ‚ āĻĢā§āϰāĻŋāϕ⧋āϝāĻŧ⧇āĻ¨ā§āϏāĻŋ āϏāĻš āĻāĻ•āϟāĻŋ SDR āϰāĻŋāϏāĻŋāĻ­āĻžāϰ āĻŦāĻžāĻžā§āĻ›āύ⧀āϝāĻŧāĨ¤

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ

āϰ⧇āĻ•āĻ°ā§āĻĄāĻŋāĻ‚āϝāĻŧ⧇āϰ āĻĒāϰ⧇, āφāĻŽāϰāĻž 5000000 āύāĻŽā§āύāĻž/āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡āϰ āύāĻŽā§āύāĻž āĻšāĻžāϰ āϏāĻš āĻāĻ•āϟāĻŋ WAV āĻĢāĻžāχāϞ āĻĒāĻžāχ; āĻāχ āϧāϰāύ⧇āϰ āϰ⧇āĻ•āĻ°ā§āĻĄāĻŋāĻ‚āϝāĻŧ⧇āϰ 30 āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡āϰ "āĻ“āϜāύ" āĻĒā§āϰāĻžāϝāĻŧ 500MBāĨ¤ āĻāĻ•āϟāĻŋ āĻŽāĻŋāĻĄāĻŋāϝāĻŧāĻž āĻĒā§āϞ⧇āϝāĻŧāĻžāϰ āĻĻāĻŋāϝāĻŧ⧇ āĻāϟāĻŋ āĻļā§‹āύāĻž āĻ…āĻŦāĻļā§āϝāχ āĻ…āϕ⧇āĻœā§‹ - āĻĢāĻžāχāϞāϟāĻŋāϤ⧇ āĻļāĻŦā§āĻĻ āύ⧇āχ, āϤāĻŦ⧇ āĻāĻ•āϟāĻŋ āϏāϰāĻžāϏāϰāĻŋ āĻĄāĻŋāϜāĻŋāϟāĻžāχāϜāĻĄ āϰ⧇āĻĄāĻŋāĻ“ āϏāĻŋāĻ—āĻ¨ā§āϝāĻžāϞ - āĻāχāĻ­āĻžāĻŦ⧇ āϏāĻĢā§āϟāĻ“āϝāĻŧā§āϝāĻžāϰ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āϰ⧇āĻĄāĻŋāĻ“ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤

āφāĻŽāϰāĻž āĻĒāĻžāχāĻĨāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĢāĻžāχāϞāϟāĻŋ āϖ⧁āϞāĻŦ āĻāĻŦāĻ‚ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰāĻŦāĨ¤ āϝāĻžāϰāĻž āύāĻŋāĻœā§‡āϰāĻžāχ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āϚāĻžāύ āϤāĻžāϰāĻž āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āϰ⧇āĻ•āĻ°ā§āĻĄāĻŋāĻ‚ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āϞāĻŋāĻ‚āĻ•.

āϚāϞ⧁āύ āĻĢāĻžāχāϞāϟāĻŋ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰ⧇ āĻĻ⧇āĻ–āĻŋ āĻ­āĻŋāϤāϰ⧇ āĻ•āĻŋ āφāϛ⧇āĨ¤

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

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

plt.plot(A)
plt.show()

āĻĢāϞāĻžāĻĢāϞ: āφāĻŽāϰāĻž āĻĒāϟāĻ­ā§‚āĻŽāĻŋāϰ āĻļāĻŦā§āĻĻ⧇āϰ āĻŦāĻŋāĻĒāϰ⧀āϤ⧇ āϏ⧁āĻ¸ā§āĻĒāĻˇā§āϟ "āĻĄāĻžāϞ" āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāχāĨ¤

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ

āĻĒā§āϰāϤāĻŋāϟāĻŋ "āĻĒāĻžāϞāϏ" āĻāĻ•āϟāĻŋ āϏāĻ‚āϕ⧇āϤ, āϝāĻžāϰ āĻ—āĻ āύāϟāĻŋ āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ āĻĻ⧃āĻļā§āϝāĻŽāĻžāύ āĻšāϝāĻŧ āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āĻ—ā§āϰāĻžāĻĢ⧇ āϰ⧇āĻœā§‹āϞāĻŋāωāĻļāύ āĻŦāĻžāĻĄāĻŧāĻžāύāĨ¤

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ

āφāĻĒāύāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻšā§āϛ⧇āύ, āωāĻĒāϰ⧇āϰ āĻŦāĻ°ā§āĻŖāύāĻžāϝāĻŧ āϝāĻž āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ⧇āϛ⧇ āϤāĻžāϰ āϏāĻžāĻĨ⧇ āĻ›āĻŦāĻŋāϟāĻŋ āĻŦ⧇āĻļ āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝāĻĒā§‚āĻ°ā§āĻŖāĨ¤ āφāĻĒāύāĻŋ āĻĄā§‡āϟāĻž āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāĻŖ āĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āĻĄāĻŋāϕ⧋āĻĄāĻŋāĻ‚

āĻĒā§āϰāĻĨāĻŽāϤ, āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻŦāĻŋāϟ āĻ¸ā§āĻŸā§āϰāĻŋāĻŽ āĻĒ⧇āϤ⧇ āĻšāĻŦ⧇. āϏāĻ‚āϕ⧇āϤ āύāĻŋāĻœā§‡āχ āĻŽā§āϝāĻžāύāĻšā§‡āĻ¸ā§āϟāĻžāϰ āĻāύāϕ⧋āĻĄāĻŋāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāύāϕ⧋āĻĄ āĻ•āϰāĻž āĻšāϝāĻŧ:

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ

āύāĻŋāĻŦāϞ⧇āϰ āĻ¸ā§āϤāϰ⧇āϰ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ āĻĨ⧇āϕ⧇ āĻŦāĻžāĻ¸ā§āϤāĻŦ "0" āĻāĻŦāĻ‚ "1" āĻĒāĻžāĻ“āϝāĻŧāĻž āϏāĻšāϜāĨ¤

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

āϏāĻ‚āϕ⧇āϤ⧇āϰ āĻ—āĻ āύ āύāĻŋāĻœā§‡āχ āύāĻŋāĻŽā§āύāϰ⧂āĻĒ:

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ

āφāϏ⧁āύ āφāϰāĻ“ āĻŦāĻŋāĻļāĻĻ⧇ āĻ•ā§āώ⧇āĻ¤ā§āϰāϗ⧁āϞāĻŋ āĻĻ⧇āϖ⧁āύāĨ¤

DF (āĻĄāĻžāωāύāϞāĻŋāĻ‚āĻ• āĻĢāϰāĻŽā§āϝāĻžāϟ, 5 āĻŦāĻŋāϟ) - āĻŦāĻžāĻ°ā§āϤāĻžāϰ āϧāϰāύ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧇āĨ¤ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āϧāϰāύ⧇āϰ āφāϛ⧇:

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ
(āĻŸā§‡āĻŦāĻŋāϞ āĻ‰ā§ŽāϏ)

āφāĻŽāϰāĻž āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ DF17 āϟāĻžāχāĻĒ āĻ•āϰāϤ⧇ āφāĻ—ā§āϰāĻšā§€, āĻ•āĻžāϰāĻŖ... āĻāϟāĻŋāχ āĻŦāĻŋāĻŽāĻžāύ⧇āϰ āĻ¸ā§āĻĨāĻžāύāĻžāĻ™ā§āĻ• āϧāĻžāϰāĻŖ āĻ•āϰ⧇āĨ¤

āφāχāϏāĻŋāĻāĻ“ (24 āĻŦāĻŋāϟ) - āĻŦāĻŋāĻŽāĻžāύ⧇āϰ āφāĻ¨ā§āϤāĻ°ā§āϜāĻžāϤāĻŋāĻ• āĻ…āύāĻ¨ā§āϝ āϕ⧋āĻĄāĨ¤ āφāĻĒāύāĻŋ āϤāĻžāϰ āϕ⧋āĻĄ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϞ⧇āύ āĻšā§‡āĻ• āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻ…āύāϞāĻžāχāύ (āĻĻ⧁āĻ°ā§āĻ­āĻžāĻ—ā§āϝāĻŦāĻļāϤ, āϞ⧇āĻ–āĻ• āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻž āĻŦāĻ¨ā§āϧ āĻ•āϰ⧇āϛ⧇āύ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāϟāĻŋ āĻāĻ–āύāĻ“ āĻĒā§āϰāĻžāϏāĻ™ā§āĻ—āĻŋāĻ•)āĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āϕ⧋āĻĄ 3c5ee2 āĻāϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āĻžāϛ⧇ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āϤāĻĨā§āϝ āϰāϝāĻŧ⧇āϛ⧇:

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ

āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž: āχāύ āύāĻŋāĻŦāĻ¨ā§āϧ⧇ āĻŽāĻ¨ā§āϤāĻŦā§āϝ ICAO āϕ⧋āĻĄā§‡āϰ āĻŦāĻŋāĻŦāϰāĻŖ āφāϰāĻ“ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤāĻ­āĻžāĻŦ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ⧇āϛ⧇; āφāĻŽāĻŋ āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰāĻ›āĻŋ āϝ⧇ āϝāĻžāϰāĻž āφāĻ—ā§āϰāĻšā§€ āϤāĻžāϰāĻž āĻāϟāĻŋ āĻĒāĻĄāĻŧāĻŦ⧇āύāĨ¤

āϤāĻĨā§āϝ (56 āĻŦāĻž 112 āĻŦāĻŋāϟ) - āĻĒā§āϰāĻ•ā§ƒāϤ āĻĄā§‡āϟāĻž āϝāĻž āφāĻŽāϰāĻž āĻĄāĻŋāϕ⧋āĻĄ āĻ•āϰāĻŦāĨ¤ āĻĄā§‡āϟāĻžāϰ āĻĒā§āϰāĻĨāĻŽ 5 āĻŦāĻŋāϟ āĻšāϞ āĻĢāĻŋāĻ˛ā§āĻĄ āϟāĻžāχāĻĒ āϕ⧋āĻĄ, āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻĄā§‡āϟāĻžāϰ āϏāĻžāĻŦāϟāĻžāχāĻĒ āϰāϝāĻŧ⧇āϛ⧇ (DF āĻāϰ āϏāĻžāĻĨ⧇ āĻŦāĻŋāĻ­ā§āϰāĻžāĻ¨ā§āϤ āĻšāĻŦ⧇āύ āύāĻž)āĨ¤ āĻāχ āϧāϰāύ⧇āϰ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āφāϛ⧇:

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ
(āĻŸā§‡āĻŦāĻŋāϞ āĻ‰ā§ŽāϏ)

āφāϏ⧁āύ āĻĒā§āϝāĻžāϕ⧇āĻœā§‡āϰ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻĻ⧇āĻ–āĻŋāĨ¤

āĻŦāĻŋāĻŽāĻžāύ āĻļāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ

āĻŦāĻžāχāύāĻžāϰāĻŋ āφāĻ•āĻžāϰ⧇ āωāĻĻāĻžāĻšāϰāĻŖ:

00100 011 000101 010111 000111 110111 110001 111000

āĻĄā§‡āϟāĻž āĻ•ā§āώ⧇āĻ¤ā§āϰ:

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

TC = 00100b = 4, āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ…āĻ•ā§āώāϰ C1-C8 āϞāĻžāχāύ⧇āϰ āϏ⧂āϚāĻ•āϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āϕ⧋āĻĄāϗ⧁āϞāĻŋ āϧāĻžāϰāĻŖ āĻ•āϰ⧇:
#ABCDEFGHIJKLMNOPQRSTUVWXYZ####_##############0123456789#####

āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻĄāĻŋāϕ⧋āĻĄ āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡, āĻŦāĻŋāĻŽāĻžāύ⧇āϰ āϕ⧋āĻĄ āĻĒāĻžāĻ“āϝāĻŧāĻž āϏāĻšāϜ: EWG7184

symbols = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789######"
code_str = ""
for p in range(8):
     c = int(bits_str[8 + 6*p:8 + 6*(p + 1)], 2)
     code_str += symbols[c]
print("Aircraft Identification:", code_str.replace('#', ''))

āĻŦāĻžāϝāĻŧ⧁āĻŦāĻžāĻšāĻŋāϤ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ

āϝāĻĻāĻŋ āύāĻžāĻŽāϟāĻŋ āϏāĻšāϜ āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧇ āĻ¸ā§āĻĨāĻžāύāĻžāĻ™ā§āĻ•āϗ⧁āϞāĻŋ āφāϰāĻ“ āϜāϟāĻŋāϞāĨ¤ āĻāϗ⧁āϞāĻŋ 2, āĻœā§‹āĻĄāĻŧ āĻāĻŦāĻ‚ āĻŦāĻŋāĻœā§‹āĻĄāĻŧ āĻĢā§āϰ⧇āĻŽā§‡āϰ āφāĻ•āĻžāϰ⧇ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻĢāĻŋāĻ˛ā§āĻĄ āϕ⧋āĻĄ TC = 01011b = 11āĨ¤

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ

āĻœā§‹āĻĄāĻŧ āĻāĻŦāĻ‚ āĻŦāĻŋāĻœā§‹āĻĄāĻŧ āĻĒā§āϝāĻžāϕ⧇āĻŸā§‡āϰ āωāĻĻāĻžāĻšāϰāĻŖ:

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

āĻ¸ā§āĻĨāĻžāύāĻžāĻ™ā§āϕ⧇āϰ āĻ—āĻŖāύāĻž āύāĻŋāĻœā§‡āχ āĻāĻ•āϟāĻŋ āϜāϟāĻŋāϞ āϏ⧂āĻ¤ā§āϰ āĻ…āύ⧁āϏāĻžāϰ⧇ āϘāĻŸā§‡:

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ
(āĻ‰ā§ŽāϏ)

āφāĻŽāĻŋ āĻāĻ•āϜāύ GIS āĻŦāĻŋāĻļ⧇āώāĻœā§āĻž āύāχ, āϤāĻžāχ āφāĻŽāĻŋ āϜāĻžāύāĻŋ āύāĻž āĻāϟāĻŋ āϕ⧋āĻĨāĻž āĻĨ⧇āϕ⧇ āĻāϏ⧇āϛ⧇āĨ¤ āϕ⧇ āϜāĻžāύ⧇, āĻ•āĻŽā§‡āĻ¨ā§āĻŸā§‡ āϞāĻŋāϖ⧁āύāĨ¤

āωāĻšā§āϚāϤāĻž āϏāĻšāϜ āĻŦāϞ⧇ āĻŽāύ⧇ āĻ•āϰāĻž āĻšāϝāĻŧ - āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦāĻŋāĻŸā§‡āϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇, āĻāϟāĻŋāϕ⧇ 25 āĻŦāĻž 100 āĻĢ⧁āĻŸā§‡āϰ āĻāĻ•āĻžāϧāĻŋāĻ• āĻšāĻŋāϏāĻžāĻŦ⧇ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āĻŦāĻžāϝāĻŧ⧁āĻŦāĻžāĻšāĻŋāϤ āĻŦ⧇āĻ—

TC=19 āϏāĻš āĻĒā§āϝāĻžāϕ⧇āϜāĨ¤ āĻāĻ–āĻžāύ⧇ āĻŽāϜāĻžāϰ āĻŦāĻŋāώāϝāĻŧ āĻšāϞ āϝ⧇ āĻ—āϤāĻŋ āĻšāϝāĻŧ āύāĻŋāĻ°ā§āϭ⧁āϞ āĻšāϤ⧇ āĻĒāĻžāϰ⧇, āĻ¸ā§āĻĨāϞ⧇āϰ āϏāĻžāĻĒ⧇āĻ•ā§āώ⧇ (āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āĻ¸ā§āĻĒā§€āĻĄ), āĻŦāĻž āĻŦāĻžāϝāĻŧ⧁āĻŦāĻžāĻšāĻŋāϤ, āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻŽāĻžāύ āϏ⧇āĻ¨ā§āϏāϰ (āĻāϝāĻŧāĻžāϰāĻ¸ā§āĻĒāĻŋāĻĄ) āĻĻā§āĻŦāĻžāϰāĻž āĻĒāϰāĻŋāĻŽāĻžāĻĒ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻ…āύ⧇āĻ•āϗ⧁āϞāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ•ā§āώ⧇āĻ¤ā§āϰāĻ“ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ:

Flightradar24 - āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻĒāĻžāĻ°ā§āϟ 2, ADS-B āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ
(āĻ‰ā§ŽāϏ)

āωāĻĒāϏāĻ‚āĻšāĻžāϰ

āφāĻĒāύāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻšā§āϛ⧇āύ, 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

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster