Flightradar24 - αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…? αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2 αž–αž·αž’αžΈαž€αžΆαžš ADS-B

αžŸαž½αžŸαŸ’αžαžΈ Habr αŸ” αž”αŸ’αžšαž αŸ‚αž›β€‹αž‡αžΆβ€‹αž’αŸ’αž“αž€β€‹αžšαžΆαž›αŸ‹β€‹αž‚αŸ’αž“αžΆβ€‹αžŠαŸ‚αž›β€‹αž’αŸ’αž›αžΆαž”αŸ‹β€‹αž‡αž½αž” αž¬β€‹αžƒαžΎαž‰β€‹αžŸαžΆαž…αŸ‹β€‹αž‰αžΆαžαž· αž¬β€‹αž˜αž·αžαŸ’αžβ€‹αž—αž€αŸ’αžαž·β€‹αž“αŸ…β€‹αž›αžΎβ€‹αž™αž“αŸ’αžβ€‹αž αŸ„αŸ‡β€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžΎβ€‹αžŸαŸαžœαžΆ Flightradar24 αžŠαŸ„αž™β€‹αž₯αžβ€‹αž‚αž·αžβ€‹αžαŸ’αž›αŸƒαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αžŠαŸαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ†αž•αž»αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαžαžΆαž˜αžŠαžΆαž“αž‘αžΈαžαžΆαŸ†αž„αžšαž”αžŸαŸ‹αž™αž“αŸ’αžαž αŸ„αŸ‡αž€αŸ’αž“αž»αž„αž–αŸαž›αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αŸ”

Flightradar24 - αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…? αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2 αž–αž·αž’αžΈαž€αžΆαžš ADS-B

Π’ αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„αŸ” αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž’αž“αž‘αžΆαž‰αž”αŸ‚αž”αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž”αž“αŸ’αžαžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αžαžΆαžαžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎ αž“αž·αž„αž‘αž‘αž½αž›αž–αžΈαž™αž“αŸ’αžαž αŸ„αŸ‡αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸ’αžαžΆαž“αžΈαž™αž‘αž‘αž½αž› αž αžΎαž™αž’αŸ’αžœαžΎαž€αžΆαžšαžŒαž·αž€αžΌαžŠαžœαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αžŠαŸ„αž™αž”αŸ’αžšαžΎ Python αŸ”

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ

αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž‘αž·αž“αŸ’αž“αž“αŸαž™αž™αž“αŸ’αžαž αŸ„αŸ‡αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αžΎαž›αžƒαžΎαž‰αž“αŸ…αž›αžΎαžŸαŸ’αž˜αžΆαžαž αŸ’αžœαžΌαž“αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž“αŸ„αŸ‡αž‘αŸαŸ” αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ ADS-B (αž€αžΆαžšαžƒαŸ’αž›αžΆαŸ†αž˜αžΎαž›αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αž-αž•αŸ’αžŸαžΆαž™) αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΌαž“αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαž™αž“αŸ’αžαž αŸ„αŸ‡αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž”αž‰αŸ’αž‡αžΆ - αž§αž”αž€αžšαžŽαŸαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽ αž€αžΌαž’αžšαžŠαŸ„αž“αŸ αž‘αž·αžŸαžŠαŸ… αž›αŸ’αž”αžΏαž“ αžšαž™αŸˆαž€αž˜αŸ’αž–αžŸαŸ‹ αž“αž·αž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžšαž”αžŸαŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αŸ” αž–αžΈαž˜αž»αž“ αž˜αž»αž“αž–αŸαž›αž€αžΆαžšαž˜αž€αžŠαž›αŸ‹αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ‚αž”αž“αŸαŸ‡ αž’αŸ’αž“αž€αž”αž‰αŸ’αž‡αžΌαž“αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αžαŸ‚αž…αŸ†αžŽαž»αž…αž˜αž½αž™αž“αŸ…αž›αžΎαžšαŸ‰αžΆαžŠαžΆαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž“αŸαŸ‡αž˜αž·αž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž‘αŸ€αžαž‘αŸ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αžΆαž“αž™αž“αŸ’αžαž αŸ„αŸ‡αž…αŸ’αžšαžΎαž“αž–αŸαž€αŸ”

αžαžΆαž˜αž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸ ADS-B αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΌαž“αž“αŸ…αž›αžΎαž™αž“αŸ’αžαž αŸ„αŸ‡αžŠαŸ‚αž›αž”αž‰αŸ’αž‡αžΌαž“αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžαžΆαž˜αž€αžΆαž›αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž”αŸ’αžšαŸαž€αž„αŸ‹αžαŸ’αž–αžŸαŸ‹ 1090 MHz (αž˜αžΆαž“αžšαž”αŸ€αž”αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΎαž„αž˜αž·αž“αžŸαžΌαžœαž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž“αžΉαž„αž–αž½αž€αžœαžΆαž‘αŸ αž–αŸ’αžšαŸ„αŸ‡αž€αžΌαž’αžšαžŠαŸ„αž“αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αžαŸ‚αž“αŸ…αž‘αžΈαž“αŸαŸ‡)αŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΌαž“ αž€αŸαž˜αžΆαž“αž’αŸ’αž“αž€αž‘αž‘αž½αž›αž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αžŽαžΆαž˜αž½αž™αž“αŸ…αž’αžΆαž€αžΆαžŸαž™αžΆαž“αžŠαŸ’αž‹αžΆαž“αž•αž„αžŠαŸ‚αžš αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž™αžΎαž„αž‡αžΆαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž’αŸ’αž“αž€αž‘αž‘αž½αž›αž•αŸ’αž‘αžΆαž›αŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αž‚αžΊαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαŸ”

αžŠαŸ„αž™αžœαž·αž’αžΈαž“αŸαŸ‡ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαŸ€αž”αž’αŸ€αž” αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ‚αž”αž“αŸαŸ‡αžŠαŸ†αž”αžΌαž„αž‚αžΊ Airnav Radarbox αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž…αž“αžΆαž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž˜αŸ’αž˜αžαžΆαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαŸ’αž›αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž†αŸ’αž“αžΆαŸ† 2007 αž αžΎαž™αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž”αŸ’αžšαž αŸ‚αž› 900 αžŠαž»αž›αŸ’αž›αžΆαžš αž αžΎαž™αž€αžΆαžšαž‡αžΆαžœαžŸαŸαžœαžΆαž”αžŽαŸ’αžαžΆαž‰αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒ 250 αžŠαž»αž›αŸ’αž›αžΆαžšαž‘αŸ€αžαž€αŸ’αž“αž»αž„αž˜αž½αž™αž†αŸ’αž“αžΆαŸ†αŸ”

Flightradar24 - αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…? αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2 αž–αž·αž’αžΈαž€αžΆαžš ADS-B

αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž‘αžΎαž„αžœαž·αž‰αž“αŸƒαž˜αŸ’αž…αžΆαžŸαŸ‹αž‡αž“αž‡αžΆαžαž·αžšαž»αžŸαŸ’αžŸαŸŠαžΈαžŠαŸ†αž”αžΌαž„αž‚αŸαž’αžΆαž…αž’αžΆαž“αž”αžΆαž“αž“αŸ…αž›αžΎαžœαŸαž‘αž·αž€αžΆ αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŸαŸ’αž€αŸαž“αžœαž·αž‘αŸ’αž™αž». αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αž“αž€αž‘αž‘αž½αž› RTL-SDR αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαž’αžΆαž…αž”αŸ’αžšαžΎαž”αžΆαž“αž™αŸ‰αžΆαž„αž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™ αž§αž”αž€αžšαžŽαŸαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‚αž»αŸ†αž€αŸ’αž“αž»αž„αžαž˜αŸ’αž›αŸƒ 30 αžŠαž»αž›αŸ’αž›αžΆαžšαŸ” αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž’αŸ†αž–αžΈαž“αŸαŸ‡αž‚αžΊαž“αŸ…αž€αŸ’αž“αž»αž„ αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„αŸ”. αž…αžΌαžšαž”αž“αŸ’αžαž‘αŸ…αž–αž·αž’αžΈαž€αžΆαžšαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ - αžαŸ„αŸ‡αž˜αžΎαž›αžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

αž€αžΆαžšαž‘αž‘αž½αž›αžŸαž‰αŸ’αž‰αžΆ

αž‘αžΈαž˜αž½αž™ αžŸαž‰αŸ’αž‰αžΆαžαŸ’αžšαžΌαžœαž€αžαŸ‹αžαŸ’αžšαžΆαŸ” αžŸαž‰αŸ’αž‰αžΆαž‘αžΆαŸ†αž„αž˜αžΌαž›αž˜αžΆαž“αžαž·αžšαžœαŸαž›αžΆαžαŸ’αžšαžΉαž˜αžαŸ‚ 120 αž˜αžΈαž€αŸ’αžšαžΌαžœαž·αž“αžΆαž‘αžΈαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŠαžΎαž˜αŸ’αž”αžΈαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ†αž”αŸ‚αž€αžŸαž˜αžΆαžŸαž’αžΆαžαž»αžšαž”αžŸαŸ‹αžœαžΆ αž’αŸ’αž“αž€αž‘αž‘αž½αž› SDR αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαŸαž€αž„αŸ‹αž‚αŸ†αžšαžΌαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹ 5 MHz αž‚αžΊαž‡αžΆαž€αžΆαžšαž…αž„αŸ‹αž”αžΆαž“αŸ”

Flightradar24 - αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…? αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2 αž–αž·αž’αžΈαž€αžΆαžš ADS-B

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαžαž αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž―αž€αžŸαžΆαžš WAV αžŠαŸ‚αž›αž˜αžΆαž“αž’αžαŸ’αžšαžΆαž‚αŸ†αžšαžΌ 5000000 αž‚αŸ†αžšαžΌ/αžœαž·αž“αžΆαž‘αžΈ; 30 αžœαž·αž“αžΆαž‘αžΈαž“αŸƒαž€αžΆαžšαžαžαž”αŸ‚αž”αž“αŸαŸ‡ "αžαŸ’αž›αžΉαž„αžαŸ’αž›αŸ‚αž„" αž”αŸ’αžšαž αŸ‚αž› 500MB αŸ” αž€αžΆαžšαžŸαŸ’αžαžΆαž”αŸ‹αžœαžΆαž‡αžΆαž˜αž½αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αžΆαž€αŸ‹αž˜αŸαžŒαŸ€ αž–αž·αžαžŽαžΆαžŸαŸ‹αž‚αžΊαž‚αŸ’αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž‘αŸ - αž―αž€αžŸαžΆαžšαž˜αž·αž“αž˜αžΆαž“αžŸαŸ†αž‘αŸαž„αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαžŸαž‰αŸ’αž‰αžΆαžœαž·αž‘αŸ’αž™αž»αžŒαžΈαž‡αžΈαžαž›αž•αŸ’αž‘αžΆαž›αŸ‹ - αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžšαž”αŸ€αž”αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αžœαž·αž‘αŸ’αž™αž»αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

αž™αžΎαž„αž“αžΉαž„αž”αžΎαž€ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž―αž€αžŸαžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎ 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 αž–αž·αž’αžΈαž€αžΆαžš ADS-B

"αž‡αžΈαž–αž…αžš" αž“αžΈαž˜αž½αž™αŸ—αž‚αžΊαž‡αžΆαžŸαž‰αŸ’αž‰αžΆαž˜αž½αž™αžŠαŸ‚αž›αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαž“αž‚αž»αžŽαž—αžΆαž–αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž›αžΎαž€αŸ’αžšαžΆαž αŸ’αžœαŸ”

Flightradar24 - αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…? αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2 αž–αž·αž’αžΈαž€αžΆαžš ADS-B

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αžšαžΌαž”αž—αžΆαž–αž‚αžΊαž–αž·αžαž‡αžΆαžŸαŸ’αžšαž”αž‘αŸ…αž“αžΉαž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαžαžΆαž„αž›αžΎαŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αž€αžΆαžšαžŒαž·αž€αžΌαžŠ

αžŠαŸ†αž”αžΌαž„αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž‘αž‘αž½αž›αž”αžΆαž“αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž”αž“αŸ’αžαž·αž…αŸ” αžŸαž‰αŸ’αž‰αžΆαžαŸ’αž›αž½αž“αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸŠαž·αž“αž€αžΌαžŠαžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαž’αŸŠαž·αž“αž€αžΌαžŠ ManchesterαŸ–

Flightradar24 - αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…? αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2 αž–αž·αž’αžΈαž€αžΆαžš ADS-B

αž–αžΈαž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαž“αŸƒαž€αž˜αŸ’αžšαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„ nibbles αžœαžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‘αž‘αž½αž›αž”αžΆαž“ "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 αž‘αŸαž–αŸ’αžšαŸ„αŸ‡... αžœαžΆαž‚αžΊαž‡αžΆαž“αŸαŸ‡αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΌαž’αžšαžŠαŸ„αž“αŸαž“αŸƒαž™αž“αŸ’αžαž αŸ„αŸ‡αŸ”

ICAO (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 αŸ” αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž‚αž½αžšβ€‹αž±αŸ’αž™β€‹αž…αžΆαž”αŸ‹β€‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸβ€‹αž“αŸ…β€‹αž‘αžΈβ€‹αž“αŸαŸ‡β€‹αž‚αžΊβ€‹αžαžΆ αž›αŸ’αž”αžΏαž“β€‹αž’αžΆαž…β€‹αž˜αžΆαž“β€‹αž—αžΆαž–β€‹αžŸαž»αž€αŸ’αžšαžΉαž αž‘αžΆαž€αŸ‹αž‘αž„β€‹αž‘αŸ…β€‹αž“αžΉαž„β€‹αžŠαžΈ (Ground Speed) αž¬β€‹αžαŸ’αž™αž›αŸ‹β€‹αžŠαŸ‚αž›β€‹αžœαžΆαžŸαŸ‹β€‹αžŠαŸ„αž™β€‹αž§αž”αž€αžšαžŽαŸβ€‹αž…αžΆαž”αŸ‹β€‹αžŸαž‰αŸ’αž‰αžΆβ€‹αž™αž“αŸ’αžαž αŸ„αŸ‡ (Airspeed)αŸ” αžœαžΆαž›αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž•αž„αžŠαŸ‚αžš:

Flightradar24 - αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…? αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2 αž–αž·αž’αžΈαž€αžΆαžš ADS-B
(αž”αŸ’αžšαž—αž–)

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰ αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆ ADS-B αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŠαŸαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž˜αž½αž™ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž˜αž½αž™αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž˜αŸ’αž˜αžαžΆαž•αž„αžŠαŸ‚αžšαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αžαž½αž“αžΆαž‘αžΈαžŸαŸ†αžαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αžšαžΏαž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αŸαž„αžŠαŸ„αž™αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαžαŸ„αž€αž‡αžΆαž„αž“αŸƒαž’αŸ’αž“αž€αž‘αž‘αž½αž›αžŒαžΈαž‡αžΈαžαž› SDR αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž§αž”αž€αžšαžŽαŸαž“αŸαŸ‡αž‘αž‘αž½αž›αž”αžΆαž“αžŸαž‰αŸ’αž‰αžΆαžαžΆαž˜αž–αŸ’αž™αž‰αŸ’αž‡αž“αŸˆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ’αžšαŸαž€αž„αŸ‹αž›αžΎαžŸαž–αžΈ gigahertz "αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαž€αŸ‹" αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαžαŸ’αž›αž½αž“αžœαžΆαž–αž·αžαžŽαžΆαžŸαŸ‹αž˜αžΆαž“αž…αŸ’αžšαžΎαž“αž‘αŸ€αžαŸ” αž’αŸ’αž“αž€αžŠαŸ‚αž›αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž’αžΆαž…αž˜αžΎαž›αž―αž€αžŸαžΆαžš PDF αž“αŸ…αž›αžΎαž‘αŸ†αž–αŸαžš ICAO αž¬αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αž”αžΆαž“αžšαŸ€αž”αžšαžΆαž”αŸ‹αžαžΆαž„αž›αžΎ αžœαŸαž”αžŸαžΆαž™.

αžœαžΆαž˜αž·αž“αž‘αŸ†αž“αž„αžαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαžΆαž„αž›αžΎαž“αžΉαž„αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αž“αž»αžŸαŸ’αžŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ„αŸ‡αž‘αŸαž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž‚αŸ†αž“αž·αžαž‘αžΌαž‘αŸ…αž“αŸƒαžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž“αŸ…αžαŸ‚αž˜αžΆαž“αŸ”

αžŠαŸ„αž™αžœαž·αž’αžΈαž“αŸαŸ‡ αž§αž”αž€αžšαžŽαŸαžŒαž·αž€αžΌαžŠαžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αž“αŸ…αž€αŸ’αž“αž»αž„ Python αž˜αžΆαž“αžšαž½αž…αž αžΎαž™ αž’αŸ’αž“αž€αž’αžΆαž…αžŸαž·αž€αŸ’αžŸαžΆαžœαžΆαž”αžΆαž“ αž“αŸ…αž‘αžΈαž“αŸαŸ‡. αž αžΎαž™αž˜αŸ’αž…αžΆαžŸαŸ‹αž’αŸ’αž“αž€αž‘αž‘αž½αž› SDR αž’αžΆαž…αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ† αž“αž·αž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž§αž”αž€αžšαžŽαŸαžŒαž·αž€αžΌαžŠ ADS-B αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž… αž–αžΈαž‘αŸ†αž–αŸαžšαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„ αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„αŸ”.

αž€αžΌαžŠαž”αŸ’αžšαž—αž–αž“αŸƒαž’αžΆαžαž»αž‰αŸ‚αž€αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž€αžΆαžšαž€αžΆαžαŸ‹αŸ” αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž§αž‘αžΆαž αžšαžŽαŸβ€‹αžŸαžΆαž€αž›αŸ’αž”αž„β€‹αžŠαŸ‚αž›β€‹αž˜αž·αž“β€‹αž’αŸ’αžœαžΎβ€‹αž–αž»αžβ€‹αž‡αžΆβ€‹αž•αž›αž·αžβ€‹αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžšαžΏαž„β€‹αžαŸ’αž›αŸ‡β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αž€αŸ’αž“αž»αž„β€‹αžœαžΆ αž αžΎαž™β€‹αžœαžΆβ€‹αž’αžΆαž…β€‹αž”αŸ’αžšαžΎβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž‰αŸ‚αž€β€‹αž―αž€αžŸαžΆαžšβ€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž€αžαŸ‹αžαŸ’αžšαžΆβ€‹αžαžΆαž„αž›αžΎαŸ”
αž€αžΌαžŠαž”αŸ’αžšαž—αž– (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

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹