{"id":321419,"date":"2021-04-14T09:00:42","date_gmt":"2021-04-14T09:00:42","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=321419"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=321419","title":{"rendered":"ModulationPy: \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Python"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! <\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c:<\/p>\n<blockquote>\n<p><a href=\"https:\/\/github.com\/kirlf\/ModulationPy\" rel=\"noopener noreferrer nofollow\">ModulationPy<\/a> (GitHub)<\/p>\n<\/blockquote>\n<p>&#8212;  \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 \u0441\u0445\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 (\u044d\u0442\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0435 PSK, QAM \u0438 \u0442.\u043f.). \u041f\u0440\u043e\u0435\u043a\u0442 \u0431\u044b\u043b \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439: <a href=\"https:\/\/github.com\/veeresht\/CommPy\" rel=\"noopener noreferrer nofollow\">CommPy<\/a>; \u043e\u0434\u043d\u0430\u043a\u043e, \u0432 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0437\u0430\u0434\u0430\u0447 \u0441 \u043d\u0435\u0439 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u0430\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u0442\u044c\u0441\u044f!<\/p>\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/776\/8f8\/5bf\/7768f85bf74be6766c1dc767985ae64e.png\" alt=\"\u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ModulationPy\" title=\"\u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ModulationPy\" width=\"874\" height=\"614\"><figcaption>\u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ModulationPy<\/figcaption><\/figure>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0445\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><strong>M-PSK<\/strong>: <strong>P<\/strong>hase <strong>S<\/strong>hift <strong>K<\/strong>eying (\u0444\u0430\u0437\u043e\u0432\u0430\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p><strong>M-QAM<\/strong>: <strong>Q<\/strong>uadratured <strong>A<\/strong>mplitude <strong>M<\/strong>odulation (\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0443\u0440\u043d\u0430\u044f \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u043d\u0430\u044f \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f)<\/p>\n<p>\u0433\u0434\u0435 <strong>M<\/strong> &#8212; \u044d\u0442\u043e \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0432 \u0440\u0430\u0437\u0440\u0435\u0437\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u0432 \u0441\u0444\u0435\u0440\u0435 \u0431\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 (\u043f\u043e\u0434\u0431\u043e\u0440 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0439 \u0438\u0441\u0445\u043e\u0434\u0438\u043b \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0437 \u043d\u0435\u0435), \u043e\u0434\u043d\u0430\u043a\u043e, \u0432\u0434\u0440\u0443\u0433 \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0438 \u0434\u043b\u044f \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u0439. \u041d\u0435 MatLab&#8217;\u043e\u043c \u043d\u0430\u0441\u0443\u0449\u043d\u044b\u043c \u0435\u0434\u0438\u043d\u044b!<\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/11f\/ed2\/008\/11fed2008a6fb0568073e4104ab2432a.png\" alt=\"\" title=\"\" width=\"999\" height=\"878\"><figcaption><\/figcaption><\/figure>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 PyPI:<\/p>\n<pre><code class=\"bash\">$ pip install ModulationPy<\/code><\/pre>\n<p>\u041b\u0438\u0431\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u043d\u043e \u043d\u0430 PyPI \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f. <\/p>\n<p>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0432\u0435: <\/p>\n<ul>\n<li>\n<p>numpy&gt;=1.7.1<\/p>\n<\/li>\n<li>\n<p>matplotlib&gt;=2.2.2 (\u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0439)<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430 \u0434\u0435\u043b\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c QPSK \u0441 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c \u0444\u0430\u0437\u044b pi\/4, \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0413\u0440\u0435\u044e (Gray mapping). \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c:<\/p>\n<pre><code class=\"python\">import numpy as np from ModulationPy import PSKModem  modem = PSKModem(4, np.pi\/4,                  gray_map=True,                  bin_input=True)<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u043e \u043b\u0438 \u043c\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>plot_const()<\/code>:<\/p>\n<pre><code class=\"python\">modem.plot_const()<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d8\/6ce\/8f6\/1d86ce8f653af6fb3682ea7761d4cee0.png\" alt=\"\u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 QPSK \u0441 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c \u0444\u0430\u0437\u044b pi\/4, \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0413\u0440\u0435\u044e (Gray mapping)\" title=\"\u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 QPSK \u0441 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c \u0444\u0430\u0437\u044b pi\/4, \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0413\u0440\u0435\u044e (Gray mapping)\" width=\"894\" height=\"607\"><figcaption>\u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 QPSK \u0441 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c \u0444\u0430\u0437\u044b pi\/4, \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0413\u0440\u0435\u044e (Gray mapping)<\/figcaption><\/figure>\n<p>\u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0434\u043b\u044f <strong>16-QAM<\/strong> (\u043d\u043e \u0434\u043b\u044f \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043d\u0430 \u0432\u0445\u043e\u0434\u0435; \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0430\u0437\u043e\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e &#8212; \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0430\u044f QAM):<\/p>\n<pre><code class=\"python\">from ModulationPy import QAMModem  modem = QAMModem(16,                  gray_map=True,                   bin_input=False)  modem.plot_const()<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eed\/d7f\/b3c\/eedd7fb3cc68a5e6f57d7e2659f8d36d.png\" alt=\"\u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM \u0441 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0413\u0440\u0435\u044e (Gray mapping)\" title=\"\u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM \u0441 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0413\u0440\u0435\u044e (Gray mapping)\" width=\"874\" height=\"614\"><figcaption>\u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM \u0441 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0413\u0440\u0435\u044e (Gray mapping)<\/figcaption><\/figure>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f QAM \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>qammod<\/strong> \u0432 Octave [4]. \u0418, \u0434\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u00ab\u0447\u0435\u0442\u043d\u044b\u0435\u00bb (\u0432 \u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 log2(M) &#8212; \u0447\u0435\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e) \u0441\u0445\u0435\u043c\u044b \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 (4-QAM, 16-QAM, 64-QAM). \u041f\u0443\u0441\u0442\u044c \u0438 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043b\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440, \u043d\u043e \u043a\u0430\u043a \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e, \u0432 <a href=\"https:\/\/www.quora.com\/What-different-modulation-techniques-are-used-in-1G-2G-3G-4G-and-5G\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u0445 \u0431\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438<\/a> \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0435\u0442 &#171;\u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0445&#187; \u0441\u0445\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 (\u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u0437\u043d\u0430\u044e).<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0435\u0440\u0435\u0439\u0442\u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443 \u0432 \u043c\u043e\u0434\u0435\u043c\u0430\u0445: \u043a <strong>\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438<\/strong> \u0438 <strong>\u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438<\/strong>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430:<code>modulate()<\/code> \u0438 <code>demodulate()<\/code> , \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432 \u043e\u0431\u043e\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>modulate()<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442: <\/p>\n<ul>\n<li>\n<p>\u0432\u0435\u043a\u0442\u043e\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (<code>1-D ndarray of ints<\/code>) &#8212; \u043b\u0438\u0431\u043e \u0435\u0434\u0438\u043d\u0438\u0446 \u0438 \u043d\u0443\u043b\u0435\u0439, \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043e\u043f\u0446\u0438\u044f <code>bin_input=True<\/code> , \u043b\u0438\u0431\u043e \u0446\u0435\u043b\u044b\u0445 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043e\u0442 0 \u0434\u043e M-1, \u0435\u0441\u043b\u0438 <code>bin_input=False <\/code>;<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u0435\u0442\u043e\u0434<code>demodulate()<\/code> \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430: <\/p>\n<ul>\n<li>\n<p>\u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d (<code>1-D ndarray of complex symbols<\/code>)  ;<\/p>\n<\/li>\n<li>\n<p>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0438 \u0430\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0448\u0443\u043c\u0430 (<code>float<\/code>, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 1.0).<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0434\u043b\u044f QPSK (\u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0432\u0445\u043e\u0434\/\u0432\u044b\u0445\u043e\u0434):<\/p>\n<pre><code class=\"python\">import numpy as np from ModulationPy import PSKModem  modem = PSKModem(4, np.pi\/4,                   bin_input=True,                  soft_decision=False,                  bin_output=True)  msg = np.array([0, 0, 0, 1, 1, 0, 1, 1]) # input message  modulated = modem.modulate(msg) # modulation demodulated = modem.demodulate(modulated) # demodulation  print(\"Modulated message:\\n\"+str(modulated)) print(\"Demodulated message:\\n\"+str(demodulated))   &gt;&gt;&gt;  Modulated message:    [0.70710678+0.70710678j  0.70710678-0.70710678j     -0.70710678+0.70710678j  -0.70710678-0.70710678j] &gt;&gt;&gt; Demodulated message:    [0. 0. 0. 1. 1. 0. 1. 1.]<\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0442\u043e\u0436\u0435 QPSK, \u043d\u043e \u0443\u0436\u0435 \u0441 \u043d\u0435\u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \/ \u0432\u044b\u0445\u043e\u0434\u043e\u043c:<\/p>\n<pre><code class=\"python\">import numpy as np from ModulationPy import PSKModem  modem = PSKModem(4, np.pi\/4,                   bin_input=False,                  soft_decision=False,                  bin_output=False)  msg = np.array([0, 1, 2, 3]) # input message  modulated = modem.modulate(msg) # modulation demodulated = modem.demodulate(modulated) # demodulation  print(\"Modulated message:\\n\"+str(modulated)) print(\"Demodulated message:\\n\"+str(demodulated))  &gt;&gt;&gt; Modulated message: [ 0.70710678+0.70710678j -0.70710678+0.70710678j  0.70710678-0.70710678j  -0.70710678-0.70710678j]   &gt;&gt;&gt; Demodulated message: [0, 1, 2, 3]<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f 16-QAM (\u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \/ \u0432\u044b\u0445\u043e\u0434):<\/p>\n<pre><code class=\"python\">import numpy as np from ModulationPy import QAMModem  modem = PSKModem(16,                   bin_input=False,                  soft_decision=False,                  bin_output=False)  msg = np.array([i for i in range(16)]) # input message  modulated = modem.modulate(msg) # modulation demodulated = modem.demodulate(modulated) # demodulation  print(\"Demodulated message:\\n\"+str(demodulated))  &gt;&gt;&gt; Demodulated message: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]<\/code><\/pre>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0438 \u0446\u0435\u043b\u043e\u043c, \u044f \u0434\u0443\u043c\u0430\u044e, \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043c\u0430\u0442\u043b\u0430\u0431\u043e\u0432\u0441\u043a\u043e\u0433\u043e Communication Toolbox. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0432 <a href=\"https:\/\/github.com\/kirlf\/ModulationPy#1-m-psk\" rel=\"noopener noreferrer nofollow\">README.md<\/a> \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <\/p>\n<h2>BER performance<\/h2>\n<p>\u041f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e \u043b\u0438 \u043c\u043e\u0434\u0435\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0448\u0443\u043c\u0430 (\u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0410\u0411\u0413\u0428, \u043e\u043d \u0436\u0435 AWGN), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u0438\u0435\u043c\u0430-\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/323\/ff6\/530\/323ff6530dbb65f4940f769ffe6493c2.png\" alt=\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u0430 (\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440), \u043a\u0430\u043d\u0430\u043b\u0430 (AWGN) \u0438 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430 (\u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440 \u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438).\" title=\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u0430 (\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440), \u043a\u0430\u043d\u0430\u043b\u0430 (AWGN) \u0438 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430 (\u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440 \u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438).\" width=\"1259\" height=\"232\"><figcaption>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u0430 (\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440), \u043a\u0430\u043d\u0430\u043b\u0430 (AWGN) \u0438 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430 (\u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440 \u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438).<\/figcaption><\/figure>\n<p>\u0421\u0432\u0435\u0440\u044f\u0442\u044c\u0441\u044f \u0431\u0443\u0434\u0435\u043c \u0441 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u0440\u0438\u0432\u044b\u043c\u0438 [5] (\u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0432\u0441\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u043e\u0436\u0435 \u0432 <a href=\"https:\/\/github.com\/kirlf\/ModulationPy#3-bit-error-ratio-performance\" rel=\"noopener noreferrer nofollow\">README.md<\/a>). <\/p>\n<blockquote>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c: <a href=\"https:\/\/github.com\/kirlf\/ModulationPy\/blob\/master\/docs\/PSK_BER.py\" rel=\"noopener noreferrer nofollow\">M-PSK<\/a>, <a href=\"https:\/\/github.com\/kirlf\/ModulationPy\/blob\/master\/docs\/QAM_BER.py\" rel=\"noopener noreferrer nofollow\">M-QAM<\/a>.<\/p>\n<\/blockquote>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b0b\/790\/013\/b0b7900131dcb95b4bd722d4bbc46532.png\" alt=\"\u041a\u0440\u0438\u0432\u044b\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u043b\u044f AWGN (M-PSK).\" title=\"\u041a\u0440\u0438\u0432\u044b\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u043b\u044f AWGN (M-PSK).\" width=\"3000\" height=\"2100\"><figcaption>\u041a\u0440\u0438\u0432\u044b\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u043b\u044f AWGN (M-PSK).<\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/qb\/gc\/lj\/qbgcljn_yzdudsvnb3p2zbshtjw.png\" alt=\"\u041a\u0440\u0438\u0432\u044b\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u043b\u044f AWGN (M-QAM).\" title=\"\u041a\u0440\u0438\u0432\u044b\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u043b\u044f AWGN (M-QAM).\" width=\"750\" height=\"0\"><figcaption>\u041a\u0440\u0438\u0432\u044b\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u043b\u044f AWGN (M-QAM).<\/figcaption><\/figure>\n<p>\u0414\u0430, \u0441 \u043e\u0433\u0440\u0435\u0445\u0430\u043c\u0438 \u043d\u0430 \u043c\u0430\u043b\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a (\u0438\u0437-\u0437\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0443\u0441\u0440\u0435\u0434\u043d\u0435\u043d\u0438\u0439, \u044f \u043f\u043e\u043b\u0430\u0433\u0430\u044e), \u043e\u0434\u043d\u0430\u043a\u043e&#8230;. it works! <\/p>\n<h2>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h2>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 &#171;\u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f&#187; \u0441 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 \u0432\u044b\u0448\u0435 <a href=\"https:\/\/github.com\/veeresht\/CommPy\" rel=\"noopener noreferrer nofollow\">CommPy<\/a>. <\/p>\n<p>\u0427\u0442\u043e \u043d\u0430\u0441 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430, \u0441\u0442\u0438\u043b\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f (\u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0435, \u043d\u043e \u043d\u0435 \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0436\u0438\u043c\u043e\u0435); <\/p>\n<\/li>\n<li>\n<p>\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 [6] (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u043c\u0430\u0442\u043b\u0430\u0431\u043e\u0432\u0441\u043a\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <a href=\"https:\/\/www.mathworks.com\/help\/comm\/ug\/digital-modulation.html#brc6ymu\" rel=\"noopener noreferrer nofollow\">[7]<\/a>, \u043d\u0443, \u0438 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432\u0441\u0435 \u0432 \u0442\u043e\u0442 \u0436\u0435 <a href=\"https:\/\/github.com\/kirlf\/ModulationPy#4-execution-time-performance\" rel=\"noopener noreferrer nofollow\">README.md<\/a>).<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0432\u043e\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c &#171;\u0437\u0430\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u0442\u044c&#187;:<\/p>\n<ul>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442: <a href=\"https:\/\/github.com\/kirlf\/ModulationPy\/blob\/master\/docs\/CommPy_vs_ModulationPy.ipynb\" rel=\"noopener noreferrer nofollow\">CommPy_vs_ModulationPy.ipynb<\/a><\/p>\n<\/li>\n<li>\n<p>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430: <a href=\"https:\/\/jupyter.org\/try\" rel=\"noopener noreferrer nofollow\">https:\/\/jupyter.org\/try<\/a> (Classic Notebook)<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u0438\u043d\u0430 \u0444\u0440\u0435\u0439\u043c\u0430: 10 000 (\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>\u041c\u0435\u0442\u043e\u0434 (\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430)<\/p>\n<\/th>\n<th>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u043c\u0441)<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p>modulation (<strong>ModulationPy<\/strong>):  QPSK<\/p>\n<\/td>\n<td>\n<p>10.3<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>modulation (<em>CommPy<\/em>):  QPSK<\/p>\n<\/td>\n<td>\n<p>15.7<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>demodulation (<strong>ModulationPy<\/strong>):  QPSK<\/p>\n<\/td>\n<td>\n<p>0.4<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>demodulation (<em>CommPy<\/em>):  QPSK<\/p>\n<\/td>\n<td>\n<p>319<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>modulation (<strong>ModulationPy<\/strong>):  256-QAM<\/p>\n<\/td>\n<td>\n<p>8.9<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>modulation (<em>CommPy<\/em>):  256-QAM<\/p>\n<\/td>\n<td>\n<p>11.3<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>demodulation (<strong>ModulationPy<\/strong>):  256-QAM<\/p>\n<\/td>\n<td>\n<p>42.6<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>demodulation (<em>CommPy<\/em>):  256-QAM<\/p>\n<\/td>\n<td>\n<p>22 000<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c <a href=\"https:\/\/github.com\/veeresht\/CommPy\" rel=\"noopener noreferrer nofollow\">CommPy<\/a> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0432\u0440\u043e\u0434\u0435, \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c (\u0441\u043c. \u0434\u0430\u043d\u043d\u044b\u0439 <a href=\"https:\/\/github.com\/veeresht\/CommPy\/issues\/100\" rel=\"noopener noreferrer nofollow\">issue<\/a>) &#8212; \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u043e\u0431\u043e\u0437\u0440\u0438\u043c\u043e\u043c \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0438\u0437 \u043c\u043e\u0435\u0433\u043e <strong>ModulationPy<\/strong> \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043e\u0447\u0435\u0432\u044b\u0432\u0430\u0442\u044c \u0432 <strong>CommPy<\/strong> (\u044f \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u0443 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u043b\u043e). \u041d\u043e \u044d\u0442\u043e, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u043f\u043e\u0436\u0438\u0432\u0435\u043c &#8212; \u0443\u0432\u0438\u0434\u0438\u043c.<\/p>\n<p>\u0418, \u0434\u0430, \u043f\u0443\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0435 \u0434\u043e\u0442\u044f\u043d\u0443\u043b\u0438 \u0434\u043e MatLab (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430: \u0441\u043c. \u0432\u043a\u043b\u0430\u0434\u043a\u0443 <a href=\"https:\/\/ch.mathworks.com\/matlabcentral\/fileexchange\/72860-fast-qpsk-implementation?s_tid=prof_contriblnk\" rel=\"noopener noreferrer nofollow\">&#171;Examples&#187;<\/a>), \u044f \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u044e \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u043e\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u043c!<\/p>\n<h2>\u041f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0435\u0449\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 (\u0442\u0435\u0445 \u0436\u0435 32-QAM \u0438 128-QAM \u0438\u043b\u0438 \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u0432 DVB-S2\/S2X <a href=\"https:\/\/en.wikipedia.org\/wiki\/Amplitude_and_phase-shift_keying\" rel=\"noopener noreferrer nofollow\">APSK<\/a>), \u043e\u0434\u043d\u0430\u043a\u043e, \u0447\u0435\u0441\u0442\u043d\u043e \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u043d\u0435 \u043c\u043e\u0433\u0443 \u043e\u0431\u0435\u0449\u0430\u0442\u044c \u0438\u0445 \u0441\u043a\u043e\u0440\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f. <\/p>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043c\u0435\u0440\u0435 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u043e\u0439 \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430 Python \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438  NumPy \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 (\u0438 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432: \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u044b (\u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u043f\u0440\u0430\u0432\u0434\u0430 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 pytest &#8212; \u043a\u0430\u044e\u0441\u044c), CI (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Travis), \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0434\u043b\u044f PyPi \u0438 \u0442.\u0434.), \u043e\u0434\u043d\u0430\u043a\u043e, \u0442\u0435\u043f\u0435\u0440\u044c, \u0441\u043b\u0430\u0432\u0430 \u0431\u043e\u0433\u0443, \u0432\u0441\u0435\u043c\u0443 \u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0437\u0430\u0434\u0430\u0447!<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0432\u0441\u0435 \u0436\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u0432\u0430\u0448\u0438\u043c issue \u0438 pull request&#8217;\u0430\u043c! \u0418 \u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u044c\u043c\u0435\u0442\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 <strong>CommPy<\/strong>, \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e! <\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043d\u0435 \u0441\u0435\u0440\u0447\u0430\u0439\u0442\u0435, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u0438 \u0434\u0430 \u043f\u0440\u0435\u0431\u0443\u0434\u0435\u0442 \u0441 \u0432\u0430\u043c\u0438 \u0441\u0438\u043b\u0430 \u043d\u0430\u0443\u043a\u0438! <\/p>\n<h3>\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0438 \u0441\u0441\u044b\u043b\u043a\u0438<\/h3>\n<ol>\n<li>\n<p>Haykin S. Communication systems. \u2013 John Wiley &amp; Sons, 2008. \u2014 p. 93 <\/p>\n<\/li>\n<li>\n<p>Goldsmith A. Wireless communications. \u2013 Cambridge university press, 2005. \u2013 p. 88-92<\/p>\n<\/li>\n<li>\n<p>MathWorks: comm.PSKModulator (<a href=\"https:\/\/www.mathworks.com\/help\/comm\/ref\/comm.pskmodulator-system-object.html?s_tid=doc_ta\" rel=\"noopener noreferrer nofollow\">https:\/\/www.mathworks.com\/help\/comm\/ref\/comm.pskmodulator-system-object.html?s_tid=doc_ta<\/a>)<\/p>\n<\/li>\n<li>\n<p>Octave: qammod (<a href=\"https:\/\/octave.sourceforge.io\/communications\/function\/qammod.html\" rel=\"noopener noreferrer nofollow\">https:\/\/octave.sourceforge.io\/communications\/function\/qammod.html<\/a>)<\/p>\n<\/li>\n<li>\n<p>Link Budget Analysis: Digital Modulation, Part 3 (<a href=\"http:\/\/www.AtlantaRF.com\" rel=\"noopener noreferrer nofollow\">www.AtlantaRF.com<\/a>)<\/p>\n<\/li>\n<li>\n<p>Viterbi, A. J. (1998). An intuitive justification and a simplified implementation of the MAP decoder for convolutional codes. IEEE Journal on Selected Areas in Communications, 16(2), 260-264.<\/p>\n<\/li>\n<li>\n<p>MathWorks: Approximate LLR Algorithm (<a href=\"https:\/\/www.mathworks.com\/help\/comm\/ug\/digital-modulation.html#brc6ymu\" rel=\"noopener noreferrer nofollow\">https:\/\/www.mathworks.com\/help\/comm\/ug\/digital-modulation.html#brc6ymu<\/a>)<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<p> \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\/post\/552242\/\"> https:\/\/habr.com\/ru\/post\/552242\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! <\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c:<\/p>\n<blockquote>\n<p><a href=\"https:\/\/github.com\/kirlf\/ModulationPy\" rel=\"noopener noreferrer nofollow\">ModulationPy<\/a> (GitHub)<\/p>\n<\/blockquote>\n<p>&#8212;  \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 \u0441\u0445\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 (\u044d\u0442\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0435 PSK, QAM \u0438 \u0442.\u043f.). \u041f\u0440\u043e\u0435\u043a\u0442 \u0431\u044b\u043b \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439: <a href=\"https:\/\/github.com\/veeresht\/CommPy\" rel=\"noopener noreferrer nofollow\">CommPy<\/a>; \u043e\u0434\u043d\u0430\u043a\u043e, \u0432 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0437\u0430\u0434\u0430\u0447 \u0441 \u043d\u0435\u0439 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u0430\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u0442\u044c\u0441\u044f!<\/p>\n<figure class=\"bordered full-width\"><figcaption>\u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ModulationPy<\/figcaption><\/figure>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0445\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><strong>M-PSK<\/strong>: <strong>P<\/strong>hase <strong>S<\/strong>hift <strong>K<\/strong>eying (\u0444\u0430\u0437\u043e\u0432\u0430\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p><strong>M-QAM<\/strong>: <strong>Q<\/strong>uadratured <strong>A<\/strong>mplitude <strong>M<\/strong>odulation (\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0443\u0440\u043d\u0430\u044f \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u043d\u0430\u044f \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f)<\/p>\n<p>\u0433\u0434\u0435 <strong>M<\/strong> &#8212; \u044d\u0442\u043e \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0432 \u0440\u0430\u0437\u0440\u0435\u0437\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u0432 \u0441\u0444\u0435\u0440\u0435 \u0431\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 (\u043f\u043e\u0434\u0431\u043e\u0440 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0439 \u0438\u0441\u0445\u043e\u0434\u0438\u043b \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0437 \u043d\u0435\u0435), \u043e\u0434\u043d\u0430\u043a\u043e, \u0432\u0434\u0440\u0443\u0433 \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0438 \u0434\u043b\u044f \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u0439. \u041d\u0435 MatLab&#8217;\u043e\u043c \u043d\u0430\u0441\u0443\u0449\u043d\u044b\u043c \u0435\u0434\u0438\u043d\u044b!<\/p>\n<figure class=\"float full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 PyPI:<\/p>\n<pre><code class=\"bash\">$ pip install ModulationPy<\/code><\/pre>\n<p>\u041b\u0438\u0431\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u043d\u043e \u043d\u0430 PyPI \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f. <\/p>\n<p>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0432\u0435: <\/p>\n<ul>\n<li>\n<p>numpy&gt;=1.7.1<\/p>\n<\/li>\n<li>\n<p>matplotlib&gt;=2.2.2 (\u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0439)<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430 \u0434\u0435\u043b\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c QPSK \u0441 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c \u0444\u0430\u0437\u044b pi\/4, \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0413\u0440\u0435\u044e (Gray mapping). \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c:<\/p>\n<pre><code class=\"python\">import numpy as np from ModulationPy import PSKModem  modem = PSKModem(4, np.pi\/4,                  gray_map=True,                  bin_input=True)<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u043e \u043b\u0438 \u043c\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>plot_const()<\/code>:<\/p>\n<pre><code class=\"python\">modem.plot_const()<\/code><\/pre>\n<figure class=\"full-width\"><figcaption>\u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 QPSK \u0441 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c \u0444\u0430\u0437\u044b pi\/4, \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0413\u0440\u0435\u044e (Gray mapping)<\/figcaption><\/figure>\n<p>\u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0434\u043b\u044f <strong>16-QAM<\/strong> (\u043d\u043e \u0434\u043b\u044f \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043d\u0430 \u0432\u0445\u043e\u0434\u0435; \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0430\u0437\u043e\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e &#8212; \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0430\u044f QAM):<\/p>\n<pre><code class=\"python\">from ModulationPy import QAMModem  modem = QAMModem(16,                  gray_map=True,                   bin_input=False)  modem.plot_const()<\/code><\/pre>\n<figure class=\"full-width\"><figcaption>\u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM \u0441 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0413\u0440\u0435\u044e (Gray mapping)<\/figcaption><\/figure>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f QAM \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>qammod<\/strong> \u0432 Octave [4]. \u0418, \u0434\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u00ab\u0447\u0435\u0442\u043d\u044b\u0435\u00bb (\u0432 \u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 log2(M) &#8212; \u0447\u0435\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e) \u0441\u0445\u0435\u043c\u044b \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 (4-QAM, 16-QAM, 64-QAM). \u041f\u0443\u0441\u0442\u044c \u0438 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043b\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440, \u043d\u043e \u043a\u0430\u043a \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e, \u0432 <a href=\"https:\/\/www.quora.com\/What-different-modulation-techniques-are-used-in-1G-2G-3G-4G-and-5G\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u0445 \u0431\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438<\/a> \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0435\u0442 &#171;\u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0445&#187; \u0441\u0445\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 (\u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u0437\u043d\u0430\u044e).<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0435\u0440\u0435\u0439\u0442\u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443 \u0432 \u043c\u043e\u0434\u0435\u043c\u0430\u0445: \u043a <strong>\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438<\/strong> \u0438 <strong>\u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438<\/strong>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430:<code>modulate()<\/code> \u0438 <code>demodulate()<\/code> , \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432 \u043e\u0431\u043e\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>modulate()<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442: <\/p>\n<ul>\n<li>\n<p>\u0432\u0435\u043a\u0442\u043e\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (<code>1-D ndarray of ints<\/code>) &#8212; \u043b\u0438\u0431\u043e \u0435\u0434\u0438\u043d\u0438\u0446 \u0438 \u043d\u0443\u043b\u0435\u0439, \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043e\u043f\u0446\u0438\u044f <code>bin_input=True<\/code> , \u043b\u0438\u0431\u043e \u0446\u0435\u043b\u044b\u0445 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043e\u0442 0 \u0434\u043e M-1, \u0435\u0441\u043b\u0438 <code>bin_input=False <\/code>;<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u0435\u0442\u043e\u0434<code>demodulate()<\/code> \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430: <\/p>\n<ul>\n<li>\n<p>\u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d (<code>1-D ndarray of complex symbols<\/code>)  ;<\/p>\n<\/li>\n<li>\n<p>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0438 \u0430\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0448\u0443\u043c\u0430 (<code>float<\/code>, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 1.0).<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0434\u043b\u044f QPSK (\u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0432\u0445\u043e\u0434\/\u0432\u044b\u0445\u043e\u0434):<\/p>\n<pre><code class=\"python\">import numpy as np from ModulationPy import PSKModem  modem = PSKModem(4, np.pi\/4,                   bin_input=True,                  soft_decision=False,                  bin_output=True)  msg = np.array([0, 0, 0, 1, 1, 0, 1, 1]) # input message  modulated = modem.modulate(msg) # modulation demodulated = modem.demodulate(modulated) # demodulation  print(\"Modulated message:\\n\"+str(modulated)) print(\"Demodulated message:\\n\"+str(demodulated))   &gt;&gt;&gt;  Modulated message:    [0.70710678+0.70710678j  0.70710678-0.70710678j     -0.70710678+0.70710678j  -0.70710678-0.70710678j] &gt;&gt;&gt; Demodulated message:    [0. 0. 0. 1. 1. 0. 1. 1.]<\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0442\u043e\u0436\u0435 QPSK, \u043d\u043e \u0443\u0436\u0435 \u0441 \u043d\u0435\u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \/ \u0432\u044b\u0445\u043e\u0434\u043e\u043c:<\/p>\n<pre><code class=\"python\">import numpy as np from ModulationPy import PSKModem  modem = PSKModem(4, np.pi\/4,                   bin_input=False,                  soft_decision=False,                  bin_output=False)  msg = np.array([0, 1, 2, 3]) # input message  modulated = modem.modulate(msg) # modulation demodulated = modem.demodulate(modulated) # demodulation  print(\"Modulated message:\\n\"+str(modulated)) print(\"Demodulated message:\\n\"+str(demodulated))  &gt;&gt;&gt; Modulated message: [ 0.70710678+0.70710678j -0.70710678+0.70710678j  0.70710678-0.70710678j  -0.70710678-0.70710678j]   &gt;&gt;&gt; Demodulated message: [0, 1, 2, 3]<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f 16-QAM (\u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \/ \u0432\u044b\u0445\u043e\u0434):<\/p>\n<pre><code class=\"python\">import numpy as np from ModulationPy import QAMModem  modem = PSKModem(16,                   bin_input=False,                  soft_decision=False,                  bin_output=False)  msg = np.array([i for i in range(16)]) # input message  modulated = modem.modulate(msg) # modulation demodulated = modem.demodulate(modulated) # demodulation  print(\"Demodulated message:\\n\"+str(demodulated))  &gt;&gt;&gt; Demodulated message: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]<\/code><\/pre>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0438 \u0446\u0435\u043b\u043e\u043c, \u044f \u0434\u0443\u043c\u0430\u044e, \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043c\u0430\u0442\u043b\u0430\u0431\u043e\u0432\u0441\u043a\u043e\u0433\u043e Communication Toolbox. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0432 <a href=\"https:\/\/github.com\/kirlf\/ModulationPy#1-m-psk\" rel=\"noopener noreferrer nofollow\">README.md<\/a> \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <\/p>\n<h2>BER performance<\/h2>\n<p>\u041f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e \u043b\u0438 \u043c\u043e\u0434\u0435\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0448\u0443\u043c\u0430 (\u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0410\u0411\u0413\u0428, \u043e\u043d \u0436\u0435 AWGN), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u0438\u0435\u043c\u0430-\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438:<\/p>\n<figure class=\"full-width\"><figcaption>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u0430 (\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440), \u043a\u0430\u043d\u0430\u043b\u0430 (AWGN) \u0438 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430 (\u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440 \u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438).<\/figcaption><\/figure>\n<p>\u0421\u0432\u0435\u0440\u044f\u0442\u044c\u0441\u044f \u0431\u0443\u0434\u0435\u043c \u0441 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u0440\u0438\u0432\u044b\u043c\u0438 [5] (\u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0432\u0441\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u043e\u0436\u0435 \u0432 <a href=\"https:\/\/github.com\/kirlf\/ModulationPy#3-bit-error-ratio-performance\" rel=\"noopener noreferrer nofollow\">README.md<\/a>). <\/p>\n<blockquote>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c: <a href=\"https:\/\/github.com\/kirlf\/ModulationPy\/blob\/master\/docs\/PSK_BER.py\" rel=\"noopener noreferrer nofollow\">M-PSK<\/a>, <a href=\"https:\/\/github.com\/kirlf\/ModulationPy\/blob\/master\/docs\/QAM_BER.py\" rel=\"noopener noreferrer nofollow\">M-QAM<\/a>.<\/p>\n<\/blockquote>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<figure class=\"full-width\"><figcaption>\u041a\u0440\u0438\u0432\u044b\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u043b\u044f AWGN (M-PSK).<\/figcaption><\/figure>\n<figure class=\"\"><figcaption>\u041a\u0440\u0438\u0432\u044b\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u043b\u044f AWGN (M-QAM).<\/figcaption><\/figure>\n<p>\u0414\u0430, \u0441 \u043e\u0433\u0440\u0435\u0445\u0430\u043c\u0438 \u043d\u0430 \u043c\u0430\u043b\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a (\u0438\u0437-\u0437\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0443\u0441\u0440\u0435\u0434\u043d\u0435\u043d\u0438\u0439, \u044f \u043f\u043e\u043b\u0430\u0433\u0430\u044e), \u043e\u0434\u043d\u0430\u043a\u043e&#8230;. it works! <\/p>\n<h2>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h2>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 &#171;\u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f&#187; \u0441 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 \u0432\u044b\u0448\u0435 <a href=\"https:\/\/github.com\/veeresht\/CommPy\" rel=\"noopener noreferrer nofollow\">CommPy<\/a>. <\/p>\n<p>\u0427\u0442\u043e \u043d\u0430\u0441 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430, \u0441\u0442\u0438\u043b\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f (\u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0435, \u043d\u043e \u043d\u0435 \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0436\u0438\u043c\u043e\u0435); <\/p>\n<\/li>\n<li>\n<p>\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 [6] (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u043c\u0430\u0442\u043b\u0430\u0431\u043e\u0432\u0441\u043a\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <a href=\"https:\/\/www.mathworks.com\/help\/comm\/ug\/digital-modulation.html#brc6ymu\" rel=\"noopener noreferrer nofollow\">[7]<\/a>, \u043d\u0443, \u0438 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432\u0441\u0435 \u0432 \u0442\u043e\u0442 \u0436\u0435 <a href=\"https:\/\/github.com\/kirlf\/ModulationPy#4-execution-time-performance\" rel=\"noopener noreferrer nofollow\">README.md<\/a>).<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0432\u043e\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c &#171;\u0437\u0430\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u0442\u044c&#187;:<\/p>\n<ul>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442: <a href=\"https:\/\/github.com\/kirlf\/ModulationPy\/blob\/master\/docs\/CommPy_vs_ModulationPy.ipynb\" rel=\"noopener noreferrer nofollow\">CommPy_vs_ModulationPy.ipynb<\/a><\/p>\n<\/li>\n<li>\n<p>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430: <a href=\"https:\/\/jupyter.org\/try\" rel=\"noopener noreferrer nofollow\">https:\/\/jupyter.org\/try<\/a> (Classic Notebook)<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u0438\u043d\u0430 \u0444\u0440\u0435\u0439\u043c\u0430: 10 000 (\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>\u041c\u0435\u0442\u043e\u0434 (\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430)<\/p>\n<\/th>\n<th>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u043c\u0441)<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p>modulation (<strong>ModulationPy<\/strong>):  QPSK<\/p>\n<\/td>\n<td>\n<p>10.3<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>modulation (<em>CommPy<\/em>):  QPSK<\/p>\n<\/td>\n<td>\n<p>15.7<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>demodulation (<strong>ModulationPy<\/strong>):  QPSK<\/p>\n<\/td>\n<td>\n<p>0.4<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>demodulation (<em>CommPy<\/em>):  QPSK<\/p>\n<\/td>\n<td>\n<p>319<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>modulation (<strong>ModulationPy<\/strong>):  256-QAM<\/p>\n<\/td>\n<td>\n<p>8.9<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>modulation (<em>CommPy<\/em>):  256-QAM<\/p>\n<\/td>\n<td>\n<p>11.3<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>demodulation (<strong>ModulationPy<\/strong>):  256-QAM<\/p>\n<\/td>\n<td>\n<p>42.6<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>demodulation (<em>CommPy<\/em>):  256-QAM<\/p>\n<\/td>\n<td>\n<p>22 000<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c <a href=\"https:\/\/github.com\/veeresht\/CommPy\" rel=\"noopener noreferrer nofollow\">CommPy<\/a> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0432\u0440\u043e\u0434\u0435, \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c (\u0441\u043c. \u0434\u0430\u043d\u043d\u044b\u0439 <a href=\"https:\/\/github.com\/veeresht\/CommPy\/issues\/100\" rel=\"noopener noreferrer nofollow\">issue<\/a>) &#8212; \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u043e\u0431\u043e\u0437\u0440\u0438\u043c\u043e\u043c \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0438\u0437 \u043c\u043e\u0435\u0433\u043e <strong>ModulationPy<\/strong> \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043e\u0447\u0435\u0432\u044b\u0432\u0430\u0442\u044c \u0432 <strong>CommPy<\/strong> (\u044f \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u0443 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u043b\u043e). \u041d\u043e \u044d\u0442\u043e, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u043f\u043e\u0436\u0438\u0432\u0435\u043c &#8212; \u0443\u0432\u0438\u0434\u0438\u043c.<\/p>\n<p>\u0418, \u0434\u0430, \u043f\u0443\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0435 \u0434\u043e\u0442\u044f\u043d\u0443\u043b\u0438 \u0434\u043e MatLab (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430: \u0441\u043c. \u0432\u043a\u043b\u0430\u0434\u043a\u0443 <a href=\"https:\/\/ch.mathworks.com\/matlabcentral\/fileexchange\/72860-fast-qpsk-implementation?s_tid=prof_contriblnk\" rel=\"noopener noreferrer nofollow\">&#171;Examples&#187;<\/a>), \u044f \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u044e \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u043e\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u043c!<\/p>\n<h2>\u041f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0435\u0449\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 (\u0442\u0435\u0445 \u0436\u0435 32-QAM \u0438 128-QAM \u0438\u043b\u0438 \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u0432 DVB-S2\/S2X <a href=\"https:\/\/en.wikipedia.org\/wiki\/Amplitude_and_phase-shift_keying\" rel=\"noopener noreferrer nofollow\">APSK<\/a>), \u043e\u0434\u043d\u0430\u043a\u043e, \u0447\u0435\u0441\u0442\u043d\u043e \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u043d\u0435 \u043c\u043e\u0433\u0443 \u043e\u0431\u0435\u0449\u0430\u0442\u044c \u0438\u0445 \u0441\u043a\u043e\u0440\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f. <\/p>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043c\u0435\u0440\u0435 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u043e\u0439 \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430 Python \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438  NumPy \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 (\u0438 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432: \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u044b (\u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u043f\u0440\u0430\u0432\u0434\u0430 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 pytest &#8212; \u043a\u0430\u044e\u0441\u044c), CI (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Travis), \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0434\u043b\u044f PyPi \u0438 \u0442.\u0434.), \u043e\u0434\u043d\u0430\u043a\u043e, \u0442\u0435\u043f\u0435\u0440\u044c, \u0441\u043b\u0430\u0432\u0430 \u0431\u043e\u0433\u0443, \u0432\u0441\u0435\u043c\u0443 \u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0437\u0430\u0434\u0430\u0447!<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0432\u0441\u0435 \u0436\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u0432\u0430\u0448\u0438\u043c issue \u0438 pull request&#8217;\u0430\u043c! \u0418 \u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u044c\u043c\u0435\u0442\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 <strong>CommPy<\/strong>, \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e! <\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043d\u0435 \u0441\u0435\u0440\u0447\u0430\u0439\u0442\u0435, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u0438 \u0434\u0430 \u043f\u0440\u0435\u0431\u0443\u0434\u0435\u0442 \u0441 \u0432\u0430\u043c\u0438 \u0441\u0438\u043b\u0430 \u043d\u0430\u0443\u043a\u0438! <\/p>\n<h3>\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0438 \u0441\u0441\u044b\u043b\u043a\u0438<\/h3>\n<ol>\n<li>\n<p>Haykin S. Communication systems. \u2013 John Wiley &amp; Sons, 2008. \u2014 p. 93 <\/p>\n<\/li>\n<li>\n<p>Goldsmith A. Wireless communications. \u2013 Cambridge university press, 2005. \u2013 p. 88-92<\/p>\n<\/li>\n<li>\n<p>MathWorks: comm.PSKModulator (<a href=\"https:\/\/www.mathworks.com\/help\/comm\/ref\/comm.pskmodulator-system-object.html?s_tid=doc_ta\" rel=\"noopener noreferrer nofollow\">https:\/\/www.mathworks.com\/help\/comm\/ref\/comm.pskmodulator-system-object.html?s_tid=doc_ta<\/a>)<\/p>\n<\/li>\n<li>\n<p>Octave: qammod (<a href=\"https:\/\/octave.sourceforge.io\/communications\/function\/qammod.html\" rel=\"noopener noreferrer nofollow\">https:\/\/octave.sourceforge.io\/communications\/function\/qammod.html<\/a>)<\/p>\n<\/li>\n<li>\n<p>Link Budget Analysis: Digital Modulation, Part 3 (<a href=\"http:\/\/www.AtlantaRF.com\" rel=\"noopener noreferrer nofollow\">www.AtlantaRF.com<\/a>)<\/p>\n<\/li>\n<li>\n<p>Viterbi, A. J. (1998). An intuitive justification and a simplified implementation of the MAP decoder for convolutional codes. IEEE Journal on Selected Areas in Communications, 16(2), 260-264.<\/p>\n<\/li>\n<li>\n<p>MathWorks: Approximate LLR Algorithm (<a href=\"https:\/\/www.mathworks.com\/help\/comm\/ug\/digital-modulation.html#brc6ymu\" rel=\"noopener noreferrer nofollow\">https:\/\/www.mathworks.com\/help\/comm\/ug\/digital-modulation.html#brc6ymu<\/a>)<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<p> \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\/post\/552242\/\"> https:\/\/habr.com\/ru\/post\/552242\/<\/a><br \/><\/br><\/br><\/p>\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-321419","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/321419","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=321419"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/321419\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=321419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=321419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=321419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}