{"id":467109,"date":"2025-07-15T21:00:13","date_gmt":"2025-07-15T21:00:13","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=467109"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=467109","title":{"rendered":"<span>\u0412\u0441\u0451 \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 FT8\/FT4 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 Python<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/525\/5c3\/54a\/5255c354a63fe6c9b1e02ebc74080dfb.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/525\/5c3\/54a\/5255c354a63fe6c9b1e02ebc74080dfb.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/525\/5c3\/54a\/5255c354a63fe6c9b1e02ebc74080dfb.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> FT8 \u2014 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0414\u0436\u043e \u0422\u0435\u0439\u043b\u043e\u0440\u043e\u043c (K1JT) \u0438 \u0421\u0442\u0438\u0432\u043e\u043c \u0424\u0440\u0430\u043d\u043a\u0435 (K9AN) \u0432 2017 \u0433\u043e\u0434\u0443. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. <\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044f\u043c, \u043a\u0430\u043a \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c, \u0442\u0430\u043a \u0438 \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0441 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438 FT8 \u0438 FT4, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u043c, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u0445 \u043f\u043e\u043d\u044f\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432.<\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p> \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b FT8 \u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044f\u043c\u0438 \u0414\u0436\u043e \u0422\u0435\u0439\u043b\u043e\u0440\u043e\u043c (K1JT) \u0438 \u0421\u0442\u0438\u0432\u043e\u043c \u0424\u0440\u0430\u043d\u043a\u0435 (K9AN) \u0432 2017 \u0433\u043e\u0434\u0443, \u0447\u044c\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u044b \u0431\u044b\u043b\u0438 \u0443\u0432\u0435\u043a\u043e\u0432\u0435\u0447\u0435\u043d\u044b \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. <\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0438 \u0446\u0435\u043b\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u043f\u0440\u0438 \u043e\u0447\u0435\u043d\u044c \u043d\u0438\u0437\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u0440\u043e\u0433\u0430 \u0441\u043b\u044b\u0448\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430; \u0432 \u043f\u043b\u043e\u0445\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0440\u0430\u0434\u0438\u043e\u0441\u0438\u0433\u043d\u0430\u043b\u0430; \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0438\u0437\u043a\u043e\u0439 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438; \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u0437\u043a\u0438\u0445 \u043f\u043e\u043b\u043e\u0441 \u0447\u0430\u0441\u0442\u043e\u0442 \u0434\u043b\u044f \u043f\u0440\u0438\u0435\u043c\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438 \u043f\u0440\u0438 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043f\u043e\u0440\u044f\u0434\u043a\u0430 15 \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443) \u0438, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u0438\u043c\u0435\u0435\u0442 \u043d\u0438\u0437\u043a\u0438\u0439 \u0431\u0438\u0442\u0440\u0435\u0439\u0442. \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0431\u044b\u043b \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0430\u0445 (\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0441 \u043c\u0438\u0440\u043e\u0432\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c.<\/p>\n<p>FT4 \u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0432 2019 \u0433\u043e\u0434\u0443 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 FT8. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0446\u0435\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430: \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 QSO \u0437\u0430 \u0441\u0447\u0451\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f; \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0440\u0430\u0434\u0438\u043e\u0441\u0432\u044f\u0437\u0435\u0439 \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0439.<\/p>\n<p>\u0418\u0437-\u0437\u0430 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u0443\u044e \u043f\u043e\u043b\u043e\u0441\u0443 \u0447\u0430\u0441\u0442\u043e\u0442.<\/p>\n<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 GFSK (Gaussian Frequency Shift Keying) \u2014 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u0443\u044e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u044e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0413\u0430\u0443\u0441\u0441\u0430. \u0426\u0438\u0444\u0440\u044b \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043d\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0440\u0438 FSK.<\/p>\n<h2>\u041e\u0431\u0449\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438<\/h2>\n<h3>FT8<\/h3>\n<ul>\n<li>\n<p>\u0426\u0438\u043a\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 15 \u0441\u0435\u043a\u0443\u043d\u0434;<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 6,09 \u0431\u0438\u0442\/\u0441;<\/p>\n<\/li>\n<li>\n<p>\u0428\u0438\u0440\u0438\u043d\u0430 \u043f\u043e\u043b\u043e\u0441\u044b 50 \u0413\u0446;<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f 77 \u0431\u0438\u0442 + 12-\u0431\u0438\u0442 CRC-14;<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438 \u043e\u0448\u0438\u0431\u043e\u043a LDPC (174,87);<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f 8-GFSK \u0441 \u0448\u0430\u0433\u043e\u043c 6.25\u0413\u0446;<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0440\u043e\u0433 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0434\u043e -24\u2026-26 \u0434\u0411 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0448\u0443\u043c\u0430.<\/p>\n<\/li>\n<\/ul>\n<h3>FT4<\/h3>\n<ul>\n<li>\n<p>\u0426\u0438\u043a\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 7.5 \u0441\u0435\u043a\u0443\u043d\u0434;<\/p>\n<\/li>\n<li>\n<p>\u0428\u0438\u0440\u0438\u043d\u0430 \u043f\u043e\u043b\u043e\u0441\u044b 90 \u0413\u0446;<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f 77 \u0431\u0438\u0442 + 12-\u0431\u0438\u0442 CRC-14;<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438 \u043e\u0448\u0438\u0431\u043e\u043a LDPC (174,87);<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f 4-GFSK \u0441 \u0448\u0430\u0433\u043e\u043c 23.4\u0413\u0446;<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0440\u043e\u0433 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0434\u043e -24\u2026-26 \u0434\u0411 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0448\u0443\u043c\u0430.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430<\/h2>\n<p> \u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, FT8 \u0438 FT4 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0441\u043e\u0431\u043e\u0439 \u00ab\u043c\u0430\u0442\u0440\u0435\u0448\u043a\u0443\u00bb, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043d\u0438\u0436\u0435. <\/p>\n<p>\u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 1. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 OSI \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/bc6\/955\/04b\/bc695504bc7d1e281fdce4c55429ddc1.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/bc6\/955\/04b\/bc695504bc7d1e281fdce4c55429ddc1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/bc6\/955\/04b\/bc695504bc7d1e281fdce4c55429ddc1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 1: \u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 (\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c OSI \u0443\u0441\u043b\u043e\u0432\u043d\u0430\u044f). <\/p>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 1.\u0410 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430; \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 1.B \u2014 \u0441\u0445\u0435\u043c\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<h2>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f<\/h2>\n<p> \u041f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0441\u0432\u044f\u0437\u0435\u0439 \u0432 FT8\/FT4 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0445 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0445.  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430\u043c, \u043f\u0440\u0438\u0435\u043c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u0447\u0435\u0442\u043d\u044b\u0435 \u0438 \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0435 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0438 (\u215b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 FT4) \u043c\u0438\u043d\u0443\u0442, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0435 \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u044b \u0438\u0437\u043b\u0443\u0447\u0430\u044e\u0442 \u0441\u0438\u0433\u043d\u0430\u043b, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0432 \u044d\u0442\u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0435\u043c \u0438 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u043b\u0443\u0448\u0430\u044e\u0449\u0438\u0445; \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043c\u0435\u043d\u0430 \u0440\u043e\u043b\u0435\u0439, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0432\u0448\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u043e\u0442\u0432\u0435\u0442 (\u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043d\u0443\u0436\u043d\u044b\u043c), \u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0448\u0438\u0435 \u0441\u0432\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0438 \u0442.\u0434. \u0446\u0438\u043a\u043b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f. \u041c\u043e\u0434\u0443\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439.<\/p>\n<p>\u041e\u0431\u043c\u0435\u043d \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0440\u0430\u0434\u0438\u043e\u043e\u0431\u043c\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u043e\u0432 \u0434\u0430\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u0443\u0448\u0430\u044e\u0442 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c.<\/p>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 \u0441\u0432\u044f\u0437\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:00-00:15<\/p>\n<\/td>\n<td>\n<p align=\"left\">CQ R3AAA KO85<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442 \u0438\u0437 \u041c\u043e\u0441\u043a\u0432\u044b (\u043b\u043e\u043a\u0430\u0442\u043e\u0440 KO85), \u0441 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u043c R3AAA \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u0442 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:15-00:30<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA R9FXX LO87<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442 \u0438\u0437 \u041f\u0435\u0440\u043c\u0438 (\u043b\u043e\u043a\u0430\u0442\u043e\u0440 LO87) \u0441 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u043c R9FXX<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:30-00:45<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX R3AAA -1<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA \u0434\u0430\u0435\u0442 \u0440\u0430\u043f\u043e\u0440\u0442 \u0434\u043b\u044f R9FXX \u0432 -1 dB \u043f\u043e SNR<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:45-01:00<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA R9FXX R-4<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX \u0434\u0430\u0435\u0442 \u0440\u0430\u043f\u043e\u0440\u0442 \u0434\u043b\u044f R3AAA \u0432 -4 dB \u043f\u043e SNR<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">01:00-01:15<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX R3AAA RR73<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u0440\u0438\u0435\u043c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">01:15-01:30<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA R9FXX 73<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 73<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p> \u041e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438 \u043d\u0430\u043d\u044f\u043b\u043e 1 \u043c\u0438\u043d\u0443\u0442\u0443 30 \u0441\u0435\u043a\u0443\u043d\u0434.  <\/p>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 \u0441\u0432\u044f\u0437\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:00-00:15<\/p>\n<\/td>\n<td>\n<p align=\"left\">CQ R3AAA KO85<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442 \u0438\u0437 \u041c\u043e\u0441\u043a\u0432\u044b (\u043b\u043e\u043a\u0430\u0442\u043e\u0440 KO85), \u0441 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u043c R3AAA \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u0442 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:15-00:30<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA R9FXX R-4<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX \u0434\u0430\u0435\u0442 \u0440\u0430\u043f\u043e\u0440\u0442 \u0434\u043b\u044f R3AAA \u0432 -4 dB \u043f\u043e SNR<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:30-00:45<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX R3AAA R-1<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA \u0434\u0430\u0435\u0442 \u0440\u0430\u043f\u043e\u0440\u0442 \u0434\u043b\u044f R9FXX \u0432 -1 dB \u043f\u043e SNR<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:45-01:00<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA R9FXX RR73<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u0440\u0438\u0435\u043c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">01:00-01:15<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX R3AAA 73<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 73<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p> \u0421\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0430\u043d\u0441\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043a\u043e\u0433\u0434\u0430 \u0443 \u0434\u0430\u043b\u044c\u043d\u0435\u0433\u043e \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u044f\u0437\u044c. <\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043a\u043e\u0433\u0434\u0430 \u043a\u0442\u043e-\u0442\u043e \u0438\u0437 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043e\u0441\u043b\u0430\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u0441\u0435\u0430\u043d\u0441 \u0441\u0432\u044f\u0437\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0435\u0430\u043d\u0441\u0430 \u0440\u0430\u0434\u0438\u043e\u0441\u0432\u044f\u0437\u0438 R9FEU \u0441 R1CDY:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u044f UTC<\/p>\n<\/td>\n<td>\n<p align=\"left\">SNR<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0394t<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0427\u0430\u0441\u0442\u043e\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">141945<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tx<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">CQ R9FEU LO87<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">142000<\/p>\n<\/td>\n<td>\n<p align=\"left\">-3<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1001<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FEU R1CDY KP40<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">142015<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tx<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">R1CDY R9FEU -03<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">142030<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1001<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FEU R1CDY R-17<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">142045<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tx<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">R1CDY R9FEU RR73<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">142100<\/p>\n<\/td>\n<td>\n<p align=\"left\">-9<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1001<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FEU R1CDY 73<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p> \u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 \u0440\u0430\u0434\u0438\u043e\u0441\u0432\u044f\u0437\u0438 R9FEU c UA3DOI: <\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u044f UTC<\/p>\n<\/td>\n<td>\n<p align=\"left\">SNR<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0394t<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0427\u0430\u0441\u0442\u043e\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">141745<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tx<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">CQ R9FEU LO87<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">141800<\/p>\n<\/td>\n<td>\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1001<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FEU UA3DOI -01<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">141815<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tx<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">UA3DOI R9FEU R+08<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">141830<\/p>\n<\/td>\n<td>\n<p align=\"left\">-5<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1001<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FEU UA3DOI RR73<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">141845<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tx<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">UA3DOI R9FEU 73<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/h2>\n<p> \u041d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0440\u0430\u0441\u0447\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f CRC-14. <\/p>\n<h3>\u0424\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/h3>\n<p> \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 FTX \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430: <\/p>\n<ul>\n<li>\n<p>\u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u0431\u043c\u0435\u043d (QSO);<\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.<\/p>\n<\/li>\n<\/ul>\n<p> \u0412\u0441\u0435 \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0433\u0440\u0443\u043f\u043f: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 (<code>call_to<\/code>), \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 (<code>call_de<\/code>), \u0434\u0430\u043d\u043d\u044b\u0435 (<code>extra<\/code>). \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f SNR-\u0440\u0430\u043f\u043e\u0440\u0442, \u0447\u0435\u0442\u044b\u0440\u0435\u0445-\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u044b roger\/73. <\/p>\n<h3>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/h3>\n<p> \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043f\u043e\u043b\u0435\u0439: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0438 \u0434\u043e\u043f. \u0434\u0430\u043d\u043d\u044b\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u043f\u043e\u0440\u0442 \u0438\u043b\u0438 \u0433\u0435\u043e \u0434\u0430\u043d\u043d\u044b\u0435). <\/p>\n<p>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043b\u043e\u0442\u043d\u043e \u0443\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 77 \u0431\u0438\u0442.<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0438 \u0443\u0442\u0438\u043b\u0438\u0442, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">import string   FTX_CHAR_TABLE_NUMERIC = string.digits FTX_CHAR_TABLE_LETTERS = string.ascii_uppercase FTX_CHAR_TABLE_ALPHANUM = f\"{FTX_CHAR_TABLE_NUMERIC}{FTX_CHAR_TABLE_LETTERS}\" FTX_CHAR_TABLE_LETTERS_SPACE = f\" {FTX_CHAR_TABLE_LETTERS}\" FTX_CHAR_TABLE_ALPHANUM_SPACE = f\" {FTX_CHAR_TABLE_ALPHANUM}\" FTX_CHAR_TABLE_ALPHANUM_SPACE_SLASH = f\"{FTX_CHAR_TABLE_ALPHANUM_SPACE}\/\" FTX_CHAR_TABLE_FULL = f\"{FTX_CHAR_TABLE_ALPHANUM_SPACE}+-.\/?\"   def charn(c: int, table: str) -&gt; str:    return table[c]   def nchar(c: str, table: str) -&gt; int:    return table.find(c) <\/code><\/pre>\n<p>\u0412 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 FTX \u0430\u043b\u0444\u0430\u0432\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 ASCII \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u00ab<code>ABCDEFGHIJKLMNOPQRSTUVWXYZ<\/code>\u00bb, \u0446\u0438\u0444\u0440 \u00ab<code>0123456789<\/code>\u00bb \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u00ab<code>+-.\/?<\/code>\u00bb, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u043d\u0430\u043a \u043f\u0440\u043e\u0431\u0435\u043b\u0430.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 <code>FTX_CHAR_TABLE_FULL<\/code>.<\/p>\n<p>\u0412 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0435 FTX \u0441\u0438\u043c\u0432\u043e\u043b\u0443 A \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 1, B \u2014 2 \u0438 \u0442.\u0434.. \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0438\u0437 ANSI \u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442 FTX \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>nchar<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 <code>c<\/code> \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 table, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <code>FTX_CHAR_TABLE_*<\/code>. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>-1<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 FTX \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f charn, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0448\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 ANSI \u0441\u0438\u043c\u0432\u043e\u043b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 <code>c<\/code> \u0432 <code>table<\/code>.<\/p>\n<h4>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430<\/h4>\n<p> \u0414\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e 6-\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e. \u041a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0432\u0438\u0434\u0443. \u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u043a\u0438\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0435 \u0438\u0437 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code>3DA0XYZ<\/code> \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0432 <code>3D0XYZ<\/code>, \u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0435 <code>3XA0XYZ<\/code> \u0432 <code>QA0XYZ<\/code>. <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430:<\/p>\n<pre><code class=\"python\">FTX_BASECALL_CHAR_MAP = [    FTX_CHAR_TABLE_ALPHANUM_SPACE,    FTX_CHAR_TABLE_ALPHANUM,    FTX_CHAR_TABLE_NUMERIC,    FTX_CHAR_TABLE_LETTERS_SPACE,    FTX_CHAR_TABLE_LETTERS_SPACE,    FTX_CHAR_TABLE_LETTERS_SPACE ]   def pack_basecall(callsign: str) -&gt; int:    if (length := len(callsign)) &gt; 2:        if callsign.startswith(\"3DA0\") and 4 &lt; length &lt;= 7:            cs_6 = f\"3D0{callsign[4:]}\"        elif callsign.startswith(\"3X\") and callsign[2].isalpha() and length &lt;= 7:            cs_6 = f\"Q{callsign[2:]}\"        elif callsign[2].isdigit() and length &lt;= 6:            cs_6 = callsign        elif callsign[1].isdigit() and length &lt;= 5:            cs_6 = f\" {callsign}\"        else:            cs_6 = \" \" * 6         cs_6 = cs_6 + \" \" * (6 - len(cs_6))         n_chars = list(map(nchar, cs_6, FTX_BASECALL_CHAR_MAP))         if all(nc &gt;= 0 for nc in n_chars):            n = reduce(lambda a, it: a * len(it[0]) + it[1], zip(FTX_BASECALL_CHAR_MAP, n_chars), 0)            return n    return -1 <\/code><\/pre>\n<p>\u0412 <code>FTX_BASECALL_CHAR_MAP<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043e\u0432, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0435\u0440\u0432\u0430\u044f \u0446\u0438\u0444\u0440\u043e-\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u0430\u044f \u043b\u0438\u0442\u0435\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439; \u0442\u0440\u0435\u0442\u044c\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0434\u0430\u043b\u0435\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u043e\u0431\u0435\u043b.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>pack_basecall<\/code> \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c, \u0434\u043b\u0438\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0443\u043c 3 \u0437\u043d\u0430\u043a\u0430. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043e 6-\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e. \u0412 <code>n_chars<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 <code>FTX_BASECALL_CHAR_MAP<\/code> \u0441\u0438\u043c\u0432\u043e\u043b\u044b; \u0437\u0430\u0442\u0435\u043c, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0443\u0442\u0435\u043c \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043e\u0432.<\/p>\n<p>\u041f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e <code>R1ABC<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a \u0432\u0438\u0434\u0443 &#8216;<code> R1ABC<\/code>&#8216;, \u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432: <code>[0, 27, 1, 1, 2, 3]<\/code>; \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: <code>5334879<\/code> (<code>0b10100010110011101011111<\/code>).<\/p>\n<h4>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430<\/h4>\n<p> \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u0441\u0435 \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0447\u0442\u043e \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. <\/p>\n<pre><code class=\"python\">NTOKENS = 2063592 MAX22 = 4194304   FTX_BASECALL_SUFFIX_FMT = {    1: \"{cs}\/R\",    2: \"{cs}\/P\", } FTX_TOKEN_STR = {    v: k for k, v in FTX_TOKEN_CODE.items() }   def unpack_callsign(cs_28: int, flags: bool, suffix: int) -&gt; typing.Optional[str]:    if cs_28 &lt; NTOKENS:        if cs_28 &lt;= 2:            return FTX_TOKEN_STR.get(cs_28)        if cs_28 &lt;= 1002:            return f\"CQ_{cs_28 - 3:03}\"        if cs_28 &lt;= 532443:            n = cs_28 - 1003            aaaa = \"\"            for i in range(4):                ct = FTX_CHAR_TABLE_LETTERS_SPACE                ct_l = len(ct)                aaaa = charn(n % ct_l, ct) + aaaa                n \/\/= ct_l             return f\"CQ_{aaaa.strip()}\"        return None     cs_28 -= NTOKENS    n = cs_28 - MAX22     callsign = \"\"    for ct in reversed(FTX_BASECALL_CHAR_MAP):        ct_l = len(ct)        callsign = charn(n % ct_l, ct) + callsign        n \/\/= ct_l     callsign = callsign.strip()     if callsign.startswith(\"3D0\") and callsign[3] != \" \":        result = f\"3DA0{callsign[3:]}\"    elif callsign[0] == \"Q\" and callsign[1].isalpha():        result = f\"3X{callsign[1:]}\"    else:        result = callsign     if len(result) &lt; 3:        return None     if flags:        if fmt := FTX_BASECALL_SUFFIX_FMT.get(suffix):            return fmt.format(cs=result)        raise ValueError     return result <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>unpack_callsign<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0443 \u0431\u0438\u0442 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443, \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, <code>reversed(FTX_BASECALL_CHAR_MAP)<\/code>. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u0442\u0430\u043a\u0438\u043c\u0438 \u043a\u0430\u043a <code>CQ<\/code>\/<code>DE<\/code>\/<code>QRZ<\/code>, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 <code>FTX_TOKEN_STR<\/code>.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u0432, \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 flags (\u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b <code>\/R<\/code>, <code>\/P<\/code> \u0438\u0437 <code>FTX_CALLSIGN_SUFFIX_FMT<\/code>). \u0414\u043b\u0438\u043d\u043d\u044b\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0435, \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0448\u0438\u0435\u0441\u044f \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<h4>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u0446\u0438\u0438<\/h4>\n<p> \u041f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0432\u044f\u0437\u0438, \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u044b \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430\u043c\u0438 (QTH Loc), \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u043e\u0431\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0447\u0435\u0440\u0435\u0434\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u0430\u0440 \u0431\u0443\u043a\u0432 \u0438 \u0446\u0438\u0444\u0440, \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u0440\u0430 \u0443\u0442\u043e\u0447\u043d\u044f\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. <\/p>\n<p>\u0420\u0430\u0441\u0447\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u043f\u0430\u0440\u0430 \u0431\u0443\u043a\u0432:<\/p>\n<ul>\n<li>\n<p>\u0434\u043e\u043b\u0433\u043e\u0442\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 20, \u0446\u0435\u043b\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0442 0 \u0434\u043e 17 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0443\u043a\u0432\u0430\u043c\u0438 \u043e\u0442 <code>A<\/code> \u0434\u043e <code>R<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0448\u0438\u0440\u043e\u0442\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 10, \u0446\u0435\u043b\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0442 0 \u0434\u043e 17 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0443\u043a\u0432\u0430\u043c\u0438 \u043e\u0442 <code>A<\/code> \u0434\u043e <code>R<\/code>;<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u043f\u0430\u0440\u0430 \u0446\u0438\u0444\u0440:<\/p>\n<ul>\n<li>\n<p>\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0434\u043e\u043b\u0433\u043e\u0442\u044b \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 20 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 2;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0448\u0438\u0440\u043e\u0442\u044b \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 10 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 1.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<pre><code class=\"python\">FTX_CHAR_TABLE_GRID_LETTERS = FTX_CHAR_TABLE_LETTERS[:18] FTX_GRID_CHAR_MAP = [    FTX_CHAR_TABLE_GRID_LETTERS,    FTX_CHAR_TABLE_GRID_LETTERS,    FTX_CHAR_TABLE_NUMERIC,    FTX_CHAR_TABLE_NUMERIC ]   def pack_grid(grid4: str) -&gt; int:    n_chars = list(map(nchar, grid4, FTX_GRID_CHAR_MAP))    n = reduce(lambda a, it: a * len(it[0]) + it[1], zip(FTX_GRID_CHAR_MAP, n_chars), 0)    return n <\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442 <code>FTX_CHAR_TABLE_GRID_LETTERS<\/code> \u0438 \u043a\u0430\u0440\u0442\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f <code>FTX_GRID_CHAR_MAP<\/code>.<\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>pack_basecall<\/code>, \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>pack_grid<\/code> \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0432 \u0447\u0438\u0441\u043b\u043e; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 <code>KO85<\/code> (\u041c\u043e\u0441\u043a\u0432\u0430) \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d \u0432 <code>19485<\/code> (<code>0b100110000011101<\/code>).<\/p>\n<h4>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u043f\u043e\u0440\u0442\u0430<\/h4>\n<p> \u0422\u0430\u043a \u043a\u0430\u043a \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0438\u043b\u0438 \u0440\u0430\u043f\u043e\u0440\u0442, \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 roger-\u043e\u0442\u0432\u0435\u0442; \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c \u0442\u0438\u043f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<pre><code class=\"python\">FTX_MAX_GRID_4 = 32400 FTX_RESPONSE_EXTRAS_CODE = {    \"\": FTX_MAX_GRID_4 + 1,    \"RRR\": FTX_MAX_GRID_4 + 2,    \"RR73\": FTX_MAX_GRID_4 + 3,    \"73\": FTX_MAX_GRID_4 + 4, }   def pack_extra(extra: str) -&gt; int:    if id_resp := FTX_RESPONSE_EXTRAS_CODE.get(extra):        return id_resp    if re.match(r\"^(([A-R]{2})([0-9]{2}))$\", extra):        return pack_grid(extra)    if not (report := re.match(r\"^(R){0,1}([\\+\\-]{0,1}[0-9]+)$\", extra)):        raise FTXInvalidRST     r_sign, r_val = report.groups()    i_report = int(r_val) + 35    return (FTX_MAX_GRID_4 + i_report) | (0x8000 if r_sign is not None else 0) <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>pack_extra<\/code> \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u0438\u0437\u043d\u0430\u043a, \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 roger-\u043e\u0442\u0432\u0435\u0442\u043e\u043c, \u0434\u0430\u043b\u0435\u0435, \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u043c\u0443 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u0441 \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u043c, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432 \u0440\u0430\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>pack_grid<\/code>; \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a SNR-\u0440\u0430\u043f\u043e\u0440\u0442.<\/p>\n<h4>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u043f\u043e\u0440\u0442\u0430 \u0438 \u043b\u043e\u043a\u0430\u0446\u0438\u0438<\/h4>\n<p> \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u043f\u043e\u0440\u0442\u0430\/\u043b\u043e\u043a\u0430\u0446\u0438\u0438, \u043a\u0430\u043a \u0438 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0442\u0430\u043a\u0436\u0435 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. <\/p>\n<pre><code class=\"python\">FTX_RESPONSE_EXTRAS_STR = {    v: k for k, v in FTX_RESPONSE_EXTRAS_CODE.items() }   def unpack_extra(ex_16: int, is_report: bool) -&gt; typing.Optional[str]:    if ex_16 &lt;= FTX_MAX_GRID_4:        n = ex_16        dst = \"\"        for ct in reversed(FTX_GRID_CHAR_MAP):            ct_l = len(ct)            dst = charn(n % ct_l, ct) + dst            n \/\/= ct_l         return f\"{'R ' if is_report else ''}{dst}\"    else:        if irpt := FTX_RESPONSE_EXTRAS_STR.get(ex_16):            return irpt         return f\"{'R' if is_report else ''}{int(ex_16 - FTX_MAX_GRID_4 - 35):+03}\" <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>unpack_extra<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 SNR-\u0440\u0430\u043f\u043e\u0440\u0442\u043e\u043c. \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043a\u043e\u043d\u0446\u0430 \u043a \u043d\u0430\u0447\u0430\u043b\u0443.<\/p>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0440\u0430\u043f\u043e\u0440\u0442\u0430, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0438\u0437 <code>FTX_RESPONSE_EXTRAS_STR<\/code>.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u043b\u0438\u0431\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043b\u043e\u043a\u0430\u0446\u0438\u0438, \u043b\u0438\u0431\u043e \u0440\u0430\u043f\u043e\u0440\u0442 (\u0438\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 RR73).<\/p>\n<h4>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/h4>\n<p> \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0435\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: <\/p>\n<ul>\n<li>\n<p>\u043e\u0431\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 \u0438\u043b\u0438 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0440\u0430\u043f\u043e\u0440\u0442\/roger-\u0441\u0438\u0433\u043d\u0430\u043b.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"python\">NTOKENS = 2063592 MAX22 = 4194304 FTX_TOKEN_CODE = {    \"DE\": 0,    \"QRZ\": 1,    \"CQ\": 2 }   def byte(i: int) -&gt; int:    return i &amp; 0xff   def endswith_any(s: str, *tails: str) -&gt; bool:     return any(s.endswith(tail) for tail in tails)   def pack_callsign(callsign: str) -&gt; typing.Tuple[int, int]:    shift = 0    if token := FTX_TOKEN_CODE.get(callsign):        return token, shift     length = len(callsign)    if callsign.startswith(\"CQ_\") and length &lt; 8:        rest = callsign[3:]        rest_len = len(rest)         if rest_len == 3 and rest.isdigit():            return int(rest) + 3, shift         if 1 &lt;= rest_len &lt;= 4:            nlet = 0            correct = True            for c in rest:                if (n := nchar(c, FTX_CHAR_TABLE_LETTERS_SPACE)) == -1:                    correct = False                    break                nlet = nlet * 27 + n             if correct:                return nlet + 1003, shift     length_base = length    if endswith_any(callsign, \"\/P\", \"\/R\"):        shift = 1        length_base = length - 2     if (n28 := pack_basecall(callsign[:length_base])) &gt;= 0:        return dword(NTOKENS + MAX22 + n28), shift     raise FTXPackCallsignError   def ftx_message_encode_std(call_to: str, call_de: str, extra: str) -&gt; typing.ByteString:    b28_to, sh_to = pack_callsign(call_to)    if b28_to &lt; 0:        raise FTXErrorCallSignTo     b28_de, sh_de = pack_callsign(call_de)    if b28_de &lt; 0:        raise FTXErrorCallSignDe     suffix = 1    if any(cs.endswith(\"\/P\") for cs in (call_to, call_de)):        suffix = 2        if any(cs.endswith(\"\/R\") for cs in (call_to, call_de)):            raise FTXErrorSuffix     if call_to == \"CQ\" and \"\/\" in call_de and not endswith_any(call_de, \"\/P\", \"\/R\"):        raise FTXErrorCallSignDe     b16_extra = pack_extra(extra)     b29_to = dword(b28_to &lt;&lt; 1 | sh_to)    b29_de = dword(b28_de &lt;&lt; 1 | sh_de)     if endswith_any(call_to, \"\/P\", \"\/R\"):        b29_to |= 1        if call_to.endswith(\"\/P\"):            suffix = 2     bytes = [        byte(b29_to &gt;&gt; 21),        byte(b29_to &gt;&gt; 13),        byte(b29_to &gt;&gt; 5),        byte(b29_to &lt;&lt; 3) | byte(b29_de &gt;&gt; 26),        byte(b29_de &gt;&gt; 18),        byte(b29_de &gt;&gt; 10),        byte(b29_de &gt;&gt; 2),        byte(b29_de &lt;&lt; 6) | byte(b16_extra &gt;&gt; 10),        byte(b16_extra &gt;&gt; 2),        byte(b16_extra &lt;&lt; 6) | byte(suffix &lt;&lt; 3)    ]    return bytearray(b for b in bytes) <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>ftx_message_encode_std<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0442\u0440\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u041f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>pack_callsign<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>CQ<\/code> \u043f\u0440\u0438 \u043e\u0431\u0449\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435), \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438, \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0432 <code>FTX_TOKEN_CODE<\/code>; \u0434\u0430\u043b\u0435\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0431\u043e\u0440 \u0431\u0438\u0442 \u0432 \u0432\u0438\u0434\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442.<\/p>\n<p>\u0421\u0443\u0444\u0444\u0438\u043a\u0441\u044b \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043e\u0442\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u0431\u043b\u043e\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041a\u043e\u0434 <code>byte(suffix &lt;&lt; 3)<\/code> \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u00ab1\u00bb \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u00ab2\u00bb  \u2014 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0435\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 DX-\u043f\u0435\u0434\u0438\u0446\u0438\u0438.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0442\u0438\u043f\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/p>\n<ul>\n<li>\n<p><code>FTX_MESSAGE_TYPE_FREE_TEXT<\/code> \u2014 1;<\/p>\n<\/li>\n<li>\n<p><code>FTX_MESSAGE_TYPE_DXPEDITION<\/code> \u2014 2;<\/p>\n<\/li>\n<li>\n<p><code>FTX_MESSAGE_TYPE_EU_VHF<\/code> \u2014 3;<\/p>\n<\/li>\n<li>\n<p><code>FTX_MESSAGE_TYPE_ARRL_FD<\/code> \u2014 4;<\/p>\n<\/li>\n<li>\n<p><code>FTX_MESSAGE_TYPE_TELEMETRY<\/code> \u2014 6;<\/p>\n<\/li>\n<li>\n<p><code>FTX_MESSAGE_TYPE_CONTESTING<\/code> \u2014 7;<\/p>\n<\/li>\n<li>\n<p><code>FTX_MESSAGE_TYPE_STANDARD<\/code> \u2014 8;<\/p>\n<\/li>\n<li>\n<p><code>FTX_MESSAGE_TYPE_ARRL_RTTY <\/code> \u2014 10;<\/p>\n<\/li>\n<li>\n<p><code>FTX_MESSAGE_TYPE_NONSTD_CALL <\/code> \u2014 11;<\/p>\n<\/li>\n<li>\n<p><code>FTX_MESSAGE_TYPE_WWROF <\/code> \u2014 12.<\/p>\n<\/li>\n<\/ul>\n<p> \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439: <\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (hex)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">CQ R1ABC KO85 <\/p>\n<\/td>\n<td>\n<p align=\"left\">00000020587223930748 <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">R2CBA R1ABC R+01 <\/p>\n<\/td>\n<td>\n<p align=\"left\">0b136da0587223bfad08 <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">R1ABC R2CBA -20 <\/p>\n<\/td>\n<td>\n<p align=\"left\">0b0e4470589b6d1fa7c8 <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">R2CBA R1ABC RR73 <\/p>\n<\/td>\n<td>\n<p align=\"left\">0b136da05872239fa4c8 <\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/h4>\n<p> \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0445 \u0436\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. <\/p>\n<pre><code class=\"python\">def ftx_message_decode_std(payload: typing.ByteString) -&gt; typing.Tuple[str, str, str]:    b29_to = payload[0] &lt;&lt; 21    b29_to |= payload[1] &lt;&lt; 13    b29_to |= payload[2] &lt;&lt; 5    b29_to |= payload[3] &gt;&gt; 3     b29_de = (payload[3] &amp; 0x07) &lt;&lt; 26    b29_de |= payload[4] &lt;&lt; 18    b29_de |= payload[5] &lt;&lt; 10    b29_de |= payload[6] &lt;&lt; 2    b29_de |= payload[7] &gt;&gt; 6     r_flag = (payload[7] &amp; 0x20) &gt;&gt; 5     b16_extra = (payload[7] &amp; 0x1F) &lt;&lt; 10    b16_extra |= payload[8] &lt;&lt; 2    b16_extra |= payload[9] &gt;&gt; 6     cs_flags = (payload[9] &gt;&gt; 3) &amp; 0x07     if (call_to := unpack_callsign(b29_to &gt;&gt; 1, bool(b29_to &amp; 1), cs_flags)) is None:        raise FTXErrorCallSignTo    if (call_de := unpack_callsign(b29_de &gt;&gt; 1, bool(b29_de &amp; 1), cs_flags)) is None:        raise FTXErrorCallSignDe    if (extra := unpack_extra(b16_extra, bool(r_flag &amp; 1))) is None:        raise FTXErrorGrid    return call_to, call_de, extra <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>ftx_message_decode_std<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0441\u0442\u0440\u043e\u043a\u0443 \u0431\u0430\u0439\u0442, \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u043c\u0438 \u0438 \u0440\u0430\u043f\u043e\u0440\u0442\u043e\u043c\/\u043b\u043e\u043a\u0430\u0446\u0438\u0435\u0439. \u0414\u0430\u043b\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>unpack_callsign<\/code> \u0438 <code>unpack_extra<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438\u0437 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0432\u0438\u0434\u0435 \u043b\u043e\u043a\u0430\u0446\u0438\u0438\/\u043b\u0430\u043f\u043e\u0440\u0442\u0430.<\/p>\n<h4>\u0422\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/h4>\n<p> \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 FTX \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0445\u0441\u044f \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c\u0443 \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043e\u0431\u043c\u0435\u043d\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438. \u0422\u0430\u043a \u043a\u0430\u043a \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u0430\u0439\u0442 \u0438  \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 77 \u0431\u0438\u0442, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0431\u0438\u0442, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u043e\u0439 \u0434\u043e 12 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. <\/p>\n<pre><code class=\"python\">FTX_MESSAGE_FREE_TEXT_LEN = 12 FTX_MESSAGE_TELEMETRY_LEN = 9   def ftx_message_encode_free(text: str) -&gt; typing.ByteString:    if len(text) &gt; FTX_MESSAGE_FREE_TEXT_LEN:        raise FTXErrorTooLong     payload = bytearray(b\"\\x00\" * FTX_MESSAGE_TELEMETRY_LEN)    text = (\" \" * (FTX_MESSAGE_FREE_TEXT_LEN - len(text))) + text    for c in text:        if (cid := nchar(c, FTX_CHAR_TABLE_FULL)) == -1:            raise FTXErrorInvalidChar         rem = cid        for i in reversed(range(FTX_MESSAGE_TELEMETRY_LEN)):            rem += payload[i] * len(FTX_CHAR_TABLE_FULL)            payload[i] = byte(rem)            rem &gt;&gt;= 8     return ftx_message_encode_telemetry(payload)   def ftx_message_encode_telemetry(payload: typing.ByteString) -&gt; typing.ByteString:    if len(payload) &gt; FTX_MESSAGE_TELEMETRY_LEN:        raise FTXErrorTooLong     carry = 0    data = bytearray(b\"\\x00\" * len(payload))    for i, t_byte in enumerate(reversed(payload)):        data[-i - 1] = byte((carry &gt;&gt; 7) | (t_byte &lt;&lt; 1))        carry = byte(t_byte &amp; 0x80)     return data <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>ftx_message_encode_free<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0443 \u0431\u0438\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438\u0437 text, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <code>FTX_CHAR_TABLE_FULL<\/code>, \u0432 9-\u0438 \u0431\u0438\u0442\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0435\u0433\u043e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 <code>ftx_message_encode_telemetry<\/code>. \u041f\u0435\u0440\u0435\u0434 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c  \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043e 12-\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u0443\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u0442\u0440\u043e\u043a\u0430 \u00ab<code>0123456789AB<\/code>\u00bb \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442 (<code>payload<\/code>) \u00ab<code>000a7271499bcb384a<\/code>\u00bb.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>ftx_message_encode_telemetry<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442, \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044b \u0432\u043b\u0435\u0432\u043e \u043d\u0430 1 \u0431\u0438\u0442, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435: \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u044e\u0442\u0441\u044f \u043d\u0430 1 \u0431\u0438\u0442 \u0432\u043f\u0440\u0430\u0432\u043e, \u0430 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 <code>FTX_CHAR_TABLE_FULL<\/code> \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0443.<\/p>\n<pre><code class=\"python\">def ftx_message_decode_telemetry(data: typing.ByteString) -&gt; typing.Generator[int, None, None]:    carry = 0    for p_byte in data:        yield byte((carry &lt;&lt; 7) | (p_byte &gt;&gt; 1))        carry = byte(p_byte &amp; 0x01)   def ftx_message_decode_free(data: typing.ByteString) -&gt; str:    payload = bytearray(ftx_message_decode_telemetry(data))    text = \" \"    for _ in range(FTX_MESSAGE_FREE_TEXT_LEN):        rem = 0        for i in range(FTX_MESSAGE_TELEMETRY_LEN):            rem = (rem &lt;&lt; 8) | payload[i]            payload[i] = byte(rem \/\/ 42)            rem = rem % 42         text = charn(rem, FTX_CHAR_TABLE_FULL) + text     return text.strip() <\/code><\/pre>\n<h3>CRC-14<\/h3>\n<h4>\u0420\u0430\u0441\u0447\u0435\u0442 CRC-14<\/h4>\n<p> \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 FTX \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0440\u0430\u0441\u0447\u0435\u0442 14-\u0438 \u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 (\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b) \u2014 CRC-14. \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0444\u0430\u043a\u0442 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u0435; \u0441\u0438\u0433\u043d\u0430\u043b\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u0430\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435. <\/p>\n<p>\u041f\u0440\u0438 14-\u0438 \u0431\u0438\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u0435, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c CRC-14 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445, \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e. \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 CRC-8, \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u043e 4 \u0431\u0438\u0442 \u043e\u0448\u0438\u0431\u043e\u043a, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u0443\u044e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 (1\/16384 \u043f\u0440\u043e\u0442\u0438\u0432 1\/256 \u0434\u043b\u044f CRC-8). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c CRC-14 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c\u044e; \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c CRC-8 \u0438 \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u043a \u043d\u0435\u043c\u0443, \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u043a \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c.<\/p>\n<pre><code class=\"python\">FTX_LDPC_K = 91 FTX_LDPC_M = 83 FTX_LDPC_N = FTX_LDPC_K + FTX_LDPC_M FTX_LDPC_N_BYTES = ((FTX_LDPC_N + 7) \/\/ 8) FTX_LDPC_K_BYTES = ((FTX_LDPC_K + 7) \/\/ 8)   FTX_CRC_POLYNOMIAL = 0x2757 FTX_CRC_WIDTH = 14 FTX_PAYLOAD_BITS = 96 FTX_MESSAGE_BITS = FTX_PAYLOAD_BITS - FTX_CRC_WIDTH TOPBIT = 1 &lt;&lt; (FTX_CRC_WIDTH - 1)   def ftx_compute_crc(message: typing.ByteString, num_bits: int) -&gt; int:    remainder = 0    idx_byte = 0     for idx_bit in range(num_bits):        if idx_bit % 8 == 0:            remainder ^= message[idx_byte] &lt;&lt; (FTX_CRC_WIDTH - 8)            idx_byte += 1         if remainder &amp; TOPBIT != 0:            remainder = (remainder &lt;&lt; 1) ^ FTX_CRC_POLYNOMIAL        else:            remainder = remainder &lt;&lt; 1     return remainder &amp; ((TOPBIT &lt;&lt; 1) - 1)   def ftx_add_crc(payload: typing.ByteString) -&gt; typing.ByteString:    message = payload + (b\"\\x00\" * (FTX_LDPC_K_BYTES - len(payload)))    message[-3] &amp;= 0xf8    message[-2] = 0     checksum = ftx_compute_crc(message, FTX_MESSAGE_BITS)     message[-3] |= byte(checksum &gt;&gt; 11)    message[-2] = byte(checksum &gt;&gt; 3)    message[-1] = byte(checksum &lt;&lt; 5)     return message <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>ftx_compute_crc<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f CRC-14. \u041f\u043e\u043b\u0438\u043d\u043e\u043c, \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0432 <code>FTX_CRC_POLYNOMIAL<\/code> \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>0x2757<\/code> (<code>0b10011101010111<\/code>).<\/p>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>ftx_add_crc<\/code> \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 ftx_compute_crc; \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0433\u043e\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0434 \u0434\u043b\u0438\u043d\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 12 \u0431\u0430\u0439\u0442 (98 \u0431\u0438\u0442), \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0431\u0430\u0439\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 <code>00000020587223930748<\/code> (\u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 <code>CQ R1ABC KO85<\/code>): <code>11173<\/code> (<code>0x2ba5<\/code>); \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u043a \u0434\u0430\u043d\u043d\u044b\u043c: <code>0000002058722393074d74a0<\/code>.<\/p>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 CRC-14<\/h4>\n<p> \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0441\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434 CRC-14, \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043e\u0442 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0447\u0435\u0442 CRC-14 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441 \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u043e\u0439. <\/p>\n<pre><code class=\"python\">def ftx_crc(msg1: typing.ByteString, msglen: int) -&gt; typing.ByteString:    div = [1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1]     msg = bytearray(b\"\\x00\" * (FTX_LDPC_M + FTX_CRC_WIDTH))    for i in range(msglen + FTX_CRC_WIDTH):        if i &lt; 77:            msg[i] = msg1[i]     for i in range(msglen):        if msg[i] != 0:            for j, d in enumerate(div):                msg[i + j] = msg[i + j] ^ d     return msg[msglen:msglen + FTX_CRC_WIDTH]   def ftx_check_crc(a91: typing.ByteString) -&gt; bool:    out1 = ftx_crc(a91, 82)    for i, b in enumerate(out1):        if b != a91[FTX_LDPC_K - FTX_CRC_WIDTH + i]:            return False    return True <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>ftx_check_crc<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 CRC-14 \u0432 \u0431\u043b\u043e\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 <code>a91<\/code>, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044f 82 \u0431\u0438\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0433\u043e 91 \u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 CRC-14 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\u0435 <code>a91<\/code>.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<h3>LDPC (\u043d\u0438\u0437\u043a\u043e\u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u043d\u044b\u0439 \u043a\u043e\u0434)<\/h3>\n<p> LDPC (Low-Density Parity-Check code) \u2014 \u043a\u043e\u0434 \u0441 \u043c\u0430\u043b\u043e\u0439 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043d\u0430 \u0447\u0451\u0442\u043d\u043e\u0441\u0442\u044c. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0432\u044b\u0448\u0430\u044f \u043e\u0431\u0449\u0443\u044e \u043f\u043e\u043c\u0435\u0445\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c. <\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u043e\u0440\u0438\u0438 \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b LDPC \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u043e\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>\u0421 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0440\u0430\u0431\u043e\u0442\u044b LDPC \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c:<\/p>\n<ul>\n<li>\n<p>https:\/\/en.wikipedia.org\/wiki\/Low-density_parity-check_code<\/p>\n<\/li>\n<li>\n<p>https:\/\/habr.com\/ru\/articles\/453086\/<\/p>\n<\/li>\n<li>\n<p>https:\/\/habr.com\/ru\/articles\/830150\/<\/p>\n<\/li>\n<\/ul>\n<h4>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 LDPC<\/h4>\n<p> LDPC-\u043a\u043e\u0434 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0431\u043b\u043e\u0447\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u044c \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0435\u0434\u0438\u043d\u0438\u0446; \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0435\u0434\u0438\u043d\u0438\u0446 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0432\u0435\u043b\u0438\u043a\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043e\u0431\u0449\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0435. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/48d\/8a7\/ce5\/48d8a7ce590b56ffce372f0a162b5b2c.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/48d\/8a7\/ce5\/48d8a7ce590b56ffce372f0a162b5b2c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/48d\/8a7\/ce5\/48d8a7ce590b56ffce372f0a162b5b2c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2: \u0413\u0440\u0430\u0444 \u0422\u0430\u043d\u043d\u0435\u0440\u0430 \u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a LDPC. <\/p>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0445\u0435\u043c\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b LDPC-\u043a\u043e\u0434\u043e\u0432, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 LDPC-\u043a\u043e\u0434 (12, 8); \u0432 \u043a\u0440\u0443\u0433\u0430\u0445, \u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 1 \u0434\u043e 8 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430\u0445 \u0441 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u043e\u0442 1 \u0434\u043e 4 \u2014 \u0431\u0438\u0442\u044b \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438 \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0431\u0438\u0442\u043e\u043c \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438, \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e 2, \u0431\u044b\u043b \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 H \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u043e, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0431\u0438\u0442\u0430\u043c\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0430\u043d \u0431\u0438\u0442 \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438 (\u0442\u0430\u043a, \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043b\u0438\u043d\u0438\u044f\u043c\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u0438\u0442 \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d \u0441 1, 4,5, 7 \u0438 8 \u0431\u0438\u0442\u0430\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 [1 0 0 1 1 0 1 1]); \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0442\u043e\u0432 \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043e. \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 H \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0435\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0437\u043d\u0430\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0442\u044b \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0442 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e 2, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u043e\u0434\u0438\u043d \u0431\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0442\u043e\u0432 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438. \u0422\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u043d\u0434\u0440\u043e\u043c\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0441\u0430\u043c\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u044b\u0445 \u0431\u0438\u0442\u0430\u0445.<\/p>\n<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 FTX \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 LDPC(174, 87), \u0442\u043e \u0435\u0441\u0442\u044c \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f 87 \u0431\u0438\u0442 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u043d\u0430 \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u043f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u0438\u043b\u0438 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0438 \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0441\u0438\u0433\u043d\u0430\u043b \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0435 \u0431\u0438\u0442\u044b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438 LDPC-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<pre><code class=\"python\">FTX_LDPC_GENERATOR = [    [0x83, 0x29, 0xce, 0x11, 0xbf, 0x31, 0xea, 0xf5, 0x09, 0xf2, 0x7f, 0xc0],    [0x76, 0x1c, 0x26, 0x4e, 0x25, 0xc2, 0x59, 0x33, 0x54, 0x93, 0x13, 0x20],    [0xdc, 0x26, 0x59, 0x02, 0xfb, 0x27, 0x7c, 0x64, 0x10, 0xa1, 0xbd, 0xc0],    ...    [0x60, 0x8c, 0xc8, 0x57, 0x59, 0x4b, 0xfb, 0xb5, 0x5d, 0x69, 0x60, 0x00] ]   def parity8(x: int) -&gt; int:    for i in [4, 2, 1]:        x ^= x &gt;&gt; i    return byte(x % 2)   def ftx_encode(message: typing.ByteString) -&gt; typing.ByteString:    codeword = bytearray(message[i] if i &lt; FTX_LDPC_K_BYTES else 0 for i in range(FTX_LDPC_N_BYTES))     col_mask = 0x80 &gt;&gt; (FTX_LDPC_K % 8)    col_idx = FTX_LDPC_K_BYTES - 1     for i in range(FTX_LDPC_M):        nsum = 0        for j in range(FTX_LDPC_K_BYTES):            bits = message[j] &amp; FTX_LDPC_GENERATOR[i][j]            nsum ^= parity8(bits)         if nsum % 2:            codeword[col_idx] |= col_mask         col_mask &gt;&gt;= 1        if col_mask == 0:            col_mask = 0x80            col_idx += 1     return codeword <\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0432 <code>FTX_LDPC_GENERATOR<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u0447\u0442\u043e\u0431\u044b \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0435\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0442\u0440\u0438\u0446\u044b. \u0421\u0430\u043c\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/github.com\/bashkirtsevich\/ftx\/blob\/master\/consts.py#L116\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>ftx_encode<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 LDPC \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 message; \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f 174 \u0431\u0438\u0442\u043d\u044b\u0439 \u043a\u043e\u0434, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 message, \u0432\u043a\u043b\u044e\u0447\u0430\u044f 87 LDPC-\u0431\u0438\u0442.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>parity8<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e XOR \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0431\u0438\u0442\u0430 \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p><code>message<\/code>: <code>0000002058722393074d74a0<\/code><\/p>\n<p><code>ftx_encode<\/code>: <code>0000002058722393074d74a67d749e15d81ecea9e3a0<\/code><\/p>\n<h4>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 LDPC<\/h4>\n<p> \u041e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f LDPC-\u043a\u043e\u0434\u043e\u0432 \u2014 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c Belief Propagation (\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u0432\u0435\u0440\u0438\u044f). <\/p>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0448\u0430\u0433\u043e\u0432:<\/p>\n<ol>\n<li>\n<p>\u0443\u0437\u043b\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ol>\n<p> \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f \u0434\u043e \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u043a, \u043b\u0438\u0431\u043e \u0434\u043e \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439. <\/p>\n<pre><code class=\"python\">FTX_LDPC_NM = [    [4, 31, 59, 91, 92, 96, 153],    ...    [17, 42, 75, 129, 170, 172, 0], ]   FTX_LDPC_MN = [    [16, 45, 73],    ...    [42, 49, 57], ]   FTX_LDPC_NUM_ROWS = [    7, 6, 6, 6, 7, 6, 7, 6, 6, 7, 6, 6, 7, 7, 6, 6,    ...    6, 6, 6 ]   def fast_tanh(x: float) -&gt; float:    if x &lt; -4.97:        return -1.0    if x &gt; 4.97:        return 1.0    x2 = x ** 2    a = x * (945.0 + x2 * (105.0 + x2))    b = 945.0 + x2 * (420.0 + x2 * 15.0)    return a \/ b   def fast_atanh(x: float) -&gt; float:    x2 = x ** 2    a = x * (945.0 + x2 * (-735.0 + x2 * 64.0))    b = (945.0 + x2 * (-1050.0 + x2 * 225.0))    return a \/ b   def ldpc_check(codeword: bytes) -&gt; int:    errors = 0    for m in range(FTX_LDPC_M):        x = 0        for i in range(FTX_LDPC_NUM_ROWS[m]):            x ^= codeword[FTX_LDPC_NM[m][i] - 1]        if x:            errors += 1    return errors   def bp_decode(codeword: typing.List[float], max_iters: int) -&gt; typing.Tuple[int, typing.ByteString]:    min_errors = FTX_LDPC_M     tov = [[0.0] * 3 for _ in range(FTX_LDPC_N)]    toc = [[0.0] * 7 for _ in range(FTX_LDPC_M)]     plain = bytearray(b\"\\x00\" * FTX_LDPC_N)     for _ in range(max_iters):        plain_sum = 0        for n in range(FTX_LDPC_N):            plain[n] = int((codeword[n] + tov[n][0] + tov[n][1] + tov[n][2]) &gt; 0)            plain_sum += plain[n]         if plain_sum == 0:            min_errors = FTX_LDPC_M            break         if (errors := ldpc_check(plain)) &lt; min_errors:            min_errors = errors            if errors == 0:                break         for m in range(FTX_LDPC_M):            for n_idx in range(FTX_LDPC_NUM_ROWS[m]):                n = FTX_LDPC_NM[m][n_idx] - 1                Tnm = codeword[n]                for m_idx in range(3):                    if (FTX_LDPC_MN[n][m_idx] - 1) != m:                        Tnm += tov[n][m_idx]                toc[m][n_idx] = fast_tanh(-Tnm \/ 2)         for n in range(FTX_LDPC_N):            for m_idx in range(3):                m = FTX_LDPC_MN[n][m_idx] - 1                Tmn = 1.0                for n_idx in range(FTX_LDPC_NUM_ROWS[m]):                    if (FTX_LDPC_NM[m][n_idx] - 1) != n:                        Tmn *= toc[m][n_idx]                tov[n][m_idx] = -2 * fast_atanh(Tmn)     return min_errors, plain   def ftx_normalize_logl(log174: typing.List[float]) -&gt; typing.Generator[float, None, None]:    sum = 0    sum2 = 0    for it in log174:        sum += it        sum2 += it ** 2     inv_n = 1.0 \/ FTX_LDPC_N    variance = (sum2 - (sum * sum * inv_n)) * inv_n     norm_factor = math.sqrt(24.0 \/ variance)     for it in log174:        yield it * norm_factor <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>bp_decode<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c Belief Propagation, \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 codeword \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>ftx_normalize_logl<\/code> \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f; \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>max_iters<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0440\u0430\u0441\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0442\u0435\u0436, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043d\u0430\u0431\u043e\u0440 \u0431\u0430\u0439\u0442 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041c\u0430\u0442\u0440\u0438\u0446\u0430 <code>FTX_LDPC_NM<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438, \u043a\u0430\u0436\u0434\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u0434\u043e\u0432\u043e\u043c \u0441\u043b\u043e\u0432\u0435.<\/p>\n<p>\u041c\u0430\u0442\u0440\u0438\u0446\u0430 <code>FTX_LDPC_MN<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0431\u0438\u0442\u044b \u043a\u043e\u0434\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430, \u0447\u0438\u0441\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u043a\u0430\u043a\u0438\u0435 \u0442\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438 \u0438\u0437 <code>FTX_LDPC_NM<\/code> \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u043a\u043e\u0434\u043e\u0432\u043e\u043c\u0443 \u0441\u043b\u043e\u0432\u0443.<\/p>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440\u044b \u043c\u0430\u0442\u0440\u0438\u0446 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/bashkirtsevich\/ftx\/blob\/master\/consts.py#L205\" rel=\"noopener noreferrer nofollow\">FTX_LDPC_NM<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/bashkirtsevich\/ftx\/blob\/master\/consts.py#L294\" rel=\"noopener noreferrer nofollow\">FTX_LDPC_MN<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/bashkirtsevich\/ftx\/blob\/master\/consts.py#L471\" rel=\"noopener noreferrer nofollow\">FTX_LDPC_NUM_ROWS<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043b\u0430\u0431\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0438\u043c\u0435\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043d\u0430 Python \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043d\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0448\u0443\u043c\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/em> <\/p>\n<h2>\u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c<\/h2>\n<p> \u041d\u0430 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 FTX \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u0434 \u0413\u0440\u0435\u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u0442\u0440\u0438\u0446 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u0430. <\/p>\n<h3>\u041a\u043e\u0434 \u0413\u0440\u0435\u044f<\/h3>\n<p> \u041a\u043e\u0434 \u0413\u0440\u0435\u044f (Gray code) \u2014 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439, \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0434\u0432\u0435 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u043e\u0439 (\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0425\u0435\u043c\u043c\u0438\u043d\u0433\u0430 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f\u043c\u0438 \u043a\u043e\u0434\u0430 \u0440\u0430\u0432\u043d\u043e \u0435\u0434\u0438\u043d\u0438\u0446\u0435). <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u043e\u0434\u0430 \u0413\u0440\u0435\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0435\u0439 1, 2 \u0438 3 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 3, \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043a\u043e\u0434 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u00ab\u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434\u00bb.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/295\/ea3\/11b\/295ea311b676465a98d8b30bf4421254.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/295\/ea3\/11b\/295ea311b676465a98d8b30bf4421254.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/295\/ea3\/11b\/295ea311b676465a98d8b30bf4421254.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 3: \u041a\u043e\u0434\u044b \u0413\u0440\u0435\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0435\u0439 1, 2 \u0438 3, \u0438 \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/229\/3b1\/d12\/2293b1d12a553df2c57d27154e155128.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/229\/3b1\/d12\/2293b1d12a553df2c57d27154e155128.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/229\/3b1\/d12\/2293b1d12a553df2c57d27154e155128.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/0a2\/616\/759\/0a261675936813838eb6ef953ff44a30.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/0a2\/616\/759\/0a261675936813838eb6ef953ff44a30.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/0a2\/616\/759\/0a261675936813838eb6ef953ff44a30.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 4: \u041a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u044d\u043d\u043a\u043e\u0434\u0435\u0440 \u0441 \u043a\u043e\u0434\u043e\u043c \u0413\u0440\u0435\u044f \u0438 \u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435. <\/p>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 4 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0413\u0440\u0435\u044f \u0432 \u044d\u043d\u043a\u043e\u0434\u0435\u0440\u0435.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e \u043a\u043e\u0434 \u0413\u0440\u0435\u044f \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Gray_code\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u043a\u043e\u0434 \u0413\u0440\u0435\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 FTX \u043a\u043e\u0434 \u0413\u0440\u0435\u044f \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u0435\u0445\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438, \u0441\u043d\u0438\u0436\u0430\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u0441\u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u043d\u0430 \u043e\u0434\u0438\u043d \u0431\u0438\u0442.<\/p>\n<p>\u0414\u043b\u044f FT8 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0440\u0435\u0445 \u0431\u0438\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 \u0413\u0440\u0435\u044f, \u0434\u043b\u044f FT4 \u2014 \u0434\u0432\u0443\u0445.<\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043a\u043e\u0434\u0430 \u0413\u0440\u0435\u044f:<\/p>\n<pre><code class=\"python\">def bin_to_gray(b: int) -&gt; int:    return b ^ (b &gt;&gt; 1)   for i in range(10):    print(f\"{i}, {i:5b}, {bin_to_gray(i):5b}\") <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0441\u0447\u0435\u0442\u0430:<\/p>\n<pre><code>dec, bin,   gray  0, 00000, 00000  1, 00001, 00001  2, 00010, 00011  3, 00011, 00010  4, 00100, 00110  5, 00101, 00111  6, 00110, 00101  7, 00111, 00100  8, 01000, 01100  9, 01001, 01101 <\/code><\/pre>\n<h4>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0432 \u043a\u043e\u0434 \u0413\u0440\u0435\u044f<\/h4>\n<p> \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043a\u043e\u0434\u044b \u0413\u0440\u0435\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0433\u0434\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0447\u0438\u0441\u043b\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0413\u0440\u0435\u044f: <\/p>\n<pre><code class=\"python\">FT8_GRAY_MAP = [0, 1, 3, 2, 5, 6, 4, 7] FT4_GRAY_MAP = [0, 1, 3, 2] <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u043a\u043e\u0434 \u0413\u0440\u0435\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u0434\u043e\u043c:<\/p>\n<pre><code class=\"python\">mask = 0x80 i_byte = 0 bits3 = 0   for bit_or in [4, 2, 1]:    if codeword[i_byte] &amp; mask:        bits3 |= bit_or     mask &gt;&gt;= 1    if mask == 0:        mask = 0x80        i_byte += 1  yield FT8_GRAY_MAP[bits3] <\/code><\/pre>\n<pre><code class=\"python\">mask = 0x80 i_byte = 0 bits2 = 0   for bit_or in [2, 1]:    if codeword[i_byte] &amp; mask:        bits2 |= bit_or     mask &gt;&gt;= 1    if mask == 0:        mask = 0x80        i_byte += 1  yield FT4_GRAY_MAP[bits2] <\/code><\/pre>\n<p>\u0413\u0434\u0435 <code>bits3<\/code> \u0438 <code>bits2<\/code> \u2014 \u0431\u0438\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f <code>codeword<\/code>.<\/p>\n<h4>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0438\u0437 \u043a\u043e\u0434\u0430 \u0413\u0440\u0435\u044f<\/h4>\n<p> \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 FTX \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c, \u043f\u0443\u0442\u0435\u043c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0442\u0435\u0445 \u0431\u0438\u0442, \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b, \u043e\u043d\u0438, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0434\u0430\u0434\u0443\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0431\u0438\u0442\u0430\u0445 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435. <\/p>\n<pre><code class=\"python\">def ft4_extract_symbol(self, mag_idx: int) -&gt; typing.Tuple[float, float]:    s2 = [self.wf.mag[mag_idx + gc] for gc in FT4_GRAY_MAP]     logl_0 = max(s2[2], s2[3]) - max(s2[0], s2[1])    logl_1 = max(s2[1], s2[3]) - max(s2[0], s2[2])    return logl_0, logl_1   def ft8_extract_symbol(self, mag_idx: int) -&gt; typing.Tuple[float, float, float]:    s2 = [self.wf.mag[mag_idx + gc] for gc in FT8_GRAY_MAP]     logl_0 = max(s2[4], s2[5], s2[6], s2[7]) - max(s2[0], s2[1], s2[2], s2[3])    logl_1 = max(s2[2], s2[3], s2[6], s2[7]) - max(s2[0], s2[1], s2[4], s2[5])    logl_2 = max(s2[1], s2[3], s2[5], s2[7]) - max(s2[0], s2[2], s2[4], s2[6])    return logl_0, logl_1, logl_2 <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 <code>ft4_extract_symbol<\/code> \u0438 <code>ft8_extract_symbol<\/code> \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 \u043a\u043b\u0430\u0441\u0441\u0443 Monitor, \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0432 \u0441\u0435\u0431\u0435 \u043b\u043e\u0433\u0438\u043a\u0443 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (\u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u0437\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u0435\u043d \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u0442 \u043a\u043e\u043d\u0446\u0430 \u043a \u043d\u0430\u0447\u0430\u043b\u0443). \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>mag_idx<\/code> \u2014 \u043d\u043e\u043c\u0435\u0440 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0432 \u0441\u043f\u0435\u043a\u0442\u0440\u0435 FFT.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u043a\u043e\u0440\u0442\u0435\u0436 \u0438\u0437 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0431\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<h3>\u041c\u0430\u0441\u0441\u0438\u0432 \u041a\u043e\u0441\u0442\u0430\u0441\u0430<\/h3>\n<p> \u041c\u0430\u0441\u0441\u0438\u0432 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 (Costas array) \u2014 \u0442\u0438\u043f \u0440\u0435\u0448\u0435\u0442\u043a\u0438 \u0442\u043e\u0447\u0435\u043a <code>n*n<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0438 \u043e\u0434\u043d\u0430 \u043f\u0430\u0440\u0430 \u0442\u043e\u0447\u0435\u043a, \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f; \u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0438 \u043e\u0434\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u0438 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043b\u044e\u0431\u044b\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u043f\u0430\u0440\u0430\u043c\u0438 \u0442\u043e\u0447\u0435\u043a \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c, \u0434\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u0435\u043a \u0432 \u043e\u0431\u043e\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445. <\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e, \u0430\u0432\u0442\u043e\u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f (\u0410\u041a\u0424) \u043f\u043e \u0442\u043e\u0447\u043a\u0430\u043c \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043a \u043d\u0443\u043b\u044e, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044f \u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0438 \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u0435 \u043f\u043e\u043c\u0435\u0445\u0438.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/751\/1f6\/754\/7511f6754df487968cd52630c2308da1.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/751\/1f6\/754\/7511f6754df487968cd52630c2308da1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/751\/1f6\/754\/7511f6754df487968cd52630c2308da1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 5: \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0438\u0445 \u0410\u041a\u0424. <\/p>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 5 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0438\u0445 \u0410\u041a\u0424; \u043f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0430\u0432\u0442\u043e\u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0439, \u043e\u0433\u0438\u0431\u0430\u044e\u0449\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 \u043f\u043b\u0430\u0432\u043d\u044b\u0439 \u0440\u043e\u0441\u0442 \u0438 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u0441\u0435\u0439 \u0434\u043b\u0438\u043d\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 5, \u0433\u0440\u0430\u0444\u0438\u043a A), \u0430 \u043f\u0440\u0438 \u043d\u0438\u0437\u043a\u043e\u0439 \u0430\u0432\u0442\u043e\u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0433\u043e \u0440\u043e\u0441\u0442\u0430 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u0430\u043c \u0441 \u0441\u043e\u0431\u043e\u0439, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0440\u0435\u0437\u043a\u0438\u0439 \u0432\u0441\u043f\u043b\u0435\u0441\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0431\u0435\u043b\u044b\u043c \u0448\u0443\u043c\u043e\u043c (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 5, \u0433\u0440\u0430\u0444\u0438\u043a D), \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0430\u0432\u0442\u043e\u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442 \u043f\u043b\u0430\u0432\u043d\u044b\u0439, \u043f\u0440\u0438 \u043d\u0438\u0437\u043a\u043e\u0439 \u2014 \u0440\u0435\u0437\u043a\u0438\u0439.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 FTX \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043a\u043e\u0441\u0442\u0430\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0440\u0435\u0448\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0443 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0439 \u0438 \u0448\u0443\u043c\u0430.<\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435.<\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0438\u0437 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432 \u0438 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u0441 \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u043d\u0430 \u0442\u0435\u0445 \u0436\u0435 \u043c\u0435\u0441\u0442\u0430\u0445, \u0447\u0442\u043e \u0438 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u044b (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 6), \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044f \u043c\u0430\u0441\u043a\u0443 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 \u0438 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0439 \u0432 \u043c\u0430\u0441\u043a\u0435 \u0441\u043e \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430\u043c\u0438 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 7.2); \u043e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0433\u0430\u0448\u0435\u043d (\u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u044f \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0443\u044e \u043f\u043e\u0442\u0435\u0440\u044e \u0438\u043b\u0438 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445), \u0442\u043e \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u0430\u0441\u043a\u0438 \u0438 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u043b\u0438 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u043a\u0438 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 7.1).<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/533\/732\/443\/5337324438d19df6f698352e93b9121c.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/533\/732\/443\/5337324438d19df6f698352e93b9121c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/533\/732\/443\/5337324438d19df6f698352e93b9121c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 6: \u041c\u0430\u0441\u043a\u0430 \u0441 \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u044f\u043c\u0438 \u0438 \u0434\u0438\u043e\u0434\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/822\/eda\/b9c\/822edab9cdf8f3b6308eb3e662d3427c.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/822\/eda\/b9c\/822edab9cdf8f3b6308eb3e662d3427c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/822\/eda\/b9c\/822edab9cdf8f3b6308eb3e662d3427c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7: 1:  \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438; 2: \u041f\u043e\u0438\u0441\u043a \u0434\u0438\u043e\u0434\u043e\u0432 \u043f\u043e \u043c\u0430\u0441\u043a\u0435. <\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u043a\u0438 \u0438 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0439 \u0438 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 <code>3*3<\/code> \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 8), \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d, \u0442\u043e \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0434\u0432\u0443\u0445 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0441\u043a\u0438, \u0438\u0437\u0431\u0435\u0433\u0430\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/b71\/1f0\/948\/b711f09484298dcc76c27be581052980.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/b71\/1f0\/948\/b711f09484298dcc76c27be581052980.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/b71\/1f0\/948\/b711f09484298dcc76c27be581052980.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 8: \u043c\u0430\u0441\u043a\u0430 \u0438 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u041a\u043e\u0441\u0442\u0430\u0441\u0430. <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0448\u0435 \u0438\u043b\u0438 \u043d\u0438\u0436\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 <code>3*3<\/code> \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442 \u0432\u043d\u043e\u0432\u044c, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0434\u0432\u0430 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0435, \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u041a\u043e\u0441\u0442\u0430\u0441\u0430 \u043d\u0430\u0448\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0433\u0438\u0434\u0440\u043e \u0438 \u0440\u0430\u0434\u0438\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u0438.<\/p>\n<h4>\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 \u0432 \u0441\u0438\u0433\u043d\u0430\u043b<\/h4>\n<p> \u0412 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 FT8 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 <code>7*7<\/code>, \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 <code>[3, 1, 4, 0, 6, 5, 2]<\/code> \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e, \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u0438 \u043a\u043e\u043d\u0435\u0446 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. <\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 FT8, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b FT4 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0443\u0436\u0435 4 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 <code>4*4<\/code> \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438: <code>[[0, 1, 3, 2], [1, 0, 2, 3], [2, 3, 1, 0], [3, 2, 0, 1]]<\/code>.<\/p>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 <\/em><code><em>[3, 1, 4, 0, 6, 5, 2] <\/em><\/code><em>\u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u0430, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u044d\u0442\u043e \u043e\u0442\u0441\u044b\u043b\u043a\u0430, \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u044b\u0445 \u0442\u0440\u0435\u0445 \u0447\u0438\u0441\u0435\u043b \u0438\u0437 \u0447\u0438\u0441\u043b\u0430 \u043f\u0438.<\/em><\/p>\n<pre><code class=\"python\">FT8_NN = 79 FT4_NN = 105   FT8_COSTAS_PATTERN = [3, 1, 4, 0, 6, 5, 2] FT4_COSTAS_PATTERN = [    [0, 1, 3, 2],    [1, 0, 2, 3],    [2, 3, 1, 0],    [3, 2, 0, 1] ]   FT4_XOR_SEQUENCE = [    0x4A,  # 01001010    0x5E,  # 01011110    0x89,  # 10001001    0xB4,  # 10110100    0xB0,  # 10110000    0x8A,  # 10001010    0x79,  # 01111001    0x55,  # 01010101    0xBE,  # 10111110    0x28,  # 00101 [000] ]   def ft8_encode(payload: typing.ByteString) -&gt; typing.Generator[int, None, None]:    a91 = ftx_add_crc(payload)    codeword = ftx_encode(a91)     mask = 0x80    i_byte = 0    for i_tone in range(FT8_NN):        if 7 &gt; i_tone &gt;= 0:            yield FT8_COSTAS_PATTERN[i_tone]        elif 43 &gt; i_tone &gt;= 36:            yield FT8_COSTAS_PATTERN[i_tone - 36]        elif 79 &gt; i_tone &gt;= 72:            yield FT8_COSTAS_PATTERN[i_tone - 72]        else:            bits3 = 0            for bit_or in [4, 2, 1]:                if codeword[i_byte] &amp; mask:                    bits3 |= bit_or                 mask &gt;&gt;= 1                if mask == 0:                    mask = 0x80                    i_byte += 1             yield FT8_GRAY_MAP[bits3]   def ft4_encode(payload: typing.ByteString) -&gt; typing.Generator[int, None, None]:    payload_xor = bytearray(b\"\\x00\" * 10)    for i in range(10):        payload_xor[i] = payload[i] ^ FT4_XOR_SEQUENCE[i]     a91 = ftx_add_crc(payload_xor)    codeword = ftx_encode(a91)     mask = 0x80    i_byte = 0    for i_tone in range(FT4_NN):        if i_tone == 0 or i_tone == 104:            yield 0        elif 5 &gt; i_tone &gt;= 1:            yield FT4_COSTAS_PATTERN[0][i_tone - 1]        elif 38 &gt; i_tone &gt;= 34:            yield FT4_COSTAS_PATTERN[1][i_tone - 34]        elif 71 &gt; i_tone &gt;= 67:            yield FT4_COSTAS_PATTERN[2][i_tone - 67]        elif 104 &gt; i_tone &gt;= 100:            yield FT4_COSTAS_PATTERN[3][i_tone - 100]        else:            bits2 = 0            for bit_or in [2, 1]:                if codeword[i_byte] &amp; mask:                    bits2 |= bit_or                 mask &gt;&gt;= 1                if mask == 0:                    mask = 0x80                    i_byte += 1             yield FT4_GRAY_MAP[bits2] <\/code><\/pre>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>ft8_encode<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c \u0438 LDPC \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0441\u0445\u0435\u043c\u0435: <code>S7 D29 S7 D29 S7<\/code>, \u0433\u0434\u0435 <code>S<\/code> \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u041a\u043e\u0441\u0442\u0430\u0441\u0430, <code>D<\/code> \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u0434 \u0413\u0440\u0435\u044f. \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u043c\u0435\u0440\u0430 GFSK-\u0442\u043e\u043d\u043e\u0432.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>ft8_encode<\/code>: <code>3140652 00000000100651431071150732373 3140652 35427373324062650244263575260 3140652<\/code> (\u0431\u043b\u043e\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u041a\u043e\u0441\u0442\u0430\u0441\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438).<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>ft4_encode<\/code> \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 ft8_encode, \u0441 \u0442\u043e\u0439 \u043b\u0438\u0448\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439, \u0447\u0442\u043e \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u044e\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>XOR<\/code> \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0445\u0435\u043c\u043e\u0439 <code>FT4_XOR_SEQUENCE<\/code>, \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0432\u0435\u0441\u0442\u0438 \u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0443 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0438\u0434\u0435\u0442 \u0434\u0440\u0443\u0433 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0443\u043b\u0435\u0439, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043f\u043e\u043c\u0435\u0445\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 FT4 \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 XOR: <code>00000020587223930748<\/code> \/ <code>4a5e8994e8f85ac6b960<\/code>.<\/p>\n<p>\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0445\u0435\u043c\u0435: R S4_1 D29 S4_2 D29 S4_3 D29 S4_4 R, \u0433\u0434\u0435 R \u2014 ramping symbol, \u0440\u0430\u0432\u043d\u044b\u0439 0.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>ft4_encode<\/code>: <code>0 0132 10331123303131102330223011332 1023 01332311302112123233233113233 2310 30302303033330213121320010313 3201 0<\/code> (\u0431\u043b\u043e\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u041a\u043e\u0441\u0442\u0430\u0441\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438)<\/p>\n<p><code>FT8_NN<\/code>, <code>FT4_NN<\/code> \u2014 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043d\u043e\u0432 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 FT8\/FT4.<\/p>\n<h4>\u041f\u043e\u0438\u0441\u043a \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u041a\u043e\u0441\u0442\u0430\u0441\u0430<\/h4>\n<p> \u0412 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 FTX \u043f\u0440\u0438 \u0434\u0435\u0442\u0435\u043a\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0432 \u043e\u0431\u0449\u0435\u0439 \u043f\u043e\u043b\u043e\u0441\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0431\u0445\u043e\u0434 \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0438 \u0441\u043a\u043e\u0440\u0438\u043d\u0433 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u043e \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430\u043c \u0447\u0430\u0441\u0442\u043e\u0442, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u041a\u043e\u0441\u0442\u0430\u0441\u0430. \u041f\u0440\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u0438\u043d\u0433\u0430, \u043f\u043e\u043b\u043e\u0441\u0430 \u0447\u0430\u0441\u0442\u043e\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0441\u0447\u0435\u0442 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430. <\/p>\n<pre><code class=\"python\">@dataclass class Candidate:    time_offset: int    freq_offset: int    time_sub: int    freq_sub: int    score: int = 0 <\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>Candidate<\/code> \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440-\u0431\u0430\u043b\u043b\u0430 \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u0435.<\/p>\n<p><code>time_offset<\/code> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u0431\u043b\u043e\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438;<\/p>\n<p><code>freq_offset<\/code> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u0431\u043b\u043e\u043a\u0430 \u0447\u0430\u0441\u0442\u043e\u0442;<\/p>\n<p><code>time_sub<\/code> \u2014 \u043f\u043e\u0434\u0438\u043d\u0434\u0435\u043a\u0441 \u0431\u043b\u043e\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438 \u043e\u0432\u0435\u0440\u0441\u0435\u043c\u043f\u043b\u0438\u043d\u0433\u0435;<\/p>\n<p><code>freq_sub<\/code> \u2014 \u043f\u043e\u0434\u0438\u043d\u0434\u0435\u043a\u0441 \u0431\u043b\u043e\u043a\u0430 \u0447\u0430\u0441\u0442\u043e\u0442 \u043f\u0440\u0438 \u043e\u0432\u0435\u0440\u0441\u0435\u043c\u043f\u043b\u0438\u043d\u0433\u0435.<\/p>\n<pre><code class=\"python\">def get_cand_mag_idx(self, candidate: Candidate) -&gt; int:    wf = self.wf     offset = candidate.time_offset    offset = offset * wf.time_osr + candidate.time_sub    offset = offset * wf.freq_osr + candidate.freq_sub    offset = offset * wf.num_bins + candidate.freq_offset     return offset   def ft8_sync_score(self, candidate: Candidate) -&gt; int:    wf = self.wf     score = 0    num_average = 0     mag_cand = self.get_cand_mag_idx(candidate)     for m in range(FT8_NUM_SYNC):        for k in range(FT8_LENGTH_SYNC):            block = FT8_SYNC_OFFSET * m + k            block_abs = candidate.time_offset + block            if block_abs &lt; 0:                continue            if block_abs &gt;= wf.num_blocks:                break             p8 = mag_cand + block * wf.block_stride            sm = FT8_COSTAS_PATTERN[k]            p8sm = p8 + sm            if sm &gt; 0:                score += wf.mag[p8sm] - wf.mag[p8sm - 1]                num_average += 1            if sm &lt; 7:                score += wf.mag[p8sm] - wf.mag[p8sm + 1]                num_average += 1            if k &gt; 0 and block_abs &gt; 0:                score += wf.mag[p8sm] - wf.mag[p8sm - wf.block_stride]                num_average += 1            if k + 1 &lt; FT8_LENGTH_SYNC and block_abs + 1 &lt; wf.num_blocks:                score += wf.mag[p8sm] - wf.mag[p8sm + wf.block_stride]                num_average += 1     if num_average &gt; 0:        score = int(score \/ num_average)    return score   def ft4_sync_score(self, candidate: Candidate) -&gt; int:    wf = self.wf    score = 0    num_average = 0     mag_cand = self.get_cand_mag_idx(candidate)     for m in range(FT4_NUM_SYNC):        for k in range(FT4_LENGTH_SYNC):            block = 1 + (FT4_SYNC_OFFSET * m) + k            block_abs = candidate.time_offset + block             if block_abs &lt; 0:                continue            if block_abs &gt;= wf.num_blocks:                break             p4 = mag_cand + (block * wf.block_stride)            sm = FT4_COSTAS_PATTERN[m][k]            p4sm = p4 + sm             if sm &gt; 0:                score += wf.mag[p4sm] - wf.mag[p4sm - 1]                num_average += 1            if sm &lt; 3:                score += wf.mag[p4sm] - wf.mag[p4sm + 1]                num_average += 1            if k &gt; 0 and block_abs &gt; 0:                score += wf.mag[p4sm] - wf.mag[p4sm - wf.block_stride]                num_average += 1            if k + 1 &lt; FT4_LENGTH_SYNC and block_abs + 1 &lt; wf.num_blocks:                score += wf.mag[p4sm] - wf.mag[p4sm + wf.block_stride]                num_average += 1     if num_average &gt; 0:        score = int(score \/ num_average)    return score   def ftx_sync_score(self, candidate: Candidate) -&gt; int:    wf = self.wf     if wf.protocol == FTX_PROTOCOL_FT4:        sync_fun = self.ft4_sync_score    elif wf.protocol == FTX_PROTOCOL_FT8:        sync_fun = self.ft8_sync_score    else:        raise ValueError(\"Invalid protocol\")     return sync_fun(candidate)   def ftx_find_candidates(self, num_candidates: int, min_score: int) -&gt; typing.List[Candidate]:    wf = self.wf     num_tones = FTX_TONES_COUNT[wf.protocol]    time_offset_range = range(-FTX_LENGTH_SYNC[wf.protocol], int(FTX_TIME_RANGE[wf.protocol]))     heap = []    can = Candidate(0, 0, 0, 0)    for time_sub in range(wf.time_osr):        for freq_sub in range(wf.freq_osr):            for time_offset in time_offset_range:                for freq_offset in range(wf.num_bins - num_tones):                    can.time_sub = time_sub                    can.freq_sub = freq_sub                    can.time_offset = time_offset                    can.freq_offset = freq_offset                     if (score := self.ftx_sync_score(can)) &lt; min_score:                        continue                     candidate = copy(can)                    candidate.score = score                     heap.insert(0, candidate)     heap.sort(key=lambda x: x.score, reverse=True)    return heap[:num_candidates] <\/code><\/pre>\n<p>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>get_cand_mag_idx<\/code> \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u0432  \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434 \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>ftx_find_candidates<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0431\u043e\u0440 \u0438 \u0441\u043a\u043e\u0440\u0438\u043d\u0433 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432, \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u043c\u0435\u0442\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d \u0441\u0438\u0433\u043d\u0430\u043b. \u041a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>ftx_sync_score<\/code> \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0435\u0441\u043b\u0438 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u041a\u043e\u0441\u0442\u0430\u0441\u0430, \u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440-\u0431\u0430\u043b\u043b\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 (<code>heap<\/code>), \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0443 score, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432, \u0447\u0435\u0439 \u0441\u043a\u043e\u0440-\u0431\u0430\u043b\u043b \u043d\u0438\u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 <code>min_score<\/code>; \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c <code>num_candidates<\/code>.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>ftx_sync_score<\/code>, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, FT8 \u0438\u043b\u0438 FT4, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c <code>ft4_sync_score<\/code> \u0438 <code>ft8_sync_score<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0442 \u0430\u043d\u0430\u043b\u0438\u0437 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432-\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u041a\u043e\u0441\u0442\u0430\u0441\u0430.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 <code>ft8_sync_score<\/code> \u0438 <code>ft4_sync_score<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u043e\u0431\u0445\u043e\u0434 \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u0447\u0430\u0441\u0442\u043e\u0442 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u041a\u043e\u0441\u0442\u0430\u0441\u0430 (\u043f\u043e\u0437\u0438\u0446\u0438\u0438 <code>0-7<\/code>, <code>36-43<\/code>, <code>72-79<\/code> \u0434\u043b\u044f FT8 \u0438 <code>1-4<\/code>, <code>34-37<\/code>, <code>67-70<\/code>, <code>100-103<\/code> \u0434\u043b\u044f FT4). \u0412 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 score \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434 \u043c\u0435\u0436\u0434\u0443 \u0438\u0441\u043a\u043e\u043c\u044b\u043c\u0438 \u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0430\u043c\u0438, \u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0447\u0435\u043c \u0440\u0435\u0437\u0447\u0435 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434 \u0432 \u043f\u043e\u043b\u043e\u0441\u0435, \u0442\u0435\u043c \u0432\u044b\u0448\u0435 \u0441\u043a\u043e\u0440-\u0431\u0430\u043b\u043b \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>wf.mag<\/code> (\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <code>self.wf<\/code>) \u2014 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434 (WFFT) \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<h2>\u041a\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c<\/h2>\n<p> \u041d\u0430 \u043a\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0438\u043d\u0442\u0435\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b, \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u043c\u0443 (\u0437\u0432\u0443\u043a\u043e\u0432\u043e\u043c\u0443) \u043a\u0430\u043d\u0430\u043b\u0443 \u0441\u0432\u044f\u0437\u0438. <\/p>\n<p>\u041f\u0440\u0438 \u043f\u0440\u0438\u0435\u043c\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u043d\u0430 \u044d\u0442\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043a\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0424\u0443\u0440\u044c\u0435 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434.<\/p>\n<h3>FSK \u0438 GFSK \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430<\/h3>\n<p> FSK (Frequency Shift Keying) \u2014 \u0432\u0438\u0434 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 (\u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438), \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u0441\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0441\u0438\u0433\u043d\u0430\u043b\u0430. \u0414\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0432\u0435 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e\u0442, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0430 \u0438\u043b\u0438 \u0438\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430. <\/p>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c FSK \u0434\u043b\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430, \u0430 \u043d\u0443\u043b\u044f\u043c \u043c\u0435\u043d\u044c\u0448\u0430\u044f.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/9c4\/b75\/d90\/9c4b75d901c9a1b316103610d36c9c17.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/9c4\/b75\/d90\/9c4b75d901c9a1b316103610d36c9c17.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/9c4\/b75\/d90\/9c4b75d901c9a1b316103610d36c9c17.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9: FSK \u0434\u043b\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u0438\u0434 \u0441\u0438\u0433\u043d\u0430\u043b\u0430. <\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0444\u0430\u0437\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043a\u0430\u0447\u043a\u043e\u0432.<\/p>\n<p>GFSK (Gaussian Frequency-Shift Keying) \u2014 \u043f\u043e\u0434\u0432\u0438\u0434 FSK \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440 \u0413\u0430\u0443\u0441\u0441\u0430 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 10) \u0434\u043b\u044f \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/dc0\/bfa\/f9f\/dc0bfaf9f4061ee4326e37f760515c29.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/dc0\/bfa\/f9f\/dc0bfaf9f4061ee4326e37f760515c29.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/dc0\/bfa\/f9f\/dc0bfaf9f4061ee4326e37f760515c29.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10: \u0418\u043c\u043f\u0443\u043b\u044c\u0441\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0413\u0430\u0443\u0441\u0441\u0430. <\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 GFSK \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u0435\u043d \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 FSK, \u0441 \u0442\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439, \u0447\u0442\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u044b \u0442\u043e\u043d\u043e\u0432 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 \u0444\u0438\u043b\u044c\u0442\u0440 \u0413\u0430\u0443\u0441\u0441\u0430 \u0434\u043b\u044f \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f (\u043f\u043b\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0444\u0430\u0437\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438 \u043a\u043e\u043d\u0446\u0435 \u0442\u043e\u043d\u0430), \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0448\u0438\u0440\u0438\u043d\u0443 \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0435\u0437\u043a\u0430\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043d\u0430 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0448\u0438\u0440\u043e\u043a\u043e\u043f\u043e\u043b\u043e\u0441\u043d\u044b\u0439 \u0432\u044b\u0431\u0440\u043e\u0441 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 13).<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/094\/a8d\/061\/094a8d061fd9362ae66d9d5d4255d6d1.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/094\/a8d\/061\/094a8d061fd9362ae66d9d5d4255d6d1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/094\/a8d\/061\/094a8d061fd9362ae66d9d5d4255d6d1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11: \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 FSK \u0438 GFSK. <\/p>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 11 \u0438 12 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0438 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e FSK \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0413\u0430\u0443\u0441\u0441\u0430 (GFSK).<\/p>\n<p>\u0424\u0438\u043b\u044c\u0442\u0440 \u0413\u0430\u0443\u0441\u0441\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c 1.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/52c\/1a5\/b23\/52c1a5b2330344762de59f72a3e68b03.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/52c\/1a5\/b23\/52c1a5b2330344762de59f72a3e68b03.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/52c\/1a5\/b23\/52c1a5b2330344762de59f72a3e68b03.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> (1) <\/p>\n<p>\u0413\u0434\u0435 <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/2bd\/b0c\/bd9\/2bdb0cbd9a897233f786fb703e16e525.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/2bd\/b0c\/bd9\/2bdb0cbd9a897233f786fb703e16e525.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/2bd\/b0c\/bd9\/2bdb0cbd9a897233f786fb703e16e525.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> , \u0430 <code>BT<\/code> \u2014 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f,\u0447\u0435\u043c \u043e\u043d \u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 12). <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/9a6\/a53\/4ca\/9a6a534ca93fecfa77b0dda4682f1607.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/9a6\/a53\/4ca\/9a6a534ca93fecfa77b0dda4682f1607.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/9a6\/a53\/4ca\/9a6a534ca93fecfa77b0dda4682f1607.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12: \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0439 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 BT. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/8dc\/b7e\/307\/8dcb7e30751de1179ae4ee9b813faf40.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/8dc\/b7e\/307\/8dcb7e30751de1179ae4ee9b813faf40.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/8dc\/b7e\/307\/8dcb7e30751de1179ae4ee9b813faf40.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13: \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0432 FSK \u0438 GFSK \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432. <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b FT8 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f <code>BT<\/code> \u0440\u0430\u0432\u043d\u0430\u044f <code>2.0<\/code>, \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 FT4 \u2014 <code>1.0<\/code>.<\/p>\n<pre><code class=\"python\">import math import typing   FT8_SYMBOL_PERIOD = 0.160 FT4_SYMBOL_PERIOD = 0.048   FT8_SYMBOL_BT = 2.0 FT4_SYMBOL_BT = 1.0   GFSK_K = math.pi * math.sqrt(2 \/ math.log(2))   def gfsk_pulse(n_spsym: int, symbol_bt: float) -&gt; typing.Generator[float, None, None]:    for i in range(3 * n_spsym):        t = i \/ n_spsym - 1.5        arg1 = GFSK_K * symbol_bt * (t + 0.5)        arg2 = GFSK_K * symbol_bt * (t - 0.5)        val = (math.erf(arg1) - math.erf(arg2)) \/ 2         yield val   def synth_gfsk(symbols: typing.List[int], n_sym: int,               f0: float,               symbol_bt: float, symbol_period: float,               signal_rate: int) -&gt; typing.Generator[float, None, None]:    n_spsym = int(0.5 + signal_rate * symbol_period)    n_wave = n_sym * n_spsym    hmod = 1.0     dphi_peak = 2 * math.pi * hmod \/ n_spsym    dphi = [2 * math.pi * f0 \/ signal_rate] * (n_wave + 2 * n_spsym)     pulse = list(gfsk_pulse(n_spsym, symbol_bt))     for i in range(n_sym):        ib = i * n_spsym        for j in range(3 * n_spsym):            dphi[j + ib] += dphi_peak * symbols[i] * pulse[j]     for j in range(2 * n_spsym):        dphi[j] += dphi_peak * pulse[j + n_spsym] * symbols[0]        dphi[j + n_sym * n_spsym] += dphi_peak * pulse[j] * symbols[n_sym - 1]     phi = 0.0    n_ramp = n_spsym \/\/ 8    for k in range(n_wave):        val = math.sin(phi)        phi = math.fmod(phi + dphi[k + n_spsym], 2 * math.pi)         if k &lt; n_ramp or k &gt;= n_wave - n_ramp:            i_ramp = (k if k &lt; n_ramp else n_wave - k - 1)            env = (1 - math.cos(2 * math.pi * i_ramp \/ (2 * n_ramp))) \/ 2            val *= env         yield val <\/code><\/pre>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>gfsk_pulse<\/code> \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>n_spsym<\/code> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043c\u043f\u043b\u043e\u0432 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b; \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>symbol_bt<\/code> \u2014 \u043a\u0440\u0443\u0442\u0438\u0437\u043d\u0430 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>BT<\/code>); \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0442\u0438\u043f\u0430 <code>float<\/code>.<\/p>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>synth_gfsk<\/code> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b, \u0441 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>signal_rate<\/code>, \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u043d\u043e\u0432 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 symbols; \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>n_sym<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>FT4_NN<\/code>\/<code>FT8_NN<\/code>); \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 f0 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u043e\u0442\u0443, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0442\u043e\u043d\u043e\u0432; <code>symbol_bt<\/code> \u2014 \u043a\u0440\u0443\u0442\u0438\u0437\u043d\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0413\u0430\u0443\u0441\u0441\u0430 (<code>FT4_SYMBOL_BT<\/code>\/<code>FT8_SYMBOL_BT<\/code>); \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>symbol_period<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0432\u0443\u0447\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u043e\u043d\u0430 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 (<code>FT4_SYMBOL_PERIOD<\/code>\/<code>FT8_SYMBOL_PERIOD<\/code>); \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0442 -1 \u0434\u043e 1 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u0438\u043d\u0443\u0441 (sin), \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u0430\u044f \u0444\u0430\u0437\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<pre><code class=\"python\">pulse = list(gfsk_pulse(n_spsym, symbol_bt)) <\/code><\/pre>\n<p>\u0412 pulse \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0413\u0430\u0443\u0441\u0441\u0430.<\/p>\n<p>\u041f\u0440\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438 \u043a\u043e\u043d\u0446\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e\u043a\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0425\u0430\u043d\u043d\u0430:<\/p>\n<pre><code class=\"python\">if k &lt; n_ramp or k &gt;= n_wave - n_ramp:    i_ramp = (k if k &lt; n_ramp else n_wave - k - 1)    env = (1 - math.cos(2 * math.pi * i_ramp \/ (2 * n_ramp))) \/ 2    val *= env <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043a\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b, \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0432 \u0426\u0410\u041f \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u0430.<\/p>\n<p>\u041e\u0431\u0449\u0438\u0439 \u0432\u0438\u0434 \u043a\u043e\u0434\u0435\u0440\u0430 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 FT8\/FT4:<\/p>\n<pre><code class=\"python\">import numpy as np from scipy.io.wavfile import write   FT4_SLOT_TIME = 7.5 FT8_SLOT_TIME = 15.0   def main():    try:        call = \"CQ R1ABC KO85\"        payload = ftx_message_encode_std(*call.split())    except Exception as e:        print(f\"Cannot parse message: {type(e)}\")        return     print(\"Payload\", ''.join('{:02x}'.format(x) for x in payload))     is_ft4 = False    if is_ft4:        tones = ft4_encode(payload)    else:        tones = ft8_encode(payload)     tones = list(tones)     print(\"FSK tones:\", \"\".join(str(i) for i in tones))     frequency = 1000     symbol_period = FT4_SYMBOL_PERIOD if is_ft4 else FT8_SYMBOL_PERIOD    symbol_bt = FT4_SYMBOL_BT if is_ft4 else FT8_SYMBOL_BT     sample_rate = 12000    num_tones = FT4_NN if is_ft4 else FT8_NN    slot_time = FT4_SLOT_TIME if is_ft4 else FT8_SLOT_TIME     num_samples = int(0.5 + num_tones * symbol_period * sample_rate)    num_silence = int((slot_time * sample_rate - num_samples) \/ 2)     signal = np.fromiter(synth_gfsk(tones, num_tones, frequency, symbol_bt, symbol_period, sample_rate), dtype=float)    silence = np.zeros(num_silence)    amplitude = np.iinfo(np.int16).max    data = np.concat([silence, amplitude * signal, silence])    write(\"examples\/signal.wav\", sample_rate, data.astype(np.int16))   if __name__ == '__main__':    main() <\/code><\/pre>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u00ab<code>CQ R1ABC KO85<\/code>\u00bb \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 FT8 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b \u0432 \u0444\u0430\u0439\u043b \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>signal.wav<\/code>.<\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 is_ft4 \u043d\u0430 True \u0438\u0437\u043c\u0435\u043d\u0438\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043d\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 FT4.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f FT8:<\/p>\n<pre><code>Payload 00000020587223930748 FSK tones: 3140652000000001006514310711507323733140652354273733240626502442635752603140652 <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f FT4:<\/p>\n<pre><code>Payload 00000020587223930748 FSK tones: 001321033112330313110233022301133210230133231130211212323323311323323103030230303333021312132001031332010 <\/code><\/pre>\n<h3>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430<\/h3>\n<p> \u041f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0431\u043b\u043e\u043a\u0438, \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 \u043f\u0435\u0440\u0438\u043e\u0434 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 (\u0434\u043b\u044f FT8 0.160 \u0438 FT4 0.048 \u0441\u0435\u043a), \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0439 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 (15.0 \u0438 7.5 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043b\u044f FT8 \u0438 FT4 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e); \u0434\u0430\u043b\u0435\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u043a\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0424\u0443\u0440\u044c\u0435 (WFFT, \u0440\u0438\u0441\u0443\u043d\u043e\u043a 14) \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u043a\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0425\u0430\u043d\u043d\u0430, \u0440\u0438\u0441\u0443\u043d\u043e\u043a 15 \u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u0430 2), \u043c\u0430\u0433\u043d\u0438\u0442\u0443\u0434\u044b \u0447\u0430\u0441\u0442\u043e\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b \u0432 \u0434\u0435\u0446\u0438\u0431\u0435\u043b\u0430\u0445. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/27b\/a88\/df9\/27ba88df91c0b5b067bdc6c71bf448b3.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/27b\/a88\/df9\/27ba88df91c0b5b067bdc6c71bf448b3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/27b\/a88\/df9\/27ba88df91c0b5b067bdc6c71bf448b3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14: \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0424\u0443\u0440\u044c\u0435. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/ffb\/225\/38b\/ffb22538bb04712ce2514edef1ec7c5d.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/ffb\/225\/38b\/ffb22538bb04712ce2514edef1ec7c5d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/ffb\/225\/38b\/ffb22538bb04712ce2514edef1ec7c5d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15: \u0413\u0440\u0430\u0444\u0438\u043a \u043e\u043a\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0425\u0430\u043d\u043d\u0430. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/666\/bb5\/1c0\/666bb51c04cdf9ca06f335f6da1d97d0.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/666\/bb5\/1c0\/666bb51c04cdf9ca06f335f6da1d97d0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/666\/bb5\/1c0\/666bb51c04cdf9ca06f335f6da1d97d0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> (2) <\/p>\n<p>\u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0438\u0441\u043a\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432-\u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 (\u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u041a\u043e\u0441\u0442\u0430\u0441\u0430), \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0432 LDPC-\u0434\u0435\u043a\u043e\u0434\u0435\u0440 (\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c Belief Propagation), \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041b\u043e\u0433\u0438\u043a\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0441 Monitor:<\/p>\n<pre><code class=\"python\">kMin_score = 5 kMax_candidates = 140 kLDPC_iterations = 25 kMaxLDPCErrors = 32   @dataclass class Waterfall:    num_bins: int    time_osr: int    freq_osr: int    protocol: int    mag = typing.List[int]    max_blocks: int     num_blocks: int = 0    block_stride: int = 0     def __post_init__(self):        self.block_stride = (self.time_osr * self.freq_osr * self.num_bins)        self.mag = [0] * (self.max_blocks * self.time_osr * self.freq_osr * self.num_bins)   class Monitor:    @staticmethod    def hann_i(i: int, N: int) -&gt; float:        x = math.sin(math.pi * i \/ N)        return x ** 2      @staticmethod    def ftx_normalize_logl(log174: typing.List[float]) -&gt; typing.Generator[float, None, None]:        ...      def __init__(self, f_min: int, f_max: int, sample_rate: int, time_osr: int, freq_osr: int, protocol):        slot_time = FTX_SLOT_TIMES[protocol]        symbol_period = FTX_SYMBOL_PERIODS[protocol]         self.block_size = int(sample_rate * symbol_period)        self.subblock_size = int(self.block_size \/ time_osr)        self.nfft = self.block_size * freq_osr        self.fft_norm = 2.0 \/ self.nfft         self.window = [self.fft_norm * self.hann_i(i, self.nfft) for i in range(self.nfft)]        self.last_frame = [0.0] * self.nfft         max_blocks = int(slot_time \/ symbol_period)         self.min_bin = int(f_min * symbol_period)        self.max_bin = int(f_max * symbol_period + 1)        num_bins = self.max_bin - self.min_bin         self.wf = Waterfall(max_blocks=max_blocks, num_bins=num_bins, time_osr=time_osr, freq_osr=freq_osr,                            protocol=protocol)         self.symbol_period = symbol_period         self.max_mag = -120.0      def monitor_process(self, frame: typing.List[float]):        if self.wf.num_blocks &gt;= self.wf.max_blocks:            return False         offset = self.wf.num_blocks * self.wf.block_stride        frame_pos = 0         for time_sub in range(self.wf.time_osr):            for pos in range(self.nfft - self.subblock_size):                self.last_frame[pos] = self.last_frame[pos + self.subblock_size]             for pos in range(self.nfft - self.subblock_size, self.nfft):                self.last_frame[pos] = frame[frame_pos]                frame_pos += 1             timedata = [self.window[pos] * self.last_frame[pos] for pos in range(self.nfft)]            freqdata = np.fft.fft(timedata)[:self.nfft \/\/ 2 + 1]             for freq_sub in range(self.wf.freq_osr):                for bin in range(self.min_bin, self.max_bin):                    src_bin = (bin * self.wf.freq_osr) + freq_sub                    mag2 = freqdata[src_bin].imag ** 2 + freqdata[src_bin].real ** 2                    db = 10.0 * math.log10(1E-12 + mag2)                     scaled = int(2 * db + 240)                    self.wf.mag[offset] = max(min(scaled, 255), 0)                    offset += 1                     self.max_mag = max(self.max_mag, db)         self.wf.num_blocks += 1        return True      def ft8_sync_score(self, candidate: Candidate) -&gt; int:        ...      def ft4_sync_score(self, candidate: Candidate) -&gt; int:        ...      def ftx_sync_score(self, candidate: Candidate) -&gt; int:        ...      def ftx_find_candidates(self, num_candidates: int, min_score: int) -&gt; typing.List[Candidate]:        ...      def get_cand_mag_idx(self, candidate: Candidate) -&gt; int:        ...      def ft4_extract_likelihood(self, cand: Candidate) -&gt; typing.List[float]:        log174 = [0.0] * FTX_LDPC_N         mag = self.get_cand_mag_idx(cand)        for k in range(FT4_ND):            sym_idx = k + (5 if k &lt; 29 else 9 if k &lt; 58 else 13)            bit_idx = 2 * k             block = cand.time_offset + sym_idx            if block &lt; 0 or block &gt;= self.wf.num_blocks:                log174[bit_idx + 0] = 0                log174[bit_idx + 1] = 0            else:                logl_0, logl_1 = self.ft4_extract_symbol(mag + sym_idx * self.wf.block_stride)                log174[bit_idx + 0] = logl_0                log174[bit_idx + 1] = logl_1         return log174      def ft8_extract_likelihood(self, cand: Candidate) -&gt; typing.List[float]:        log174 = [0.0] * FTX_LDPC_N         mag = self.get_cand_mag_idx(cand)        for k in range(FT8_ND):            sym_idx = k + (7 if k &lt; 29 else 14)            bit_idx = 3 * k             block = cand.time_offset + sym_idx            if block &lt; 0 or block &gt;= self.wf.num_blocks:                log174[bit_idx + 0] = 0                log174[bit_idx + 1] = 0                log174[bit_idx + 2] = 0            else:                logl_0, logl_1, logl_2 = self.ft8_extract_symbol(mag + sym_idx * self.wf.block_stride)                log174[bit_idx + 0] = logl_0                log174[bit_idx + 1] = logl_1                log174[bit_idx + 2] = logl_2         return log174      def ft4_extract_symbol(self, mag_idx: int) -&gt; typing.Tuple[float, float]:     ...      def ft8_extract_symbol(self, mag_idx: int) -&gt; typing.Tuple[float, float, float]:     ...      def ftx_decode_candidate(            self, cand: Candidate,            max_iterations: int) -&gt; typing.Optional[typing.Tuple[DecodeStatus, typing.Optional[bytes], float]]:        wf = self.wf         if wf.protocol == FTX_PROTOCOL_FT4:            log174 = self.ft4_extract_likelihood(cand)        else:            log174 = self.ft8_extract_likelihood(cand)         log174 = list(self.ftx_normalize_logl(log174))        ldpc_errors, plain174 = bp_decode(log174, max_iterations)         if ldpc_errors &gt; kMaxLDPCErrors:            return None        if not ftx_check_crc(plain174):            return None         a91 = self.pack_bits(plain174, FTX_LDPC_K)        crc_extracted = ftx_extract_crc(a91)         if wf.protocol == FTX_PROTOCOL_FT4:            payload = bytearray(a91[i] ^ xor for i, xor in enumerate(FT4_XOR_SEQUENCE))            tones = ft4_encode(payload)        else:            payload = a91            tones = ft8_encode(payload)         snr = self.ftx_subtract(cand, tones)        return DecodeStatus(ldpc_errors, crc_extracted), payload, snr      def decode(self) -&gt; typing.Generator[typing.Tuple[float, float, float, str], None, None]:        hashes = set()        wf = self.wf         candidate_list = self.ftx_find_candidates(kMax_candidates, kMin_score)        for cand in candidate_list:            freq_hz = (self.min_bin + cand.freq_offset + cand.freq_sub \/ wf.freq_osr) \/ self.symbol_period            time_sec = (cand.time_offset + cand.time_sub \/ wf.time_osr) * self.symbol_period - 0.65             if not (x := self.ftx_decode_candidate(cand, kLDPC_iterations)):                continue             status, message, snr = x             if (crc := status.crc_extracted) in hashes:                continue             hashes.add(crc)             call_to_rx, call_de_rx, extra_rx = ftx_message_decode(message)             yield snr, time_sec, freq_hz, \" \".join([call_to_rx, call_de_rx or \"\", extra_rx or \"\"]) <\/code><\/pre>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>decode<\/code> \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0434\u0430\u0435\u0442 \u043a\u043e\u0440\u0442\u0435\u0436 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043e SNR, \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>ftx_decode_candidate<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0441\u0438\u0433\u043d\u0430\u043b-\u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b <code>ft4_extract_likelihood<\/code>\/<code>ft8_extract_likelihood<\/code>; \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>ftx_normalize_logl<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 LPDC-\u0434\u0435\u043a\u043e\u0434\u0435\u0440 (<code>bp_decode<\/code>), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f CRC-14 (<code>ftx_check_crc<\/code>) \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 <code>ft8_extract_likelihood<\/code> \u0438 <code>ft4_extract_likelihood<\/code> \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442 \u0431\u0438\u0442\u044b \u0434\u0430\u043d\u043d\u044b \u0438\u0437 \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u043a\u043e\u043f\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u00ab\u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0445\u00bb \u0431\u0438\u0442.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>monitor_process<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 \u0431\u043b\u043e\u043a\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f \u043d\u0430\u0434 \u043d\u0438\u043c\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0424\u0443\u0440\u044c\u0435 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u00ab\u0432\u043e\u0434\u043e\u043f\u0430\u0434\u00bb (\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>Waterfall<\/code>).<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 Monitor \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u043f\u043e\u043b\u043e\u0441\u044b \u0447\u0430\u0441\u0442\u043e\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 (<code>f_min<\/code>, <code>f_max<\/code>), \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0438 (<code>sample_rate<\/code>), \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0432\u0435\u0440\u0441\u0435\u043c\u043f\u043b\u0438\u043d\u0433\u0430 (<code>time_osr<\/code>, <code>freq_osr<\/code>) \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 FT8\/FT4.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0430 Monitor:<\/p>\n<pre><code class=\"python\">import time import numpy as np from scipy.io.wavfile import read from consts import FTX_PROTOCOL_FT8, FTX_PROTOCOL_FT4 from decode import Monitor   kFreq_osr = 2 kTime_osr = 4   def main():    is_ft4 = False     sample_rate, data = read(\"examples\/signal.wav\")     amplitude = np.iinfo(data.dtype).max    signal = data \/ amplitude     protocol = FTX_PROTOCOL_FT4 if is_ft4 else FTX_PROTOCOL_FT8     mon = Monitor(        f_min=200,        f_max=3000,        sample_rate=sample_rate,        time_osr=kTime_osr,        freq_osr=kFreq_osr,        protocol=protocol    )     frame_pos = 0    while True:        eof = frame_pos &gt;= len(signal) - mon.block_size        if eof or not mon.monitor_process(signal[frame_pos:frame_pos + mon.block_size]):            print(f\"Waterfall accumulated {mon.wf.num_blocks} symbols\")            print(f\"Max magnitude: {mon.max_mag:+.2f} dB\")             tm_slot_start = 0            ts1 = time.monotonic()            for i, (snr, time_sec, freq_hz, text) in enumerate(mon.decode(tm_slot_start)):                print(                    f\"{i + 1:03}\\t\"                    f\"{snr:+06.2f}dB\\t\"                    f\"{time_sec:-.2f}sec\\t\"                    f\"{freq_hz:.2f}Hz\\t\"                    f\"{text}\"                )             mon.wf.num_blocks = 0            mon.max_mag = -120.0             ts2 = time.monotonic()            print(\"-\" * 20, \"decoded @\", ts2 - ts1, \"sec\")         if eof:            break         frame_pos += mon.block_size   if __name__ == '__main__':    main() <\/code><\/pre>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 16 \u0438 17 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0434\u043b\u044f FT8 \u0438 FT4.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/109\/7d0\/340\/1097d0340411551b456b1cde8406429f.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/109\/7d0\/340\/1097d0340411551b456b1cde8406429f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/109\/7d0\/340\/1097d0340411551b456b1cde8406429f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 16: \u0421\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 FT8. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/290\/519\/ca4\/290519ca40f75115da1af7f3cf9c9b45.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/290\/519\/ca4\/290519ca40f75115da1af7f3cf9c9b45.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/290\/519\/ca4\/290519ca40f75115da1af7f3cf9c9b45.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 17: \u0421\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 FT4. <\/p>\n<h4>\u0420\u0430\u0441\u0447\u0435\u0442 SNR<\/h4>\n<p> \u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f SNR \u2014 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 \u043f\u043e\u043b\u043e\u0441\u044b \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0441\u0430\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u0438 \u043f\u0440\u043e\u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b \u0432 \u0435\u0433\u043e \u043e\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u044f\u0445. <\/p>\n<pre><code class=\"python\">from copy import copy from itertools import cycle   def ftx_subtract(self, candidate: Candidate, tones: typing.Iterable[int]) -&gt; float:    num_tones = FTX_TONES_COUNT[self.wf.protocol]     can = copy(candidate)    snr_all = 0.0     tones = cycle(tones)    for freq_sub in range(self.wf.freq_osr):        can.freq_sub = freq_sub         mag_cand = self.get_cand_mag_idx(can)        noise = 0.0        signal = 0.0        num_average = 0         for i, tone in enumerate(tones):            block_abs = candidate.time_offset + i            if block_abs &lt; 0:                continue             if block_abs &gt;= self.wf.num_blocks:                break             wf_el = mag_cand + i * self.wf.block_stride             noise_val = 100000.0            for s in filter(lambda x: x != tone, range(num_tones)):                noise_val = min(noise_val, self.wf.mag[wf_el + s] * 0.5 - 120.0)             noise += noise_val            signal += self.wf.mag[wf_el + tone] * 0.5 - 120.0            num_average += 1         noise \/= num_average        signal \/= num_average        snr = signal - noise         for i, tone in enumerate(tones):            block_abs = candidate.time_offset + i            if block_abs &lt; 0:                continue            if block_abs &gt;= self.wf.num_blocks:                break            wf_el = mag_cand + i * self.wf.block_stride            self.wf.mag[wf_el + tone] -= snr * 2 + 240         snr_all += snr     return snr_all \/ self.wf.freq_osr \/ 2 - 22 <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>ftx_subtract<\/code> (\u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 <code>Monitor<\/code>) \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442 \u0442\u043e\u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0438\u0445 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b \u0438 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b \u043f\u043e\u043b\u043e\u0441\u044b \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b \u0441\u0430\u043c\u0438\u0445 \u0442\u043e\u043d\u043e\u0432. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0448\u0443\u043c\u043e\u0432. \u041f\u043e\u0431\u043e\u0447\u043d\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438\u0437 \u0432\u043e\u0434\u043e\u043f\u0430\u0434\u0430, \u0447\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0441\u043b\u0430\u0431\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p> \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b FT8 \u0438 FT4, \u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b. \u0422\u0430\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0438 \u0434\u0430\u0432\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043c\u0435\u0445\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0438\u0435 \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0441\u0432\u044f\u0437\u0438. \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u043e\u043f\u043b\u043e\u0449\u0430\u044e\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043a\u0430\u043a \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a, \u0440\u0430\u0434\u0438\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u0438 \u0446\u0438\u0444\u0440\u043e\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u0430\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u044f, \u0447\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u043c \u0443\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f. <\/p>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 FT8\/FT4, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0440\u0430\u0434\u0438\u043e\u043e\u0431\u043c\u0435\u043d \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 (\u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043c\u043e\u0434\u0435\u043c\u0430), \u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u043c\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0445, \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0438 \u0443\u0440\u043e\u0432\u043d\u0435\u043c SNR, \u0445\u043e\u0442\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u043c\u0435\u043d \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u0438 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u043c\u0435\u043d\u0430, \u0440\u0430\u0431\u043e\u0442\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0447\u0430\u0442\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u00ab\u043c\u0430\u0442\u0440\u0435\u0448\u043a\u0443\u00bb \u0438\u043b\u0438 \u00ab\u043b\u0443\u043a\u043e\u0432\u0438\u0446\u0443\u00bb, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u043a\u0430\u043a \u0431\u0430\u0437\u0438\u0441 \u0434\u043b\u044f \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f.<\/p>\n<h2>\u0421\u0441\u044b\u043b\u043a\u0438<\/h2>\n<ol>\n<li>\n<p><a href=\"https:\/\/github.com\/bashkirtsevich\/ftx\/tree\/master\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 FT8\/FT4 \u043d\u0430 Python<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/bashkirtsevich\/ftx\/blob\/master\/demo_gen.py\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 FTX<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/bashkirtsevich\/ftx\/blob\/master\/demo_decode.py\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 FTX<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/kgoba\/ft8_lib\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 ft8_lib \u043d\u0430 C<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/wsjt.sourceforge.io\/FT4_FT8_QEX.pdf\" rel=\"noopener noreferrer nofollow\">\u0421\u0442\u0430\u0442\u044c\u044f \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0438\u0437 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 QEX<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/files.tapr.org\/meetings\/DCC_2019\/2019-4-WB2FKO.pdf\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0432 FT8<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/wsjt.sourceforge.io\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 WSJT, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0430\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b FTX<\/a><\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/928024\/\"> https:\/\/habr.com\/ru\/articles\/928024\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><\/figure>\n<p> FT8 \u2014 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0414\u0436\u043e \u0422\u0435\u0439\u043b\u043e\u0440\u043e\u043c (K1JT) \u0438 \u0421\u0442\u0438\u0432\u043e\u043c \u0424\u0440\u0430\u043d\u043a\u0435 (K9AN) \u0432 2017 \u0433\u043e\u0434\u0443. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. <\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044f\u043c, \u043a\u0430\u043a \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c, \u0442\u0430\u043a \u0438 \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0441 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438 FT8 \u0438 FT4, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u043c, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u0445 \u043f\u043e\u043d\u044f\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432.<\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p> \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b FT8 \u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044f\u043c\u0438 \u0414\u0436\u043e \u0422\u0435\u0439\u043b\u043e\u0440\u043e\u043c (K1JT) \u0438 \u0421\u0442\u0438\u0432\u043e\u043c \u0424\u0440\u0430\u043d\u043a\u0435 (K9AN) \u0432 2017 \u0433\u043e\u0434\u0443, \u0447\u044c\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u044b \u0431\u044b\u043b\u0438 \u0443\u0432\u0435\u043a\u043e\u0432\u0435\u0447\u0435\u043d\u044b \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. <\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0438 \u0446\u0435\u043b\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u043f\u0440\u0438 \u043e\u0447\u0435\u043d\u044c \u043d\u0438\u0437\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u0440\u043e\u0433\u0430 \u0441\u043b\u044b\u0448\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430; \u0432 \u043f\u043b\u043e\u0445\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0440\u0430\u0434\u0438\u043e\u0441\u0438\u0433\u043d\u0430\u043b\u0430; \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0438\u0437\u043a\u043e\u0439 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438; \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u0437\u043a\u0438\u0445 \u043f\u043e\u043b\u043e\u0441 \u0447\u0430\u0441\u0442\u043e\u0442 \u0434\u043b\u044f \u043f\u0440\u0438\u0435\u043c\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438 \u043f\u0440\u0438 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043f\u043e\u0440\u044f\u0434\u043a\u0430 15 \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443) \u0438, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u0438\u043c\u0435\u0435\u0442 \u043d\u0438\u0437\u043a\u0438\u0439 \u0431\u0438\u0442\u0440\u0435\u0439\u0442. \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0431\u044b\u043b \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0430\u0445 (\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0441 \u043c\u0438\u0440\u043e\u0432\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c.<\/p>\n<p>FT4 \u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0432 2019 \u0433\u043e\u0434\u0443 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 FT8. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0446\u0435\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430: \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 QSO \u0437\u0430 \u0441\u0447\u0451\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f; \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0440\u0430\u0434\u0438\u043e\u0441\u0432\u044f\u0437\u0435\u0439 \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0439.<\/p>\n<p>\u0418\u0437-\u0437\u0430 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u0443\u044e \u043f\u043e\u043b\u043e\u0441\u0443 \u0447\u0430\u0441\u0442\u043e\u0442.<\/p>\n<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 GFSK (Gaussian Frequency Shift Keying) \u2014 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u0443\u044e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u044e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0413\u0430\u0443\u0441\u0441\u0430. \u0426\u0438\u0444\u0440\u044b \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043d\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0440\u0438 FSK.<\/p>\n<h2>\u041e\u0431\u0449\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438<\/h2>\n<h3>FT8<\/h3>\n<ul>\n<li>\n<p>\u0426\u0438\u043a\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 15 \u0441\u0435\u043a\u0443\u043d\u0434;<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 6,09 \u0431\u0438\u0442\/\u0441;<\/p>\n<\/li>\n<li>\n<p>\u0428\u0438\u0440\u0438\u043d\u0430 \u043f\u043e\u043b\u043e\u0441\u044b 50 \u0413\u0446;<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f 77 \u0431\u0438\u0442 + 12-\u0431\u0438\u0442 CRC-14;<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438 \u043e\u0448\u0438\u0431\u043e\u043a LDPC (174,87);<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f 8-GFSK \u0441 \u0448\u0430\u0433\u043e\u043c 6.25\u0413\u0446;<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0440\u043e\u0433 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0434\u043e -24\u2026-26 \u0434\u0411 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0448\u0443\u043c\u0430.<\/p>\n<\/li>\n<\/ul>\n<h3>FT4<\/h3>\n<ul>\n<li>\n<p>\u0426\u0438\u043a\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 7.5 \u0441\u0435\u043a\u0443\u043d\u0434;<\/p>\n<\/li>\n<li>\n<p>\u0428\u0438\u0440\u0438\u043d\u0430 \u043f\u043e\u043b\u043e\u0441\u044b 90 \u0413\u0446;<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f 77 \u0431\u0438\u0442 + 12-\u0431\u0438\u0442 CRC-14;<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438 \u043e\u0448\u0438\u0431\u043e\u043a LDPC (174,87);<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f 4-GFSK \u0441 \u0448\u0430\u0433\u043e\u043c 23.4\u0413\u0446;<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0440\u043e\u0433 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0434\u043e -24\u2026-26 \u0434\u0411 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0448\u0443\u043c\u0430.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430<\/h2>\n<p> \u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, FT8 \u0438 FT4 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0441\u043e\u0431\u043e\u0439 \u00ab\u043c\u0430\u0442\u0440\u0435\u0448\u043a\u0443\u00bb, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043d\u0438\u0436\u0435. <\/p>\n<p>\u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 1. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 OSI \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435.<\/p>\n<figure class=\"\"><\/figure>\n<p> \u0420\u0438\u0441\u0443\u043d\u043e\u043a 1: \u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 (\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c OSI \u0443\u0441\u043b\u043e\u0432\u043d\u0430\u044f). <\/p>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 1.\u0410 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430; \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 1.B \u2014 \u0441\u0445\u0435\u043c\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<h2>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f<\/h2>\n<p> \u041f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0441\u0432\u044f\u0437\u0435\u0439 \u0432 FT8\/FT4 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0445 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0445.  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430\u043c, \u043f\u0440\u0438\u0435\u043c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u0447\u0435\u0442\u043d\u044b\u0435 \u0438 \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0435 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0438 (\u215b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 FT4) \u043c\u0438\u043d\u0443\u0442, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0435 \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u044b \u0438\u0437\u043b\u0443\u0447\u0430\u044e\u0442 \u0441\u0438\u0433\u043d\u0430\u043b, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0432 \u044d\u0442\u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0435\u043c \u0438 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u043b\u0443\u0448\u0430\u044e\u0449\u0438\u0445; \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043c\u0435\u043d\u0430 \u0440\u043e\u043b\u0435\u0439, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0432\u0448\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u043e\u0442\u0432\u0435\u0442 (\u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u043d\u0443\u0436\u043d\u044b\u043c), \u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0448\u0438\u0435 \u0441\u0432\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0438 \u0442.\u0434. \u0446\u0438\u043a\u043b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f. \u041c\u043e\u0434\u0443\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439.<\/p>\n<p>\u041e\u0431\u043c\u0435\u043d \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0440\u0430\u0434\u0438\u043e\u043e\u0431\u043c\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u043e\u0432 \u0434\u0430\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u0443\u0448\u0430\u044e\u0442 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c.<\/p>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 \u0441\u0432\u044f\u0437\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:00-00:15<\/p>\n<\/td>\n<td>\n<p align=\"left\">CQ R3AAA KO85<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442 \u0438\u0437 \u041c\u043e\u0441\u043a\u0432\u044b (\u043b\u043e\u043a\u0430\u0442\u043e\u0440 KO85), \u0441 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u043c R3AAA \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u0442 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:15-00:30<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA R9FXX LO87<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442 \u0438\u0437 \u041f\u0435\u0440\u043c\u0438 (\u043b\u043e\u043a\u0430\u0442\u043e\u0440 LO87) \u0441 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u043c R9FXX<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:30-00:45<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX R3AAA -1<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA \u0434\u0430\u0435\u0442 \u0440\u0430\u043f\u043e\u0440\u0442 \u0434\u043b\u044f R9FXX \u0432 -1 dB \u043f\u043e SNR<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:45-01:00<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA R9FXX R-4<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX \u0434\u0430\u0435\u0442 \u0440\u0430\u043f\u043e\u0440\u0442 \u0434\u043b\u044f R3AAA \u0432 -4 dB \u043f\u043e SNR<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">01:00-01:15<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX R3AAA RR73<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u0440\u0438\u0435\u043c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">01:15-01:30<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA R9FXX 73<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 73<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p> \u041e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438 \u043d\u0430\u043d\u044f\u043b\u043e 1 \u043c\u0438\u043d\u0443\u0442\u0443 30 \u0441\u0435\u043a\u0443\u043d\u0434.  <\/p>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 \u0441\u0432\u044f\u0437\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:00-00:15<\/p>\n<\/td>\n<td>\n<p align=\"left\">CQ R3AAA KO85<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442 \u0438\u0437 \u041c\u043e\u0441\u043a\u0432\u044b (\u043b\u043e\u043a\u0430\u0442\u043e\u0440 KO85), \u0441 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u043c R3AAA \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u0442 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:15-00:30<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA R9FXX R-4<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX \u0434\u0430\u0435\u0442 \u0440\u0430\u043f\u043e\u0440\u0442 \u0434\u043b\u044f R3AAA \u0432 -4 dB \u043f\u043e SNR<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:30-00:45<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX R3AAA R-1<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA \u0434\u0430\u0435\u0442 \u0440\u0430\u043f\u043e\u0440\u0442 \u0434\u043b\u044f R9FXX \u0432 -1 dB \u043f\u043e SNR<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">00:45-01:00<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA R9FXX RR73<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u0440\u0438\u0435\u043c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">01:00-01:15<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FXX R3AAA 73<\/p>\n<\/td>\n<td>\n<p align=\"left\">R3AAA \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 73<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p> \u0421\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0430\u043d\u0441\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043a\u043e\u0433\u0434\u0430 \u0443 \u0434\u0430\u043b\u044c\u043d\u0435\u0433\u043e \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u044f\u0437\u044c. <\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043a\u043e\u0433\u0434\u0430 \u043a\u0442\u043e-\u0442\u043e \u0438\u0437 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043e\u0441\u043b\u0430\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u0441\u0435\u0430\u043d\u0441 \u0441\u0432\u044f\u0437\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0435\u0430\u043d\u0441\u0430 \u0440\u0430\u0434\u0438\u043e\u0441\u0432\u044f\u0437\u0438 R9FEU \u0441 R1CDY:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u044f UTC<\/p>\n<\/td>\n<td>\n<p align=\"left\">SNR<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0394t<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0427\u0430\u0441\u0442\u043e\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">141945<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tx<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">CQ R9FEU LO87<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">142000<\/p>\n<\/td>\n<td>\n<p align=\"left\">-3<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1001<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FEU R1CDY KP40<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">142015<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tx<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">R1CDY R9FEU -03<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">142030<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1001<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FEU R1CDY R-17<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">142045<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tx<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">R1CDY R9FEU RR73<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">142100<\/p>\n<\/td>\n<td>\n<p align=\"left\">-9<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1001<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FEU R1CDY 73<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p> \u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 \u0440\u0430\u0434\u0438\u043e\u0441\u0432\u044f\u0437\u0438 R9FEU c UA3DOI: <\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u044f UTC<\/p>\n<\/td>\n<td>\n<p align=\"left\">SNR<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0394t<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0427\u0430\u0441\u0442\u043e\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">141745<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tx<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">CQ R9FEU LO87<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">141800<\/p>\n<\/td>\n<td>\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1001<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FEU UA3DOI -01<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">141815<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tx<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">UA3DOI R9FEU R+08<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">141830<\/p>\n<\/td>\n<td>\n<p align=\"left\">-5<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1001<\/p>\n<\/td>\n<td>\n<p align=\"left\">R9FEU UA3DOI RR73<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">141845<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tx<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">UA3DOI R9FEU 73<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/h2>\n<p> \u041d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0440\u0430\u0441\u0447\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f CRC-14. <\/p>\n<h3>\u0424\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/h3>\n<p> \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 FTX \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430: <\/p>\n<ul>\n<li>\n<p>\u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u0431\u043c\u0435\u043d (QSO);<\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.<\/p>\n<\/li>\n<\/ul>\n<p> \u0412\u0441\u0435 \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0433\u0440\u0443\u043f\u043f: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 (<code>call_to<\/code>), \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 (<code>call_de<\/code>), \u0434\u0430\u043d\u043d\u044b\u0435 (<code>extra<\/code>). \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f SNR-\u0440\u0430\u043f\u043e\u0440\u0442, \u0447\u0435\u0442\u044b\u0440\u0435\u0445-\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u044b roger\/73. <\/p>\n<h3>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/h3>\n<p> \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043f\u043e\u043b\u0435\u0439: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0438 \u0434\u043e\u043f. \u0434\u0430\u043d\u043d\u044b\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u043f\u043e\u0440\u0442 \u0438\u043b\u0438 \u0433\u0435\u043e \u0434\u0430\u043d\u043d\u044b\u0435). <\/p>\n<p>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043b\u043e\u0442\u043d\u043e \u0443\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 77 \u0431\u0438\u0442.<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0438 \u0443\u0442\u0438\u043b\u0438\u0442, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">import string   FTX_CHAR_TABLE_NUMERIC = string.digits FTX_CHAR_TABLE_LETTERS = string.ascii_uppercase FTX_CHAR_TABLE_ALPHANUM = f\"{FTX_CHAR_TABLE_NUMERIC}{FTX_CHAR_TABLE_LETTERS}\" FTX_CHAR_TABLE_LETTERS_SPACE = f\" {FTX_CHAR_TABLE_LETTERS}\" FTX_CHAR_TABLE_ALPHANUM_SPACE = f\" {FTX_CHAR_TABLE_ALPHANUM}\" FTX_CHAR_TABLE_ALPHANUM_SPACE_SLASH = f\"{FTX_CHAR_TABLE_ALPHANUM_SPACE}\/\" FTX_CHAR_TABLE_FULL = f\"{FTX_CHAR_TABLE_ALPHANUM_SPACE}+-.\/?\"   def charn(c: int, table: str) -&gt; str:    return table[c]   def nchar(c: str, table: str) -&gt; int:    return table.find(c) <\/code><\/pre>\n<p>\u0412 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 FTX \u0430\u043b\u0444\u0430\u0432\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 ASCII \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u00ab<code>ABCDEFGHIJKLMNOPQRSTUVWXYZ<\/code>\u00bb, \u0446\u0438\u0444\u0440 \u00ab<code>0123456789<\/code>\u00bb \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u00ab<code>+-.\/?<\/code>\u00bb, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u043d\u0430\u043a \u043f\u0440\u043e\u0431\u0435\u043b\u0430.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 <code>FTX_CHAR_TABLE_FULL<\/code>.<\/p>\n<p>\u0412 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0435 FTX \u0441\u0438\u043c\u0432\u043e\u043b\u0443 A \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 1, B \u2014 2 \u0438 \u0442.\u0434.. \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0438\u0437 ANSI \u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442 FTX \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>nchar<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 <code>c<\/code> \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 table, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <code>FTX_CHAR_TABLE_*<\/code>. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>-1<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 FTX \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f charn, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0448\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 ANSI \u0441\u0438\u043c\u0432\u043e\u043b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 <code>c<\/code> \u0432 <code>table<\/code>.<\/p>\n<h4>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430<\/h4>\n<p> \u0414\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e 6-\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e. \u041a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0432\u0438\u0434\u0443. \u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u043a\u0438\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0435 \u0438\u0437 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code>3DA0XYZ<\/code> \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0432 <code>3D0XYZ<\/code>, \u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0435 <code>3XA0XYZ<\/code> \u0432 <code>QA0XYZ<\/code>. <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430:<\/p>\n<pre><code class=\"python\">FTX_BASECALL_CHAR_MAP = [    FTX_CHAR_TABLE_ALPHANUM_SPACE,    FTX_CHAR_TABLE_ALPHANUM,    FTX_CHAR_TABLE_NUMERIC,    FTX_CHAR_TABLE_LETTERS_SPACE,    FTX_CHAR_TABLE_LETTERS_SPACE,    FTX_CHAR_TABLE_LETTERS_SPACE ]   def pack_basecall(callsign: str) -&gt; int:    if (length := len(callsign)) &gt; 2:        if callsign.startswith(\"3DA0\") and 4 &lt; length &lt;= 7:            cs_6 = f\"3D0{callsign[4:]}\"        elif callsign.startswith(\"3X\") and callsign[2].isalpha() and length &lt;= 7:            cs_6 = f\"Q{callsign[2:]}\"        elif callsign[2].isdigit() and length &lt;= 6:            cs_6 = callsign        elif callsign[1].isdigit() and length &lt;= 5:            cs_6 = f\" {callsign}\"        else:            cs_6 = \" \" * 6         cs_6 = cs_6 + \" \" * (6 - len(cs_6))         n_chars = list(map(nchar, cs_6, FTX_BASECALL_CHAR_MAP))         if all(nc &gt;= 0 for nc in n_chars):            n = reduce(lambda a, it: a * len(it[0]) + it[1], zip(FTX_BASECALL_CHAR_MAP, n_chars), 0)            return n    return -1 <\/code><\/pre>\n<p>\u0412 <code>FTX_BASECALL_CHAR_MAP<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043e\u0432, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0435\u0440\u0432\u0430\u044f \u0446\u0438\u0444\u0440\u043e-\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u0430\u044f \u043b\u0438\u0442\u0435\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439; \u0442\u0440\u0435\u0442\u044c\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0434\u0430\u043b\u0435\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u043e\u0431\u0435\u043b.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>pack_basecall<\/code> \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c, \u0434\u043b\u0438\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0443\u043c 3 \u0437\u043d\u0430\u043a\u0430. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043e 6-\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e. \u0412 <code>n_chars<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 <code>FTX_BASECALL_CHAR_MAP<\/code> \u0441\u0438\u043c\u0432\u043e\u043b\u044b; \u0437\u0430\u0442\u0435\u043c, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0443\u0442\u0435\u043c \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043e\u0432.<\/p>\n<p>\u041f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e <code>R1ABC<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a \u0432\u0438\u0434\u0443 &#8216;<code> R1ABC<\/code>&#8216;, \u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432: <code>[0, 27, 1, 1, 2, 3]<\/code>; \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: <code>5334879<\/code> (<code>0b10100010110011101011111<\/code>).<\/p>\n<h4>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430<\/h4>\n<p> \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u0441\u0435 \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0447\u0442\u043e \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. <\/p>\n<pre><code class=\"python\">NTOKENS = 2063592 MAX22 = 4194304   FTX_BASECALL_SUFFIX_FMT = {    1: \"{cs}\/R\",    2: \"{cs}\/P\", } FTX_TOKEN_STR = {    v:<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-467109","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=467109"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467109\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=467109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=467109"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=467109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}