{"id":482477,"date":"2026-06-05T07:42:05","date_gmt":"2026-06-05T07:42:05","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=482477"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=482477","title":{"rendered":"\u0418\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 LDPC\/\u0442\u0443\u0440\u0431\u043e, \u043f\u043e\u043b\u044f\u0440\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u2014 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430 C++ \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441 MATLAB"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0448\u044c \u043f\u043e\u043c\u0435\u0445\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0435 \u043a\u043e\u0434\u044b, \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0447\u0451\u0440\u043d\u044b\u043c \u044f\u0449\u0438\u043a\u043e\u043c: \u043f\u0438\u0448\u0435\u0448\u044c ldpcDecode(llr, cfg, 30), comm.TurboDecoder \u0438\u043b\u0438 dvbs2ldpc(1\/2) \u2014 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0448\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u00ab\u0432\u043e\u0434\u043e\u043f\u0430\u0434\u00bb BER, \u043d\u0435 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u044f \u0432\u043d\u0443\u0442\u0440\u044c. \u0410 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u0434\u0430\u0445 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043c: \u043d\u0435 \u0432 \u0442\u043e\u043c, \u043a\u0430\u043a \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u0432 \u0442\u043e\u043c, \u043a\u0430\u043a \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0438\u0437 \u0437\u0430\u0448\u0443\u043c\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0442\u044b.<\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1042816\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a> \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c: \u00ab\u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 LDPC\/\u0442\u0443\u0440\u0431\u043e \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u0438\u043b\u0438 \u043f\u043e\u043b\u044f\u0440\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u2014 \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445\u00bb. \u041d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u2014 \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0438 \u0435\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432. \u0427\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u0442\u0430\u043c \u043c\u044b \u043f\u0440\u043e\u0448\u043b\u0438 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044e \u043a\u043e\u0434\u043e\u0432 \u0432 \u0441\u043e\u0442\u043e\u0432\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u043e\u0442 GSM \u0434\u043e 5G \u043f\u043e BER-\u043a\u0440\u0438\u0432\u044b\u043c \u0432 MATLAB, \u0430 \u0432\u0441\u0451 \u043d\u0443\u0436\u043d\u043e\u0435 \u044f \u043d\u0430\u043f\u043e\u043c\u043d\u044e \u043f\u043e \u0445\u043e\u0434\u0443. \u0417\u0434\u0435\u0441\u044c \u2014 \u0432\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u0430\u043c\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u044b.<\/p>\n<p>\u042d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u044f\u0449\u0438\u043a. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0442\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>belief propagation<\/strong> \u2014 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e \u0433\u0440\u0430\u0444\u0443, \u044f\u0434\u0440\u043e LDPC \u0438 \u0432\u0441\u0435\u0433\u043e 5G eMBB;<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>BCJR + \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u043c\u043d\u0435\u043d\u0438\u044f\u043c\u0438<\/strong> \u2014 \u0442\u043e, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u043e \u0442\u0443\u0440\u0431\u043e-\u043a\u043e\u0434\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438;<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>successive cancellation<\/strong> \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u044f\u0440\u043d\u044b\u0445 \u043a\u043e\u0434\u0430\u0445.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443, MATLAB-\u0442\u0443\u043b\u0431\u043e\u043a\u0441 \u043d\u0435 \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u2014 \u043e\u043d \u043f\u0440\u044f\u0447\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0441\u044c \u0440\u0430\u0437\u0431\u043e\u0440 \u0438\u0434\u0451\u0442 \u043f\u043e \u043a\u043e\u0434\u0443 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u2014 <a href=\"https:\/\/github.com\/BessonovT\/fec-cpp\" rel=\"noopener noreferrer nofollow\">fec-cpp<\/a>: header-only C++17, \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u043e\u043b\u044c\u043a\u043e STL. \u0415\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0437\u0430 \u0432\u0435\u0447\u0435\u0440, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0432 \u043d\u0435\u0439 \u2014 \u043f\u043e\u043b\u0441\u043e\u0442\u043d\u0438 \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0435. \u0420\u044f\u0434\u043e\u043c \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0440\u0430\u0437\u0431\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0438 MATLAB-\u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 \u2014 \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442: \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0442\u0443\u043b\u0431\u043e\u043a\u0441\u0430 \u043f\u0440\u043e\u0442\u0438\u0432 \u044f\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u0410 \u0432 \u043a\u043e\u043d\u0446\u0435 \u2014 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0433\u043e\u043d\u0438\u043c \u043e\u0431\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u043a\u043e\u0434\u0430\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0438\u043c \u0438\u0445 BER-\u043a\u0440\u0438\u0432\u044b\u0435 \u043d\u0430 \u043e\u0434\u043d\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0438.<\/p>\n<p>\u042d\u0442\u043e \u0443\u0447\u0435\u0431\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. LDPC \u0437\u0434\u0435\u0441\u044c \u2014 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0430\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430, \u0430 \u043d\u0435 DVB-S2 \u043d\u0430 64800 \u0431\u0438\u0442; \u0442\u0443\u0440\u0431\u043e \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 RSC [7,5], \u0430 \u043d\u0435 LTE \u0441 QPP; \u043f\u043e\u043b\u044f\u0440\u043d\u044b\u0439 \u2014 SC \u0431\u0435\u0437 \u0441\u043f\u0438\u0441\u043e\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0426\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u0430 \u043d\u0435 \u043f\u043e\u0431\u0438\u0442\u044c \u0440\u0435\u043a\u043e\u0440\u0434 \u043f\u043e BER, \u043d\u043e \u0432\u0441\u0435 \u0442\u0440\u0438 \u0434\u0430\u044e\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0432\u043e\u0434\u043e\u043f\u0430\u0434 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u043b\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0438\u0436\u0435 \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<h3>\u041e\u0431\u0449\u0438\u0439 \u044f\u0437\u044b\u043a: LLR<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043b\u0435\u0437\u0442\u044c \u0432 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u044b, \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c\u0441\u044f \u043f\u0440\u043e \u043e\u0434\u043d\u043e \u0447\u0438\u0441\u043b\u043e, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0432\u0441\u0435 \u0442\u0440\u043e\u0435, \u2014 <strong>LLR<\/strong>, \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u0438\u044f:<\/p>\n<p>LLR_j = log( P(\u0431\u0438\u0442_j = 0 | \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0435) \/ P(\u0431\u0438\u0442_j = 1 | \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0435) )<\/p>\n<p>\u041f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 LLR \u2014 \u0441\u043a\u043b\u043e\u043d\u044f\u0435\u043c\u0441\u044f \u043a \u043d\u0443\u043b\u044e, \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u2014 \u043a \u0435\u0434\u0438\u043d\u0438\u0446\u0435, \u043c\u043e\u0434\u0443\u043b\u044c \u2014 \u044d\u0442\u043e \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c. \u0414\u043b\u044f BPSK \u0432 AWGN-\u043a\u0430\u043d\u0430\u043b\u0435 \u0441 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0435\u0439 \u03c3\u00b2 \u0432\u0441\u0451 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u043e\u0439: LLR = 2y\/\u03c3\u00b2. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043a\u0430\u043d\u0430\u043b \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u2014 AWGNChannel \u0441\u0440\u0430\u0437\u0443 \u043e\u0442\u0434\u0430\u0451\u0442 \u043d\u0435 \u0431\u0438\u0442\u044b, \u0430 LLR:<\/p>\n<pre><code class=\"cpp\">\/\/ include\/fec\/common\/channel.hppLLRVec transmit(const BitVec&amp; bits) {  \u00a0\u00a0\u00a0 LLRVec llr(bits.size());  \u00a0\u00a0\u00a0 for(size_t i = 0; i &lt; bits.size(); i++){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float s;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(bits[i] == 0) s = 1.0f; else s = -1.0f;\u00a0\u00a0\u00a0\u00a0 \/\/ BPSK: 0 \u044d\u0442\u043e +1, 1 \u044d\u0442\u043e -1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float y = s + sigma_ * dist_(rng_);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0448\u0443\u043c\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 llr[i] = 2.0f * y * inv_sigma2_;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ LLR = 2y\/sigma^2\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0 return llr;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0441\u0435 \u0442\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0432\u0435\u043a\u0442\u043e\u0440 LLR \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0431\u0438\u0442\u044b. \u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0435\u0447\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442.<\/p>\n<h3>LDPC: belief propagation \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c<\/h3>\n<h4>\u0413\u0440\u0430\u0444, \u0430 \u043d\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430<\/h4>\n<p>LDPC-\u043a\u043e\u0434 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0447\u0451\u0442\u043d\u043e\u0441\u0442\u0438 H \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c (n\u2212k)\u00d7n. \u041d\u043e \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439, \u0430 \u0441 <strong>\u0433\u0440\u0430\u0444\u043e\u043c \u0422\u0430\u043d\u043d\u0435\u0440\u0430<\/strong>: \u0441\u043b\u0435\u0432\u0430 n \u0443\u0437\u043b\u043e\u0432-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (\u043f\u043e \u0431\u0438\u0442\u0443 \u043a\u043e\u0434\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430), \u0441\u043f\u0440\u0430\u0432\u0430 n\u2212k \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 (\u043f\u043e \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e). \u0420\u0435\u0431\u0440\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0431\u0438\u0442 \u0441 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c, \u0435\u0441\u043b\u0438 \u0432 \u044d\u0442\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 H \u0441\u0442\u043e\u0438\u0442 \u0435\u0434\u0438\u043d\u0438\u0446\u0430.<\/p>\n<p>\u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 H \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u0441\u043f\u0438\u0441\u043a\u0438 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0430 \u043d\u0435 \u043a\u0430\u043a \u043f\u043b\u043e\u0442\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u0440\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u00bb \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"cpp\">\/\/ include\/fec\/ldpc\/matrix.hppstruct ParityCheckMatrix {\u00a0\u00a0\u00a0 int M, N;\u00a0\u00a0\u00a0 vector&lt;vector&lt;int&gt;&gt; rows;\u00a0\u00a0 \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 -&gt; \u043d\u043e\u043c\u0435\u0440\u0430 \u0431\u0438\u0442\u00a0\u00a0\u00a0 vector&lt;vector&lt;int&gt;&gt; cols;\u00a0\u00a0 \/\/ \u0431\u0438\u0442 -&gt; \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0435\u043a\u043e\u0434\u0435\u0440 \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0433\u0440\u0430\u0444 \u0432 \u043f\u043b\u043e\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u2014 \u043f\u043e \u0440\u0435\u0431\u0440\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u044b. \u0412\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0436\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u0438\u0445 \u0440\u0451\u0431\u0440\u0430\u0445:<\/p>\n<pre><code class=\"cpp\">\/\/ include\/fec\/ldpc\/decoder.hppvoid build_edge_list(){\u00a0\u00a0\u00a0 check_edges_.resize(H_.M);\u00a0\u00a0\u00a0 for(int c=0;c&lt;H_.M;c++)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(int v : H_.rows[c]){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int e = (int)edges_.size();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 edges_.push_back({v,c});\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u0440\u0435\u0431\u0440\u043e: (\u0431\u0438\u0442 v, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 c)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 check_edges_[c].push_back(e);\u00a0\u00a0\u00a0 \/\/ \u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 c - \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0435 \u0440\u0435\u0431\u0435\u0440\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0414\u0432\u0430 \u0441\u043e\u0440\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/h4>\n<p>\u041f\u043e \u0440\u0451\u0431\u0440\u0430\u043c \u0442\u0443\u0434\u0430-\u0441\u044e\u0434\u0430 \u0431\u0435\u0433\u0430\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432:<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Q[e]<\/strong> \u2014 \u043e\u0442 \u0431\u0438\u0442\u0430 \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435: \u00ab\u0432\u043e\u0442 \u0447\u0442\u043e \u044f (\u0431\u0438\u0442) \u0434\u0443\u043c\u0430\u044e \u043e \u0441\u0435\u0431\u0435, \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f \u043c\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\u00bb.<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>R[e]<\/strong> \u2014 \u043e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a \u0431\u0438\u0442\u0443: \u00ab\u0432\u043e\u0442 \u0447\u0442\u043e \u044f (\u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435) \u0434\u0443\u043c\u0430\u044e \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u0431\u0438\u0442, \u0433\u043b\u044f\u0434\u044f \u043d\u0430 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0435\u0433\u043e \u0441\u043e\u0441\u0435\u0434\u0435\u0439\u00bb.<\/p>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u0438\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043d\u0430\u043b\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 Q \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u043c LLR:<\/p>\n<pre><code class=\"cpp\">vector&lt;float&gt; Q(E), R(E);for(int e = 0; e &lt; E; e++) Q[e] = llr_ch[edges_[e].var];\u00a0\u00a0 \/\/ \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043a\u0430\u043d\u0430\u043b\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0428\u0430\u0433 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430: \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u00ab\u0443\u0432\u0435\u0440\u0435\u043d \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0435\u0440\u0435\u043d \u0441\u043b\u0430\u0431\u0435\u0439\u0448\u0438\u0439\u00bb<\/h4>\n<p>\u0423\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0447\u0451\u0442\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442: XOR \u0435\u0433\u043e \u0431\u0438\u0442\u043e\u0432 \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e. \u0417\u043d\u0430\u0447\u0438\u0442, \u0437\u043d\u0430\u044f \u043c\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0431\u0438\u0442\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043e\u0434\u043d\u043e\u0433\u043e, \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0439: \u043e\u043d \u0440\u0430\u0432\u0435\u043d XOR \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. \u041d\u043e \u043c\u043d\u0435\u043d\u0438\u044f \u043c\u044f\u0433\u043a\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043c\u044f\u0433\u043a\u043e\u0435.<\/p>\n<p>\u0422\u043e\u0447\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 (\u00abtanh rule\u00bb) \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0433\u0438\u043f\u0435\u0440\u0431\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0430\u043d\u0433\u0435\u043d\u0441\u043e\u0432. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0442\u044c, \u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u03a6(x) = \u2212log\u00b7tanh(x\/2). \u041e\u043d\u0430 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u0430 \u0441\u0430\u043c\u0430 \u0441\u0435\u0431\u0435, \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0441\u0443\u043c\u043c\u0443:<\/p>\n<pre><code class=\"cpp\">static float phi(float x){\u00a0\u00a0\u00a0 if(x &lt; 1e - 9f) return 20.0f;\u00a0\u00a0 \/\/ \u0447\u0442\u043e\u0431 \u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 0 \u043f\u043e \u0441\u0443\u0442\u0438\u00a0\u00a0\u00a0 return -log(tanh(x * 0.5f));}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u0430\u0433\u043d\u0438\u0442\u0443\u0434\u0430 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u03a6 \u043e\u0442 \u0441\u0443\u043c\u043c\u044b \u03a6(|Q|) \u0432\u0441\u0435\u0445 <strong>\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445<\/strong> \u0440\u0451\u0431\u0435\u0440 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0430 \u0437\u043d\u0430\u043a \u2014 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u0445 \u0437\u043d\u0430\u043a\u043e\u0432. \u00ab\u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435, \u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e\u00bb \u2014 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u0451\u043c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0445 \u0438 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043d\u044b\u0445 \u0441\u0443\u043c\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0443\u043c\u043c\u0443 \u0437\u0430\u043d\u043e\u0432\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0431\u0440\u0430:<\/p>\n<pre><code class=\"cpp\">for(int c = 0; c &lt; M; c++){\u00a0\u00a0\u00a0 const auto&amp; elist = check_edges_[c];\u00a0\u00a0\u00a0 int ne = (int)elist.size();\u00a0\u00a0\u00a0 vector&lt;float&gt; phi_vals(ne);\u00a0\u00a0\u00a0 float sign_prod = 1.0f;\u00a0\u00a0\u00a0 for(int i = 0; i &lt; ne; i++){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float q = Q[elist[i]];\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 phi_vals[i] = phi(fabs(q));\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(q &gt;= 0) sign_prod = 1.0f; else sign_prod = -1.0f;\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0 \/\/ \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \/ \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0441\u0443\u043c\u043c\u044b (\u0447\u0442\u043e\u0431\u044b \u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435\u0445 \u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e)\u00a0\u00a0\u00a0 vector&lt;float&gt; prefix(ne + 1,0.0f), suffix(ne + 1,0.0f);\u00a0\u00a0\u00a0 for(int i = 0; i &lt; ne; i++) prefix[i + 1] = prefix[i] + phi_vals[i];\u00a0\u00a0\u00a0 for(int i = ne - 1; i &gt;= 0; i--) suffix[i] = suffix[i + 1] + phi_vals[i];\u00a0\u00a0\u00a0\u00a0 for(int i = 0; i &lt; ne; i++){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float phi_sum = prefix[i] + suffix[i + 1];\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float qi = Q[elist[i]]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float sign_i = sign_prod * ((qi &gt;= 0)? 1.0f:-1.0f);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 R[elist[i]] = sign_i * phi(phi_sum);\u00a0\u00a0\u00a0 }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043d\u0442\u0443\u0438\u0446\u0438\u044f \u0437\u0430 \u03a6: \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0435\u0437\u043a\u043e \u0440\u0430\u0441\u0442\u0451\u0442 \u0443 \u043d\u0443\u043b\u044f \u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043f\u0430\u0434\u0430\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u0443\u043c\u043c\u0443 \u03a6(|Q|) \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0432\u043a\u043b\u0430\u0434 \u0434\u0430\u0451\u0442 \u0441\u0430\u043c\u044b\u0439 <strong>\u043d\u0435\u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439<\/strong> \u0441\u043e\u0441\u0435\u0434 (\u0435\u0433\u043e |Q| \u043c\u0430\u043b\u043e \u2192 \u03a6 \u0432\u0435\u043b\u0438\u043a\u043e). \u0423\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u0432\u0435\u0440\u0435\u043d\u043e \u0432 \u0431\u0438\u0442\u0435 \u0440\u043e\u0432\u043d\u043e \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0435\u0440\u0435\u043d \u0435\u0433\u043e \u0441\u043b\u0430\u0431\u0435\u0439\u0448\u0438\u0439 \u043f\u0430\u0440\u0442\u043d\u0451\u0440. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0442\u0435\u043a\u0430\u0435\u0442 \u043e\u0442 \u00ab\u0445\u043e\u0440\u043e\u0448\u0438\u0445\u00bb \u0431\u0438\u0442\u043e\u0432 \u043a \u00ab\u043f\u043b\u043e\u0445\u0438\u043c\u00bb.<\/p>\n<h4>\u0428\u0430\u0433 \u0431\u0438\u0442\u0430 \u0438 \u0440\u0430\u043d\u043d\u044f\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430<\/h4>\n<p>\u0411\u0438\u0442 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 LLR \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u043c\u0438 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0430\u043c\u0438 R \u2014 \u044d\u0442\u043e \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u0430\u044f \u0430\u043f\u043e\u0441\u0442\u0435\u0440\u0438\u043e\u0440\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430. \u0410 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 Q \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 <strong>\u043c\u0438\u043d\u0443\u0441<\/strong> \u0432\u043a\u043b\u0430\u0434 \u044d\u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 (\u0438\u043d\u0430\u0447\u0435 \u0431\u0438\u0442 \u0432\u0435\u0440\u043d\u0443\u043b \u0431\u044b \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435 \u2014 \u044d\u0445\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u0441\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c):<\/p>\n<pre><code class=\"cpp\">vector&lt;float&gt; total(N);for(int v = 0; v &lt; N; v++) total[v] = llr_ch[v];for(int e = 0; e &lt; E; e++) total[edges_[e].var] += R[e];for(int e = 0; e &lt; E; e++)\u00a0\u00a0\u00a0 Q[e] = total[edges_[e].var] - R[e];\u00a0\u00a0 \/\/ \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0432\u043e\u0435 \u0440\u0435\u0431\u0440\u043e<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0435\u0440\u0451\u043c \u0436\u0451\u0441\u0442\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u0437\u043d\u0430\u043a\u0443 total \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0438\u043d\u0434\u0440\u043e\u043c. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u2014 \u0441\u043b\u043e\u0432\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435, \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0434\u043e\u0441\u0440\u043e\u0447\u043d\u043e, \u043d\u0435 \u0434\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u044f \u0434\u043e \u043b\u0438\u043c\u0438\u0442\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">BitVec hard(N);for(int v = 0; v &lt; N; v++){\u00a0\u00a0\u00a0 if(total[v]&lt;0) hard[v]=1; else hard[v]=0;}BitVec synd = H_.syndrome(hard);bool valid = true;for(Bit s : synd) if(s){ valid=false; break; }if(valid) return hard;\u00a0\u00a0\u00a0\u00a0 \/\/ \u0441\u0438\u043d\u0434\u0440\u043e\u043c \u043d\u0443\u043b\u0435\u0432\u043e\u0439 - \u0432\u0441\u0435 \u043e\u043a, \u0432\u044b\u0445\u043e\u0434\u0438\u043c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>MATLAB \u043f\u0440\u043e\u0442\u0438\u0432 C++<\/h4>\n<p>\u0412\u0441\u044f \u044d\u0442\u0430 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0432 MATLAB \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0443\u043c\u0435\u0449\u0430\u043b\u0430\u0441\u044c \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"matlab\">dec_bits = ldpcDecode(llr, decCfg, maxIter);\u00a0\u00a0 % \u0432\u0441\u0451 BP \u2014 \u0432\u043d\u0443\u0442\u0440\u0438<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423\u0434\u043e\u0431\u043d\u043e, \u043d\u043e \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e: \u043d\u0438 \u0433\u0440\u0430\u0444\u0430, \u043d\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043d\u0438 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u043e\u0433\u043e \u0442\u0440\u044e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u043e. C++-\u0432\u0435\u0440\u0441\u0438\u044f \u2014 \u044d\u0442\u043e \u0442\u0435 \u0436\u0435 50 \u0441\u0442\u0440\u043e\u043a \u0432\u044b\u0448\u0435, \u0438 \u0432 \u043d\u0438\u0445 \u0432\u0438\u0434\u0435\u043d \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433.<\/p>\n<h4>\u0427\u0438\u0441\u043b\u0430<\/h4>\n<p>\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 (n=200, \u0432\u0435\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 3, \u0432\u0435\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 6, R=1\/2), 50 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 BP, \u0437\u0430\u043c\u0435\u0440 \u043f\u043e \u0431\u0438\u0442\u0430\u043c \u043a\u043e\u0434\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>Eb\/N0, \u0434\u0411<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>BER<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">0.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.2\u00b710\u207b\u00b9<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">6.0\u00b710\u207b\u00b2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.2\u00b710\u207b\u00b2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.2\u00b710\u207b\u00b3<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.5\u00b710\u207b\u2074<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u00a0<\/p>\n<p>\u0422\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0432\u043e\u0434\u043e\u043f\u0430\u0434: \u043c\u0435\u0436\u0434\u0443 2 \u0438 4 \u0434\u0411 BER \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u0434\u0432\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0430. \u041d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u0431\u043b\u043e\u043a\u0435 n=200 \u043e\u043d \u043f\u043e\u043b\u043e\u0433\u0438\u0439 \u2014 \u0443 DVB-S2 \u043d\u0430 64800 \u0431\u0438\u0442 \u043e\u0431\u0440\u044b\u0432 \u043a\u0443\u0434\u0430 \u043a\u0440\u0443\u0447\u0435, \u043d\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0436\u0435, \u0447\u0442\u043e \u0432 \u043a\u043e\u0434\u0435 \u0432\u044b\u0448\u0435.<\/p>\n<h3>\u0422\u0443\u0440\u0431\u043e: BCJR \u0438 \u043e\u0431\u043c\u0435\u043d \u043c\u043d\u0435\u043d\u0438\u044f\u043c\u0438<\/h3>\n<h4>\u041e\u0434\u0438\u043d \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442: BCJR<\/h4>\n<p>\u0422\u0443\u0440\u0431\u043e-\u043a\u043e\u0434 \u2014 \u044d\u0442\u043e \u0434\u0432\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0441\u0432\u0451\u0440\u0442\u043e\u0447\u043d\u044b\u0445 \u043a\u043e\u0434\u0435\u0440\u0430 (RSC), \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u0436\u0438\u0442\u0435\u043b\u0435\u043c. \u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 RSC \u2014 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 [7,5] octal \u043d\u0430 4 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">\/\/ include\/fec\/turbo\/trellis.hppstruct RSCTrellis {\u00a0\u00a0\u00a0 static const int NUM_STATES = 4;\u00a0\u00a0\u00a0 static const int G0 = 0b111;\u00a0\u00a0 \/\/ 7 - \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c\u00a0\u00a0\u00a0 static const int G1 = 0b101;\u00a0\u00a0 \/\/ 5 - \u043f\u0440\u044f\u043c\u0430\u044f \u0432\u0435\u0442\u0432\u044c\u00a0\u00a0\u00a0 \/\/ tr[state][input] = {next_state, output=[sys,par]}};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0435\u0440\u0434\u0446\u0435 \u0442\u0443\u0440\u0431\u043e-\u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u2014 <strong>BCJR<\/strong> (\u043e\u043d \u0436\u0435 MAP): \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0412\u0438\u0442\u0435\u0440\u0431\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043e\u0434\u0438\u043d \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u0443\u0442\u044c, BCJR \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u0430\u043f\u043e\u0441\u0442\u0435\u0440\u0438\u043e\u0440\u043d\u0443\u044e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u0443\u0441\u0440\u0435\u0434\u043d\u044f\u044f \u043f\u043e <strong>\u0432\u0441\u0435\u043c<\/strong> \u043f\u0443\u0442\u044f\u043c \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0448\u0451\u0442\u043a\u0443. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u043c\u044f\u0433\u043a\u0438\u0439 \u0432\u044b\u0445\u043e\u0434\u00bb.<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u043d \u0432 \u0442\u0440\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0430. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0432\u0435\u0442\u0432\u0438 \u03b3 \u2014 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u0435\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434 (state, input) \u043f\u0440\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 LLR \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0438\u0442\u0430, \u043f\u0430\u0440\u0438\u0442\u0435\u0442\u0430 \u0438 \u0430\u043f\u0440\u0438\u043e\u0440\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">\/\/ include\/fec\/turbo\/decoder.hppauto gamma = [&amp;](int s, int u, int t){\u00a0\u00a0\u00a0 auto&amp; trans = tr.tr[s][u];\u00a0\u00a0\u00a0 int sys = (trans.output &gt;&gt; 1) &amp; 1;\u00a0\u00a0\u00a0 int par = trans.output &amp; 1;\u00a0\u00a0\u00a0 float la = La[t], ls = llr_sys[t], lp = llr_par[t];\u00a0\u00a0\u00a0 float lsys = (sys?-1.0f:1.0f)*(ls+la);\u00a0\u00a0\u00a0 float lpar = (par?-1.0f:1.0f)*lp;\u00a0\u00a0\u00a0 return 0.5f*lsys + 0.5f*lpar;};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u03b1 (\u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u043f\u0443\u0442\u0435\u0439 \u0441\u043b\u0435\u0432\u0430) \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u03b2 (\u0441\u043f\u0440\u0430\u0432\u0430). \u041e\u0431\u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0432 \u043b\u043e\u0433-\u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 max* \u2014 \u00ab\u043c\u044f\u0433\u043a\u0438\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u00bb, \u0442\u043e\u0447\u043d\u044b\u0439 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c \u0441\u0443\u043c\u043c\u044b \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0442:<\/p>\n<pre><code class=\"cpp\">static float lse(float a, float b){\u00a0\u00a0\u00a0 if(a == -1e9f) return b;\u00a0\u00a0\u00a0 if(b == -1e9f) return a;\u00a0\u00a0\u00a0 float diff = fabs(a - b);\u00a0\u00a0\u00a0 return max(a,b) + log1p(exp(-diff));}\/\/ \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 alphaalpha[0][0] = 0.0f;for(int t = 0; t &lt; K_; t++)\u00a0\u00a0\u00a0 for(int s = 0; s &lt; S_; s++){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(alpha[t][s] == NEG_INF) continue;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(int u = 0; u &lt; 2; u++){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int ns = tr.tr[s][u].next;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float g = gamma(s,u,t);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 alpha[t + 1][ns] = lse(alpha[t + 1][ns], alpha[t][s] + g);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0 }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u044f\u0447\u0435\u0442\u0441\u044f \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u043e\u0438\u043b\u0430 \u0431\u044b \u043d\u0435\u0434\u0435\u043b\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435. \u0414\u0435\u043a\u043e\u0434\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c, \u0431\u0435\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u043e\u0432, \u2014 \u0437\u043d\u0430\u0447\u0438\u0442, \u0440\u0435\u0448\u0451\u0442\u043a\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 <strong>\u043d\u0435<\/strong> \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0432 \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u03b2 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e, \u0430 \u043d\u0435 \u00ab\u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 0\u00bb:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0440\u0435\u0448\u0435\u0442\u043a\u0430 \u041d\u0415 \u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 beta \u0432 \u043a\u043e\u043d\u0446\u0435 - \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043efor(int s=0;s&lt;S_;s++) beta[K_][s] = 0.0f;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0430\u043f\u043e\u0441\u0442\u0435\u0440\u0438\u043e\u0440\u043d\u044b\u0439 LLR \u0431\u0438\u0442\u0430 \u2014 \u044d\u0442\u043e max* \u043f\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c \u0441 input=0 \u043c\u0438\u043d\u0443\u0441 \u0442\u043e \u0436\u0435 \u043f\u043e input=1. \u0410 \u043d\u0430\u0440\u0443\u0436\u0443 \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0435 \u043e\u043d, \u0430 <strong>\u0432\u043d\u0435\u0448\u043d\u044f\u044f<\/strong> (extrinsic) \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f: \u0438\u0437 \u043f\u043e\u043b\u043d\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0438 \u0442\u0430\u043a \u0437\u043d\u0430\u043b \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 (\u043a\u0430\u043d\u0430\u043b + \u0430\u043f\u0440\u0438\u043e\u0440\u0438):<\/p>\n<pre><code class=\"cpp\">float L_total = L0 - L1;Le[t] = L_total - La[t] - llr_sys[t];\u00a0\u00a0 \/\/ \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u043d\u0438\u0435<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e extrinsic \u2014 \u0438 \u0432 \u0447\u0451\u043c \u00ab\u0442\u0443\u0440\u0431\u043e\u00bb<\/h4>\n<p>\u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0438 \u0441\u043f\u0440\u044f\u0442\u0430\u043d \u0432\u0435\u0441\u044c \u0444\u043e\u043a\u0443\u0441 \u0442\u0443\u0440\u0431\u043e-\u043a\u043e\u0434\u043e\u0432. \u0414\u0432\u0430 BCJR-\u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e extrinsic-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430 \u0431\u0438\u0442\u044b \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0436\u0438\u0442\u0435\u043b\u0435\u043c. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0443\u0437\u043d\u0430\u043b <strong>\u0441\u0430\u043c<\/strong>, \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f \u0447\u0443\u0436\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e (\u0442\u043e \u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u00ab\u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0439 \u044d\u0445\u043e\u00bb, \u0447\u0442\u043e \u0438 \u0443 \u0431\u0438\u0442\u0430 \u0432 LDPC). \u0417\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0434\u0432\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u0430\u0431\u044b\u0445 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u0440\u0430\u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">LLRVec La(K_, 0.0f);for(int it=0;it&lt;iters_;it++){\u00a0\u00a0\u00a0 \/\/ \u0434\u0435\u043a\u043e\u0434\u0435\u0440 1\u00a0\u00a0\u00a0 LLRVec Le1 = bcjr_.decode(llr_sys, llr_par1, La);\u00a0\u00a0\u00a0 \/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 2\u00a0\u00a0\u00a0 LLRVec Le1_i = il_.interleave_llr(Le1);\u00a0\u00a0\u00a0 LLRVec sys_i = il_.interleave_llr(llr_sys);\u00a0\u00a0\u00a0 \/\/ \u0434\u0435\u043a\u043e\u0434\u0435\u0440 2\u00a0\u00a0\u00a0 LLRVec Le2 = bcjr_.decode(sys_i, llr_par2, Le1_i);\u00a0\u00a0\u00a0 \/\/ \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c -&gt; \u0441\u0442\u0430\u043d\u0435\u0442 \u0430\u043f\u0440\u0438\u043e\u0440\u043d\u043e\u0439 \u043d\u0430 \u0441\u043b\u0435\u0434 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\u00a0\u00a0\u00a0 La = il_.deinterleave_llr(Le2);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>MATLAB \u043f\u0440\u043e\u0442\u0438\u0432 C++<\/h4>\n<p>\u0412 MATLAB \u044d\u0442\u043e:<\/p>\n<pre><code class=\"matlab\">turboDec = comm.TurboDecoder('InterleaverIndices', idx, 'NumIterations', 8);decoded\u00a0 = turboDec(llr);\u00a0\u00a0\u00a0 % \u0434\u0432\u0430 BCJR \u0438 \u0432\u0435\u0441\u044c \u043e\u0431\u043c\u0435\u043d \u2014 \u0432\u043d\u0443\u0442\u0440\u0438<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0438 \u03b1\/\u03b2, \u043d\u0438 extrinsic, \u043d\u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u043e. \u0410 \u0432 C++ \u0432\u0438\u0434\u0435\u043d \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u0432\u043e\u0441\u044c\u043c\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u0442\u0443\u0434\u0430-\u043e\u0431\u0440\u0430\u0442\u043d\u043e.<\/p>\n<h4>\u0427\u0438\u0441\u043b\u0430<\/h4>\n<p>K=256, R\u22481\/3, 8 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>Eb\/N0, \u0434\u0411<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>BER<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">0.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">9.9\u00b710\u207b\u00b2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">0.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.7\u00b710\u207b\u00b2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.9\u00b710\u207b\u00b3<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.8\u00b710\u207b\u00b3<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">6.8\u00b710\u207b\u2074<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u00a0<\/p>\n<p>\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0443\u0440\u0431\u043e \u0440\u0435\u0437\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0433\u0438\u0431 \u043e\u043a\u043e\u043b\u043e 0.5\u20131 \u0434\u0411: \u0434\u043e \u043d\u0435\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f, \u043f\u043e\u0441\u043b\u0435 \u2014 \u043e\u0431\u0440\u0443\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0414\u0430\u0436\u0435 \u043d\u0430 \u0443\u0447\u0435\u0431\u043d\u043e\u043c [7,5] \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0430\u043b\u0438\u0446\u043e.<\/p>\n<h3>\u041f\u043e\u043b\u044f\u0440\u043d\u044b\u0435 \u043a\u043e\u0434\u044b: successive cancellation<\/h3>\n<h4>\u041f\u043e\u043b\u044f\u0440\u0438\u0437\u0430\u0446\u0438\u044f: \u0437\u0430\u043c\u043e\u0440\u043e\u0437\u0438\u0442\u044c \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b<\/h4>\n<p>\u0418\u0434\u0435\u044f \u0410\u0440\u044b\u043a\u0430\u043d\u0430 (2008): \u0435\u0441\u043b\u0438 \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c N \u043a\u043e\u043f\u0438\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u00ab\u043f\u043e\u0434\u043a\u0430\u043d\u0430\u043b\u044b\u00bb <strong>\u043f\u043e\u043b\u044f\u0440\u0438\u0437\u0443\u044e\u0442\u0441\u044f<\/strong> \u2014 \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438, \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438. \u041f\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043a\u0430\u043d\u0430\u043b\u0430\u043c \u0448\u043b\u0451\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 <strong>\u0437\u0430\u043c\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u0435\u043c<\/strong> (\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0432 \u043d\u0443\u043b\u0435, \u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u044d\u0442\u043e \u0437\u043d\u0430\u0435\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435).<\/p>\n<p>\u041a\u0430\u043a\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u2014 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0411\u0445\u0430\u0442\u0442\u0430\u0447\u0430\u0440\u044c\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0449\u0435\u043f\u043b\u044f\u0435\u0442 \u043a\u0430\u043d\u0430\u043b \u043d\u0430 \u00ab\u0445\u0443\u0434\u0448\u0438\u0439\u00bb (Z&#8217; = 2Z \u2212 Z\u00b2) \u0438 \u00ab\u043b\u0443\u0447\u0448\u0438\u0439\u00bb (Z&#8217; = Z\u00b2):<\/p>\n<pre><code class=\"cpp\">\/\/ include\/fec\/polar\/polar.hppvector&lt;double&gt; Z(1, 0.5);while((int)Z.size() &lt; N){\u00a0\u00a0\u00a0 int m = (int)Z.size();\u00a0\u00a0\u00a0 vector&lt;double&gt; next(2 * m);\u00a0\u00a0\u00a0 for(int i = 0; i &lt; m; i++){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double z = Z[i];\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 next[2 * i]\u00a0\u00a0 = 2 * z - z * z;\u00a0\u00a0 \/\/ \u0432\u0435\u0440\u0445\u043d\u0438\u0439 (\u0445\u0443\u0436\u0435)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 next[2 * i + 1] = z * z; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u043d\u0438\u0436\u043d\u0438\u0439 (\u043b\u0443\u0447\u0448\u0435)\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0 Z.swap(next);}\/\/ K \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0441 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u043c Z - \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u044b<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0434\u0435\u0440 \u043a\u043b\u0430\u0434\u0451\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0438\u0442\u044b \u0432 \u043d\u0435\u0437\u0430\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442 \u00ab\u0431\u0430\u0431\u043e\u0447\u043a\u0443\u00bb \u043f\u043e\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">inline void polar_transform(BitVec&amp; u){\u00a0\u00a0\u00a0 int N = (int)u.size();\u00a0\u00a0\u00a0 for(int step = N \/ 2; step &gt;= 1; step \/= 2)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(int i=0;i&lt;N;i+=2*step)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0for(int j=0;j&lt;step;j++)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 u[i+j] ^= u[i+j+step];}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>Successive cancellation: \u0431\u0438\u0442 \u0437\u0430 \u0431\u0438\u0442\u043e\u043c<\/h4>\n<p>\u0414\u0435\u043a\u043e\u0434\u0435\u0440 SC \u0438\u0434\u0451\u0442 \u043f\u043e \u0431\u0438\u0442\u0430\u043c <strong>\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e<\/strong>, \u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435. \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0434\u0435\u043b\u0438\u0442 \u0431\u043b\u043e\u043a \u043f\u043e\u043f\u043e\u043b\u0430\u043c. \u0414\u043b\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b LLR \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 f (\u0437\u0434\u0435\u0441\u044c \u2014 min-sum \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435), \u0434\u043b\u044f \u043d\u0438\u0436\u043d\u0435\u0439 \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 g, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <strong>\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443<\/strong> \u0438\u0437 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0431\u0438\u0442:<\/p>\n<pre><code class=\"cpp\">static float f_func(float a, float b){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ f = \u0437\u043d\u0430\u043a*\u0437\u043d\u0430\u043a*min(|a|,|b|)\u00a0\u00a0\u00a0 float sa = (a &gt;= 0)?1.0f:-1.0f;\u00a0\u00a0\u00a0 float sb = (b &gt;= 0)?1.0f:-1.0f;\u00a0\u00a0\u00a0 return sa * sb * min(fabs(a), fabs(b));}static float g_func(float a, float b, Bit s){\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ s - \u0443\u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u0431\u0438\u0442 \u0441\u0432\u0435\u0440\u0445\u0443\u00a0\u00a0\u00a0 return b + (1 - 2 * (int)s) * a;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0434\u0432\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u0430. u \u0445\u0440\u0430\u043d\u0438\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043b\u0438\u0441\u0442\u044c\u044f\u0445 (\u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440), \u0430 beta \u2014 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u043a\u043e\u0434\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0448\u0430\u0433 combine \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u0438\u0445 \u0441\u043c\u0435\u0448\u0430\u0442\u044c, \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0437\u0430\u0442\u0440\u0443\u0442 \u0443\u0436\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0442\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f:<\/p>\n<pre><code class=\"cpp\">void sc_decode(const LLRVec&amp; llr, int offset, int size,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 const vector&lt;bool&gt;&amp; cur_frozen, BitVec&amp; u, BitVec&amp; beta) const{\u00a0\u00a0\u00a0 if(size == 1){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Bit bit = cur_frozen[0] ? 0 : ((llr[0] &lt; 0)? 1:0);\u00a0\u00a0 \/\/ \u043b\u0438\u0441\u0442\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 u[offset] = bit;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 beta[offset] = bit;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return;\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0 int half = size \/ 2;\u00a0\u00a0\u00a0 \/\/ frozen \u043c\u0430\u0441\u043a\u0438 \u043d\u0430 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b - \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043b\u0438\u0442\u00a0\u00a0\u00a0 vector&lt;bool&gt; frozen_upper(cur_frozen.begin(), cur_frozen.begin() + half);\u00a0\u00a0\u00a0 vector&lt;bool&gt; frozen_lower(cur_frozen.begin() + half, cur_frozen.end());\u00a0\u00a0\u00a0\u00a0 \/\/ \u0432\u0435\u0440\u0445: f-\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f, \u0434\u0435\u043a\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443\u00a0\u00a0\u00a0 LLRVec llr_f(half);\u00a0\u00a0\u00a0 for(int i = 0; i &lt; half; i++) llr_f[i] = f_func(llr[i], llr[i + half]);\u00a0\u00a0\u00a0 sc_decode(llr_f, offset, half, frozen_upper, u, beta);\u00a0\u00a0\u00a0 \/\/ \u043d\u0438\u0437: g-\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0441 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0443\u043c\u043c\u0430\u043c\u0438 \u0432\u0435\u0440\u0445\u0430, \u0434\u0435\u043a\u043e\u0434\u0438\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443\u00a0\u00a0\u00a0 LLRVec llr_g(half);\u00a0\u00a0\u00a0 for(int i = 0; i &lt; half; i++) llr_g[i] = g_func(llr[i], llr[i+half], beta[offset + i]);\u00a0\u00a0\u00a0 sc_decode(llr_g, offset+half, half, frozen_lower, u, beta);\u00a0\u00a0\u00a0 \/\/ combine: \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u043d\u0430\u0432\u0435\u0440\u0445 (\u0442\u0440\u043e\u0433\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e beta, \u043d\u0435 u)\u00a0\u00a0\u00a0 for(int i = 0; i &lt; half; i++)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 beta[offset + i] = beta[offset + i] ^ beta[offset + half + i];}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u043b\u0438\u0441\u0442\u0435 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e: \u0437\u0430\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0431\u0438\u0442 \u2014 \u044d\u0442\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043d\u043e\u043b\u044c; \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u2014 \u0436\u0451\u0441\u0442\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u0437\u043d\u0430\u043a\u0443 LLR. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0437\u0430\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0431\u0438\u0442\u044b \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u0447\u043d\u043e, \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u043d\u0438\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0430, \u0438 \u044d\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 g \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0440\u0435\u0448\u0430\u0442\u044c \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0438\u0442\u044b.<\/p>\n<h4>MATLAB \u043f\u0440\u043e\u0442\u0438\u0432 C++<\/h4>\n<p>\u0412 5G-\u0442\u0443\u043b\u0431\u043e\u043a\u0441\u0435 MATLAB:<\/p>\n<pre><code class=\"matlab\">decoded = nrPolarDecode(llr, K, E);\u00a0\u00a0 % SC\/SCL \u0438 frozen set \u2014 \u0432\u043d\u0443\u0442\u0440\u0438<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043a\u0440\u044b\u0442\u043e \u0432\u0441\u0451: \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f frozen-\u043d\u0430\u0431\u043e\u0440\u0430, \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f f\/g. \u0412 C++ \u2014 \u043e\u0431\u0435 \u0447\u0430\u0441\u0442\u0438 \u043d\u0430 \u0432\u0438\u0434\u0443.<\/p>\n<h4>\u0427\u0438\u0441\u043b\u0430<\/h4>\n<p>N=1024, K=512, R=1\/2, \u0433\u043e\u043b\u044b\u0439 SC:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>Eb\/N0, \u0434\u0411<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>BER<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">0.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.2\u00b710\u207b\u00b9<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.9\u00b710\u207b\u00b9<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.0\u00b710\u207b\u00b2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">0 (\u043d\u0430 200 \u0431\u043b\u043e\u043a\u0430\u0445)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u00a0<\/p>\n<p>\u0412\u043e\u0434\u043e\u043f\u0430\u0434 \u0435\u0441\u0442\u044c, \u043d\u043e \u043e\u043d \u0441\u0434\u0432\u0438\u043d\u0443\u0442 \u043f\u0440\u0430\u0432\u0435\u0435, \u0447\u0435\u043c \u0443 LDPC \u043f\u0440\u0438 \u0442\u043e\u0439 \u0436\u0435 R=1\/2: \u0433\u043e\u043b\u044b\u0439 SC \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043b\u0430\u0431\u0435\u0435. \u042d\u0442\u043e \u043d\u0435 \u0434\u0435\u0444\u0435\u043a\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u2014 \u0438 \u0440\u043e\u0432\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 5G \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0435 \u0447\u0438\u0441\u0442\u044b\u0439 SC, \u0430 <strong>\u0441\u043f\u0438\u0441\u043e\u0447\u043d\u044b\u0439<\/strong> SC-List \u0441 CRC-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 (\u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0432\u0435\u0434\u0451\u0442 L \u043f\u0443\u0442\u0435\u0439-\u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0442\u043e\u0442, \u0447\u0435\u0439 CRC \u0441\u043e\u0448\u0451\u043b\u0441\u044f). \u042d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u0443\u0447\u0435\u0431\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043d\u0435\u0442, \u043d\u043e \u0432\u0438\u0434\u043d\u043e, \u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d \u0440\u0430\u0441\u0442\u0451\u0442.<\/p>\n<h3>\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 MATLAB: \u0442\u0435 \u0436\u0435 \u043a\u043e\u0434\u044b \u2014 \u0434\u0432\u0430 \u043c\u0438\u0440\u0430<\/h3>\n<p>\u041e\u0434\u043d\u043e\u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0443\u043b\u0431\u043e\u043a\u0441\u0430 \u0432\u044b\u0448\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <em>\u0447\u0442\u043e<\/em> MATLAB \u043f\u0440\u044f\u0447\u0435\u0442. \u041d\u043e \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0434\u0440\u0443\u0433\u043e\u0439: \u0430 \u0442\u0430\u043a \u0436\u0435 \u043b\u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430 60 \u0441\u0442\u0440\u043e\u043a\u0430\u0445, \u043a\u0430\u043a \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0438\u0437 MATLAB? \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u2014 \u043f\u0440\u043e\u0433\u043e\u043d\u0438\u043c \u043e\u0431\u0430 \u043f\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u043a\u043e\u0434\u0430\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0438\u043c BER-\u043a\u0440\u0438\u0432\u044b\u0435 \u043d\u0430 \u043e\u0434\u0438\u043d \u0433\u0440\u0430\u0444\u0438\u043a.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 (\u0431\u0435\u0437 \u043f\u043e\u0434\u0433\u043e\u043d\u043a\u0438):<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>C++<\/strong> \u0441\u0447\u0438\u0442\u0430\u0435\u0442 BER \u0447\u0435\u0440\u0435\u0437 fec-cpp \u0438 \u043f\u0438\u0448\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 CSV.<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>MATLAB<\/strong> \u0447\u0438\u0442\u0430\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d Eb\/N0, \u0433\u043e\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0439 \u0442\u0443\u043b\u0431\u043e\u043a\u0441 \u0438 \u0440\u0438\u0441\u0443\u0435\u0442 \u043e\u0431\u0435 \u043a\u0440\u0438\u0432\u044b\u0435.<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 \u041a\u0430\u043d\u0430\u043b \u0443 \u043e\u0431\u043e\u0438\u0445 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439: BPSK + AWGN, LLR = 2y\/\u03c3\u00b2.<\/p>\n<p>\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u2014 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 matlab-compare\/: cpp_compare.cpp (C++-\u0441\u0442\u043e\u0440\u043e\u043d\u0430) \u0438 run_compare.m (MATLAB-\u0441\u0442\u043e\u0440\u043e\u043d\u0430, \u043e\u043d\u0430 \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u0435 \u043a\u0440\u0438\u0432\u044b\u0435 \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a).<\/p>\n<h4>LDPC: \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 H, \u0434\u0432\u0430 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 BP<\/h4>\n<p>\u0421\u0430\u043c\u044b\u0439 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u0442\u0435\u0441\u0442 \u2014 \u0434\u0430\u0442\u044c \u043e\u0431\u043e\u0438\u043c \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430\u043c <strong>\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435<\/strong> \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a. C++ \u0441\u0442\u0440\u043e\u0438\u0442 H (N=1024, K=512, \u0431\u0438\u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u0440\u0438\u0442\u0435\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0438 \u0432 MATLAB), \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0435\u0451 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b, \u0430 MATLAB \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0443 \u0436\u0435 H \u0432 ldpcEncoderConfig\/ldpcDecoderConfig. \u0414\u0430\u043b\u044c\u0448\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0430\u043c \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442, \u0448\u0443\u043c\u0438\u0442 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0441\u0432\u043e\u0438\u043c belief propagation.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f50\/987\/414\/f509874141a2ab887f395f3aa16deb12.png\" alt=\"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: LDPC: fec-cpp BP \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB ldpcDecode \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 H - \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: LDPC: fec-cpp BP \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB ldpcDecode \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 H\" title=\"LDPC: fec-cpp BP \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB ldpcDecode \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 H - \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: LDPC: fec-cpp BP \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB ldpcDecode \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 H\" width=\"1015\" height=\"705\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f50\/987\/414\/f509874141a2ab887f395f3aa16deb12.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f50\/987\/414\/f509874141a2ab887f395f3aa16deb12.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>LDPC: fec-cpp BP \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB ldpcDecode \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 H &#8212; \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: LDPC: fec-cpp BP \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB ldpcDecode \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 H<\/figcaption><\/div>\n<\/figure>\n<p><em>LDPC: fec-cpp BP \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB ldpcDecode \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 H<\/em><\/p>\n<p>\u041a\u0440\u0438\u0432\u044b\u0435 \u043b\u043e\u0436\u0430\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430: \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0439 sum-product \u043d\u0430 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0445 \u0441\u0443\u043c\u043c\u0430\u0445 \u0438\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0432\u044b\u0448\u0435 \u0434\u0430\u0451\u0442 \u0442\u0443 \u0436\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0443, \u0447\u0442\u043e \u0438 ldpcDecode \u0438\u0437 Communications Toolbox. \u0420\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435 (\u043f\u043e\u0441\u043b\u0435 2.5 \u0434\u0411) \u2014 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430: 300 \u0431\u043b\u043e\u043a\u043e\u0432 \u043d\u0430 \u0442\u043e\u0447\u043a\u0443, \u0432 \u0437\u043e\u043d\u0435 BER~10\u207b\u2074 \u0441\u0447\u0451\u0442 \u0438\u0434\u0451\u0442 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<h4>\u0422\u0443\u0440\u0431\u043e: \u0442\u043e\u0442 \u0436\u0435 trellis [7,5] \u0438 \u0442\u043e\u0442 \u0436\u0435 QPP<\/h4>\n<p>\u0417\u0434\u0435\u0441\u044c \u0442\u043e\u0436\u0435 \u0434\u043e\u0431\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430: \u0432 MATLAB \u0437\u0430\u0434\u0430\u0451\u043c comm.TurboDecoder \u0441 \u0442\u0435\u043c \u0436\u0435 \u0440\u0435\u0448\u0451\u0442\u0447\u0430\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c poly2trellis(3,[7 5],7) \u0438 \u0442\u0435\u043c\u0438 \u0436\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 QPP-\u043f\u0435\u0440\u0435\u043c\u0435\u0436\u0438\u0442\u0435\u043b\u044f \u0434\u043b\u044f K=256, \u0447\u0442\u043e \u0438 \u0432 C++.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b32\/d84\/bd3\/b32d84bd3c5e0f94b6c84a5fa4572d04.png\" alt=\"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: \u0422\u0443\u0440\u0431\u043e: fec-cpp BCJR \u043f\u0440\u043e\u0442\u0438\u0432 comm.TurboDecoder, \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 - \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: \u0422\u0443\u0440\u0431\u043e: fec-cpp BCJR \u043f\u0440\u043e\u0442\u0438\u0432 comm.TurboDecoder, \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434\" title=\"\u0422\u0443\u0440\u0431\u043e: fec-cpp BCJR \u043f\u0440\u043e\u0442\u0438\u0432 comm.TurboDecoder, \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 - \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: \u0422\u0443\u0440\u0431\u043e: fec-cpp BCJR \u043f\u0440\u043e\u0442\u0438\u0432 comm.TurboDecoder, \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434\" width=\"1010\" height=\"706\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b32\/d84\/bd3\/b32d84bd3c5e0f94b6c84a5fa4572d04.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b32\/d84\/bd3\/b32d84bd3c5e0f94b6c84a5fa4572d04.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u0443\u0440\u0431\u043e: fec-cpp BCJR \u043f\u0440\u043e\u0442\u0438\u0432 comm.TurboDecoder, \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 &#8212; \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: \u0422\u0443\u0440\u0431\u043e: fec-cpp BCJR \u043f\u0440\u043e\u0442\u0438\u0432 comm.TurboDecoder, \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434<\/figcaption><\/div>\n<\/figure>\n<p><em>\u0422\u0443\u0440\u0431\u043e: fec-cpp BCJR \u043f\u0440\u043e\u0442\u0438\u0432 comm.TurboDecoder, \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434<\/em><\/p>\n<p>\u0412\u043e\u0434\u043e\u043f\u0430\u0434 \u0443 \u043e\u0431\u043e\u0438\u0445 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u0437\u043e\u043d\u0435 (0.5\u20131 \u0434\u0411), \u043d\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0443\u0442\u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f, \u0438 \u044d\u0442\u043e \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e. MATLAB \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u043f\u0430\u0434\u0430\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e, \u0430 \u043a\u0440\u0438\u0432\u0430\u044f fec-cpp \u0437\u0430\u0433\u0438\u0431\u0430\u0435\u0442\u0441\u044f \u0432 <strong>error floor<\/strong> \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 ~5\u00b710\u207b\u2074. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u2014 \u0440\u043e\u0432\u043d\u043e \u0442\u0430 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c, \u0447\u0442\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0430\u0441\u044c \u0432\u044b\u0448\u0435: \u043d\u0430\u0448 BCJR \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0440\u0435\u0448\u0451\u0442\u043a\u043e\u0439 (\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u03b2), \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a comm.TurboDecoder \u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u0443\u0435\u0442 \u0435\u0451 \u0447\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0431\u0438\u0442\u0430\u043c\u0438. \u041d\u0430 \u043f\u043e\u043b\u043e\u0433\u043e\u043c \u0441\u043a\u043b\u043e\u043d\u0435 \u044d\u0442\u043e \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u043d\u043e \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043d\u0438\u0437\u043a\u0438\u0445 BER \u043d\u0435\u0443\u0447\u0442\u0451\u043d\u043d\u043e\u0435 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u00ab\u043f\u043e\u043b\u00bb, \u043d\u0438\u0436\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043d\u0435 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u0443\u0440\u043e\u043a: \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435, \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u043e\u0435 \u0432 roundtrip-\u0442\u0435\u0441\u0442\u0435, \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0445\u0432\u043e\u0441\u0442\u0435 BER-\u043a\u0440\u0438\u0432\u043e\u0439 \u2014 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0435\u0433\u043e \u0438 \u0441\u0442\u043e\u0438\u0442 \u0438\u0441\u043a\u0430\u0442\u044c.<\/p>\n<h4>Polar: \u043f\u043b\u043e\u0441\u043a\u0438\u0439 SC \u043f\u0440\u043e\u0442\u0438\u0432 5G NR (SCL + CRC)<\/h4>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043a\u043e\u0434\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e <strong>\u0440\u0430\u0437\u043d\u044b\u0435<\/strong> \u2014 \u0438 \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. C++ \u2014 \u0433\u043e\u043b\u044b\u0439 successive cancellation. MATLAB \u2014 \u043f\u043e\u043b\u043d\u0430\u044f 5G-\u0446\u0435\u043f\u043e\u0447\u043a\u0430: nrPolarEncode \u2192 \u043a\u0430\u043d\u0430\u043b \u2192 nrPolarDecode \u0441\u043e \u0441\u043f\u0438\u0441\u043e\u0447\u043d\u044b\u043c \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u043e\u043c (SCL, \u0441\u043f\u0438\u0441\u043e\u043a L=8) \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 CRC-11.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c47\/8d2\/05b\/c478d205b2709792dfa21dab783a0811.png\" alt=\"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: Polar: \u043f\u043b\u043e\u0441\u043a\u0438\u0439 SC \u043f\u0440\u043e\u0442\u0438\u0432 5G NR SCL+CRC - \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: Polar: \u043f\u043b\u043e\u0441\u043a\u0438\u0439 SC \u043f\u0440\u043e\u0442\u0438\u0432 5G NR SCL+CRC\" title=\"Polar: \u043f\u043b\u043e\u0441\u043a\u0438\u0439 SC \u043f\u0440\u043e\u0442\u0438\u0432 5G NR SCL+CRC - \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: Polar: \u043f\u043b\u043e\u0441\u043a\u0438\u0439 SC \u043f\u0440\u043e\u0442\u0438\u0432 5G NR SCL+CRC\" width=\"1010\" height=\"706\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c47\/8d2\/05b\/c478d205b2709792dfa21dab783a0811.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c47\/8d2\/05b\/c478d205b2709792dfa21dab783a0811.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Polar: \u043f\u043b\u043e\u0441\u043a\u0438\u0439 SC \u043f\u0440\u043e\u0442\u0438\u0432 5G NR SCL+CRC &#8212; \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: Polar: \u043f\u043b\u043e\u0441\u043a\u0438\u0439 SC \u043f\u0440\u043e\u0442\u0438\u0432 5G NR SCL+CRC<\/figcaption><\/div>\n<\/figure>\n<p><em>Polar: \u043f\u043b\u043e\u0441\u043a\u0438\u0439 SC \u043f\u0440\u043e\u0442\u0438\u0432 5G NR SCL+CRC<\/em><\/p>\n<p>\u0420\u0430\u0437\u0440\u044b\u0432 \u043e\u043a\u043e\u043b\u043e <strong>1 \u0434\u0411<\/strong> \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 MATLAB \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0430\u044f \u0446\u0435\u043d\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u0443\u0447\u0435\u0431\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043d\u0435\u0442 SCL+CRC. \u0421\u043f\u0438\u0441\u043e\u043a \u0438\u0437 8 \u043f\u0443\u0442\u0435\u0439-\u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 \u043f\u043b\u044e\u0441 CRC-\u043e\u0442\u0431\u043e\u0440 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0434\u0432\u0438\u0433\u0430\u044e\u0442 \u0432\u043e\u0434\u043e\u043f\u0430\u0434 \u0432\u043b\u0435\u0432\u043e \u0440\u043e\u0432\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u0442 \u0437\u0430\u0437\u043e\u0440. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 5G \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0447\u0438\u0441\u0442\u044b\u0439 SC: \u0433\u0440\u0430\u0444\u0438\u043a \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, <em>\u0441\u043a\u043e\u043b\u044c\u043a\u043e<\/em> \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u0451\u0442 \u0441\u043f\u0438\u0441\u043e\u0447\u043d\u043e\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<h4>\u0412\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435<\/h4>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/419\/af0\/27c\/419af027cfa9b690bde0381c475ae465.png\" alt=\"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435: \u0412\u0441\u0435 \u0442\u0440\u0438 \u043a\u043e\u0434\u0430: fec-cpp \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB - \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: \u0412\u0441\u0435 \u0442\u0440\u0438 \u043a\u043e\u0434\u0430: fec-cpp \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB\" title=\" \u0412\u0441\u0435 \u0442\u0440\u0438 \u043a\u043e\u0434\u0430: fec-cpp \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB - \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: \u0412\u0441\u0435 \u0442\u0440\u0438 \u043a\u043e\u0434\u0430: fec-cpp \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB\" width=\"1133\" height=\"807\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/419\/af0\/27c\/419af027cfa9b690bde0381c475ae465.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/419\/af0\/27c\/419af027cfa9b690bde0381c475ae465.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption> \u0412\u0441\u0435 \u0442\u0440\u0438 \u043a\u043e\u0434\u0430: fec-cpp \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB &#8212; \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: \u0412\u0441\u0435 \u0442\u0440\u0438 \u043a\u043e\u0434\u0430: fec-cpp \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB<\/figcaption><\/div>\n<\/figure>\n<p><em>\u0412\u0441\u0435 \u0442\u0440\u0438 \u043a\u043e\u0434\u0430: fec-cpp \u043f\u0440\u043e\u0442\u0438\u0432 MATLAB<\/em><\/p>\n<p>\u0421\u0432\u043e\u0434\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u0438\u043a \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u0443: LDPC \u0438 \u0442\u0443\u0440\u0431\u043e \u0432 fec-cpp \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043e\u0442\u043b\u0438\u0447\u0438\u043c\u044b \u043e\u0442 \u0442\u0443\u043b\u0431\u043e\u043a\u0441\u0430 (\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438), \u0430 \u043d\u0430 polar \u0432\u0438\u0434\u0435\u043d \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0437\u0430\u0437\u043e\u0440 \u0443\u0447\u0435\u0431\u043d\u043e\u0433\u043e SC \u0434\u043e \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u043e\u0433\u043e SCL.<\/p>\n<h3>\u0421\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c<\/h3>\n<p>\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/BessonovT\/fec-cpp\" rel=\"noopener noreferrer nofollow\">fec-cpp<\/a> \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 MIT. \u0421\u0430\u043c\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 header-only \u2014 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438; \u0441\u0431\u043e\u0440\u043a\u0430 \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432. \u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 (\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 fec-cpp\/):<\/p>\n<p><code>git clone <\/code><a href=\"https:\/\/github.com\/BessonovT\/fec-cpp\" rel=\"noopener noreferrer nofollow\"><code>https:\/\/github.com\/BessonovT\/fec-cpp<\/code><\/a><\/p>\n<p><code>cd fec-cpp<\/code><\/p>\n<p><code># \u0442\u0435\u0441\u0442\u044b<\/code><\/p>\n<p><code>g++ -std=c++17 -O2 -Ifec-cpp\/include fec-cpp\/tests\/test_all.cpp -o test_all &amp;&amp; .\/test_all<\/code><\/p>\n<p><code># \u2192 22\/22 passed<\/code><\/p>\n<p><code># BER-\u043f\u0440\u0438\u043c\u0435\u0440\u044b (\u043f\u0435\u0447\u0430\u0442\u0430\u044e\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 BER \u0432 stdout)<\/code><\/p>\n<p><code>g++ -std=c++17 -O2 -Ifec-cpp\/include fec-cpp\/examples\/ldpc_ber.cpp\u00a0 -o ldpc_ber\u00a0 &amp;&amp; .\/ldpc_ber<\/code><\/p>\n<p><code>g++ -std=c++17 -O2 -Ifec-cpp\/include fec-cpp\/examples\/polar_ber.cpp -o polar_ber &amp;&amp; .\/polar_ber<\/code><\/p>\n<p>\u041b\u044e\u0431\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 stdout, \u0430 fec-cpp\/scripts\/plot_<a href=\"http:\/\/ber.py\" rel=\"noopener noreferrer nofollow\">ber.py<\/a> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0451 \u0432 semilog-y \u0433\u0440\u0430\u0444\u0438\u043a \u2014 \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0430\u0439\u043f\u043e\u043c:<\/p>\n<p><code>.\/ldpc_ber | python fec-cpp\/scripts\/plot_<\/code><a href=\"http:\/\/ber.py\" rel=\"noopener noreferrer nofollow\"><code>ber.py<\/code><\/a><code> --title \"LDPC, R=1\/2\" --xlabel \"SNR (dB)\" -o ldpc.png<\/code><\/p>\n<p>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 MATLAB \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u2014 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 matlab-compare\/; \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 (\u043d\u0443\u0436\u0435\u043d MATLAB \u0441 Communications + 5G Toolbox):<\/p>\n<p><code>cd matlab-compare<\/code><\/p>\n<p><code># 1. C++: \u0441\u0447\u0438\u0442\u0430\u0435\u0442 BER \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 H + CSV-\u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/code><\/p>\n<p><code>g++ -std=c++17 -O2 -I..\/fec-cpp\/include cpp_compare.cpp -o cpp_compare &amp;&amp; .\/cpp_compare<\/code><\/p>\n<p><code># 2. MATLAB: \u0433\u0440\u0443\u0437\u0438\u0442 \u0442\u0435 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0433\u043e\u043d\u044f\u0435\u0442 \u0442\u0443\u043b\u0431\u043e\u043a\u0441, \u0440\u0438\u0441\u0443\u0435\u0442 \u043e\u0431\u0435 \u043a\u0440\u0438\u0432\u044b\u0435<\/code><\/p>\n<p><code>matlab -batch run_compare<\/code><\/p>\n<h3>\u0427\u0442\u043e \u0435\u0449\u0451 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/h3>\n<p>\u0422\u0440\u0435\u043c\u044f \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430\u043c\u0438 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 fec-cpp \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u2014 \u043e\u043d \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043a\u043e\u0434\u043e\u0432 \u043e\u0442 2G \u0434\u043e 5G, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u0434 \u0438\u0434\u0451\u0442 \u0441 \u043a\u043e\u0434\u0435\u0440\u043e\u043c, \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u043e\u043c \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c BER:<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>\u0431\u043b\u043e\u043a\u043e\u0432\u044b\u0435<\/strong> \u2014 Hamming \u0438 Reed\u2013Solomon (\u0411\u0435\u0440\u043b\u0435\u043a\u044d\u043c\u043f\u2013\u041c\u0435\u0441\u0441\u0438 + \u0424\u043e\u0440\u043d\u0438);<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>\u0441\u0432\u0451\u0440\u0442\u043e\u0447\u043d\u044b\u0439<\/strong> \u2014 \u0440\u0435\u0448\u0451\u0442\u043a\u0430 \u0438 \u0412\u0438\u0442\u0435\u0440\u0431\u0438 \u0441 \u043c\u044f\u0433\u043a\u0438\u043c \u0432\u0445\u043e\u0434\u043e\u043c (\u043e\u0441\u043d\u043e\u0432\u0430 2G);<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>\u0442\u0443\u0440\u0431\u043e<\/strong> \u2014 RSC [7,5], BCJR, \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d (3G\/4G);<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LDPC<\/strong> \u2014 sum-product belief propagation \u043f\u043e \u0433\u0440\u0430\u0444\u0443 \u0422\u0430\u043d\u043d\u0435\u0440\u0430 (5G eMBB);<\/p>\n<p>\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>\u043f\u043e\u043b\u044f\u0440\u043d\u044b\u0439<\/strong> \u2014 \u043a\u043e\u0434\u0435\u0440 \u0438 SC-\u0434\u0435\u043a\u043e\u0434\u0435\u0440 (5G-\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435).<\/p>\n<p>\u041f\u043b\u044e\u0441 \u043f\u0440\u0435\u0441\u0435\u0442\u044b \u043f\u043e\u0434 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b (gsm.hpp, lte.hpp, nr.hpp), \u043e\u0431\u0449\u0438\u0439 AWGN-\u043a\u0430\u043d\u0430\u043b, CRC \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0436\u0438\u0442\u0435\u043b\u0438, \u043d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f BER-\u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432. \u0412\u0441\u0451 \u043d\u0430 \u0433\u043e\u043b\u043e\u043c C++17 \u0431\u0435\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u2014 \u043c\u043e\u0436\u043d\u043e \u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0439 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u043f\u043e FEC.<\/p>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<p>\u0422\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u2014 \u0442\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0434\u0438\u0442\u044c\u0441\u044f \u043c\u044f\u0433\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439. LDPC \u0433\u043e\u043d\u044f\u0435\u0442 \u0435\u0451 \u043f\u043e \u0433\u0440\u0430\u0444\u0443, \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435 \u0441\u043e\u0439\u0434\u0443\u0442\u0441\u044f; \u0442\u0443\u0440\u0431\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f BCJR \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0435\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0435\u0449\u0451 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442; polar \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u043b\u0430\u0431\u044b\u0435 \u043f\u043e\u0434\u043a\u0430\u043d\u0430\u043b\u044b \u0438 \u0438\u0434\u0451\u0442 \u043f\u043e \u0431\u0438\u0442\u0430\u043c \u0432 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434. \u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u2014 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0438\u0434\u043d\u043e \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<p>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 MATLAB \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435: \u043d\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u043c \u043a\u043e\u0434\u0435 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0435 BP \u0438 BCJR \u043b\u043e\u0436\u0430\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0443\u043b\u0431\u043e\u043a\u0441, \u0430 \u0437\u0430\u0437\u043e\u0440 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u0430\u043c, \u0433\u0434\u0435 \u0443 \u0443\u0447\u0435\u0431\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u0442 \u043d\u0443\u0436\u043d\u043e\u0439 \u0434\u043e\u0431\u0430\u0432\u043a\u0438, \u2014 \u0443 polar \u0431\u0435\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438 CRC. \u0422\u043e \u0435\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0437 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0430 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u043c\u0430\u0433\u0438\u0435\u0439, \u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u043c\u0438, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435.<\/p>\n<p>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435: SC-List \u0441 CRC (\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0437\u0430\u0437\u043e\u0440 \u043d\u0430 polar), \u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0440\u0435\u0448\u0451\u0442\u043a\u0430 \u0434\u043b\u044f \u0442\u0443\u0440\u0431\u043e (\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 error floor) \u0438 \u043a\u0432\u0430\u0437\u0438\u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b LDPC \u0438\u0437 DVB-S2\/5G. \u042d\u0442\u043e \u0443\u0436\u0435 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u2014 \u0438 \u043e\u043d\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\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\/articles\/1043922\/\">https:\/\/habr.com\/ru\/articles\/1043922\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0448\u044c \u043f\u043e\u043c\u0435\u0445\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0435 \u043a\u043e\u0434\u044b, \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0447\u0451\u0440\u043d\u044b\u043c \u044f\u0449\u0438\u043a\u043e\u043c: \u043f\u0438\u0448\u0435\u0448\u044c ldpcDecode(llr, cfg, 30), comm.TurboDecoder \u0438\u043b\u0438 dvbs2ldpc(1\/2) \u2014 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0448\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u00ab\u0432\u043e\u0434\u043e\u043f\u0430\u0434\u00bb BER, \u043d\u0435 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u044f \u0432\u043d\u0443\u0442\u0440\u044c. \u0410 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u0434\u0430\u0445 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043c: \u043d\u0435 \u0432 \u0442\u043e\u043c, \u043a\u0430\u043a \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u0432 \u0442\u043e\u043c, \u043a\u0430\u043a \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0438\u0437 \u0437\u0430\u0448\u0443\u043c\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0442\u044b.\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c: \u00ab\u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 LDPC\/\u0442\u0443\u0440\u0431\u043e \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u0438\u043b\u0438 \u043f\u043e\u043b\u044f\u0440\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u2014 \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445\u00bb. \u041d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u2014 \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0438 \u0435\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432. \u0427\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u0442\u0430\u043c \u043c\u044b \u043f\u0440\u043e\u0448\u043b\u0438 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044e \u043a\u043e\u0434\u043e\u0432 \u0432 \u0441\u043e\u0442\u043e\u0432\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u043e\u0442 GSM \u0434\u043e 5G \u043f\u043e BER-\u043a\u0440\u0438\u0432\u044b\u043c \u0432 MATLAB, \u0430 \u0432\u0441\u0451 \u043d\u0443\u0436\u043d\u043e\u0435 \u044f \u043d\u0430\u043f\u043e\u043c\u043d\u044e \u043f\u043e \u0445\u043e\u0434\u0443. \u0417\u0434\u0435\u0441\u044c \u2014 \u0432\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u0430\u043c\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u044b.\u042d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u044f\u0449\u0438\u043a. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0442\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 belief propagation \u2014 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e \u0433\u0440\u0430\u0444\u0443, \u044f\u0434\u0440\u043e LDPC \u0438 \u0432\u0441\u0435\u0433\u043e 5G eMBB;\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 BCJR + \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u043c\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u2014 \u0442\u043e, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u043e \u0442\u0443\u0440\u0431\u043e-\u043a\u043e\u0434\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438;\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 successive cancellation \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u044f\u0440\u043d\u044b\u0445 \u043a\u043e\u0434\u0430\u0445.\u0427\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443, MATLAB-\u0442\u0443\u043b\u0431\u043e\u043a\u0441 \u043d\u0435 \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u2014 \u043e\u043d \u043f\u0440\u044f\u0447\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0441\u044c \u0440\u0430\u0437\u0431\u043e\u0440 \u0438\u0434\u0451\u0442 \u043f\u043e \u043a\u043e\u0434\u0443 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u2014 fec-cpp: header-only C++17, \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u043e\u043b\u044c\u043a\u043e STL. \u0415\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0437\u0430 \u0432\u0435\u0447\u0435\u0440, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0432 \u043d\u0435\u0439 \u2014 \u043f\u043e\u043b\u0441\u043e\u0442\u043d\u0438 \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0435. \u0420\u044f\u0434\u043e\u043c \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0440\u0430\u0437\u0431\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0438 MATLAB-\u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 \u2014 \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442: \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0442\u0443\u043b\u0431\u043e\u043a\u0441\u0430 \u043f\u0440\u043e\u0442\u0438\u0432 \u044f\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u0410 \u0432 \u043a\u043e\u043d\u0446\u0435 \u2014 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0433\u043e\u043d\u0438\u043c \u043e\u0431\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u043a\u043e\u0434\u0430\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0438\u043c \u0438\u0445 BER-\u043a\u0440\u0438\u0432\u044b\u0435 \u043d\u0430 \u043e\u0434\u043d\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0438.\u042d\u0442\u043e \u0443\u0447\u0435\u0431\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. LDPC \u0437\u0434\u0435\u0441\u044c \u2014 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0430\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430, \u0430 \u043d\u0435 DVB-S2 \u043d\u0430 64800 \u0431\u0438\u0442; \u0442\u0443\u0440\u0431\u043e \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 RSC [7,5], \u0430 \u043d\u0435 LTE \u0441 QPP; \u043f\u043e\u043b\u044f\u0440\u043d\u044b\u0439 \u2014 SC \u0431\u0435\u0437 \u0441\u043f\u0438\u0441\u043e\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0426\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u0430 \u043d\u0435 \u043f\u043e\u0431\u0438\u0442\u044c \u0440\u0435\u043a\u043e\u0440\u0434 \u043f\u043e BER, \u043d\u043e \u0432\u0441\u0435 \u0442\u0440\u0438 \u0434\u0430\u044e\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0432\u043e\u0434\u043e\u043f\u0430\u0434 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u043b\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0438\u0436\u0435 \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.\u041e\u0431\u0449\u0438\u0439 \u044f\u0437\u044b\u043a: LLR\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043b\u0435\u0437\u0442\u044c \u0432 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u044b, \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c\u0441\u044f \u043f\u0440\u043e \u043e\u0434\u043d\u043e \u0447\u0438\u0441\u043b\u043e, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0432\u0441\u0435 \u0442\u0440\u043e\u0435, \u2014 LLR, \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u0438\u044f:LLR_j = log( P(\u0431\u0438\u0442_j = 0 | \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0435) \/ P(\u0431\u0438\u0442_j = 1 | \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0435) )\u041f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 LLR \u2014 \u0441\u043a\u043b\u043e\u043d\u044f\u0435\u043c\u0441\u044f \u043a \u043d\u0443\u043b\u044e, \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u2014 \u043a \u0435\u0434\u0438\u043d\u0438\u0446\u0435, \u043c\u043e\u0434\u0443\u043b\u044c \u2014 \u044d\u0442\u043e \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c. \u0414\u043b\u044f BPSK \u0432 AWGN-\u043a\u0430\u043d\u0430\u043b\u0435 \u0441 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0435\u0439 \u03c3\u00b2 \u0432\u0441\u0451 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u043e\u0439: LLR = 2y\/\u03c3\u00b2. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043a\u0430\u043d\u0430\u043b \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u2014 AWGNChannel \u0441\u0440\u0430\u0437\u0443 \u043e\u0442\u0434\u0430\u0451\u0442 \u043d\u0435 \u0431\u0438\u0442\u044b, \u0430 LLR:\/\/ include\/fec\/common\/channel.hppLLRVec transmit(const BitVec&amp; bits) {  \u00a0\u00a0\u00a0 LLRVec llr(bits.size());  \u00a0\u00a0\u00a0 for(size_t i = 0; i &lt; bits.size(); i++){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float s;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(bits[i] == 0) s = 1.0f; else s = -1.0f;\u00a0\u00a0\u00a0\u00a0 \/\/ BPSK: 0 \u044d\u0442\u043e +1, 1 \u044d\u0442\u043e -1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float y = s + sigma_ * dist_(rng_);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0448\u0443\u043c\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 llr[i] = 2.0f * y * inv_sigma2_;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ LLR = 2y\/sigma^2\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0 return llr;}\u0412\u0441\u0435 \u0442\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0432\u0435\u043a\u0442\u043e\u0440 LLR \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0431\u0438\u0442\u044b. \u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0435\u0447\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442.LDPC: belief propagation \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0413\u0440\u0430\u0444, \u0430 \u043d\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430LDPC-\u043a\u043e\u0434 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0447\u0451\u0442\u043d\u043e\u0441\u0442\u0438 H \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c (n\u2212k)\u00d7n. \u041d\u043e \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439, \u0430 \u0441 \u0433\u0440\u0430\u0444\u043e\u043c \u0422\u0430\u043d\u043d\u0435\u0440\u0430: \u0441\u043b\u0435\u0432\u0430 n \u0443\u0437\u043b\u043e\u0432-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (\u043f\u043e \u0431\u0438\u0442\u0443 \u043a\u043e\u0434\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430), \u0441\u043f\u0440\u0430\u0432\u0430 n\u2212k \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 (\u043f\u043e \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e). \u0420\u0435\u0431\u0440\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0431\u0438\u0442 \u0441 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c, \u0435\u0441\u043b\u0438 \u0432 \u044d\u0442\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 H \u0441\u0442\u043e\u0438\u0442 \u0435\u0434\u0438\u043d\u0438\u0446\u0430.\u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 H \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u0441\u043f\u0438\u0441\u043a\u0438 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0430 \u043d\u0435 \u043a\u0430\u043a \u043f\u043b\u043e\u0442\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u0440\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u00bb \u0432 \u043a\u043e\u0434\u0435:\/\/ include\/fec\/ldpc\/matrix.hppstruct ParityCheckMatrix {\u00a0\u00a0\u00a0 int M, N;\u00a0\u00a0\u00a0 vector&lt;vector&lt;int&gt;&gt; rows;\u00a0\u00a0 \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 -&gt; \u043d\u043e\u043c\u0435\u0440\u0430 \u0431\u0438\u0442\u00a0\u00a0\u00a0 vector&lt;vector&lt;int&gt;&gt; cols;\u00a0\u00a0 \/\/ \u0431\u0438\u0442 -&gt; \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a};\u0414\u0435\u043a\u043e\u0434\u0435\u0440 \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0433\u0440\u0430\u0444 \u0432 \u043f\u043b\u043e\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0451\u0431\u0435\u0440 \u2014 \u043f\u043e \u0440\u0435\u0431\u0440\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u044b. \u0412\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0436\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u0438\u0445 \u0440\u0451\u0431\u0440\u0430\u0445:\/\/ include\/fec\/ldpc\/decoder.hppvoid build_edge_list(){\u00a0\u00a0\u00a0 check_edges_.resize(H_.M);\u00a0\u00a0\u00a0 for(int c=0;c&lt;H_.M;c++)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(int v : H_.rows[c]){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int e = (int)edges_.size();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 edges_.push_back({v,c});\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u0440\u0435\u0431\u0440\u043e: (\u0431\u0438\u0442 v, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 c)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 check_edges_[c].push_back(e);\u00a0\u00a0\u00a0 \/\/ \u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 c &#8212; \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0435 \u0440\u0435\u0431\u0435\u0440\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }}\u0414\u0432\u0430 \u0441\u043e\u0440\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439\u041f\u043e \u0440\u0451\u0431\u0440\u0430\u043c \u0442\u0443\u0434\u0430-\u0441\u044e\u0434\u0430 \u0431\u0435\u0433\u0430\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432:\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 Q[e] \u2014 \u043e\u0442 \u0431\u0438\u0442\u0430 \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435: \u00ab\u0432\u043e\u0442 \u0447\u0442\u043e \u044f (\u0431\u0438\u0442) \u0434\u0443\u043c\u0430\u044e \u043e \u0441\u0435\u0431\u0435, \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f \u043c\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\u00bb.\u2022\u00a0\u00a0\u00a0\u00a0\u00a0 R[e] \u2014 \u043e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a \u0431\u0438\u0442\u0443: \u00ab\u0432\u043e\u0442 \u0447\u0442\u043e \u044f (\u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435) \u0434\u0443\u043c\u0430\u044e \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u0431\u0438\u0442, \u0433\u043b\u044f\u0434\u044f \u043d\u0430 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0435\u0433\u043e \u0441\u043e\u0441\u0435\u0434\u0435\u0439\u00bb.\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u0438\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043d\u0430\u043b\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 Q \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u043c LLR:vector&lt;float&gt; Q(E), R(E);for(int e = 0; e &lt; E; e++) Q[e] = llr_ch[edges_[e].var];\u00a0\u00a0 \/\/ \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043a\u0430\u043d\u0430\u043b\u0430\u0428\u0430\u0433 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430: \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u00ab\u0443\u0432\u0435\u0440\u0435\u043d \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0435\u0440\u0435\u043d \u0441\u043b\u0430\u0431\u0435\u0439\u0448\u0438\u0439\u00bb\u0423\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0447\u0451\u0442\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442: XOR \u0435\u0433\u043e \u0431\u0438\u0442\u043e\u0432 \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e. \u0417\u043d\u0430\u0447\u0438\u0442, \u0437\u043d\u0430\u044f \u043c\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0431\u0438\u0442\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043e\u0434\u043d\u043e\u0433\u043e, \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0439: \u043e\u043d \u0440\u0430\u0432\u0435\u043d XOR \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. \u041d\u043e \u043c\u043d\u0435\u043d\u0438\u044f \u043c\u044f\u0433\u043a\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043c\u044f\u0433\u043a\u043e\u0435.\u0422\u043e\u0447\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 (\u00abtanh rule\u00bb) \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0433\u0438\u043f\u0435\u0440\u0431\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0430\u043d\u0433\u0435\u043d\u0441\u043e\u0432. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0442\u044c, \u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u03a6(x) = \u2212log\u00b7tanh(x\/2). \u041e\u043d\u0430 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u0430 \u0441\u0430\u043c\u0430 \u0441\u0435\u0431\u0435, \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0441\u0443\u043c\u043c\u0443:static float phi(float x){\u00a0\u00a0\u00a0 if(x &lt; 1e &#8212; 9f) return 20.0f;\u00a0\u00a0 \/\/ \u0447\u0442\u043e\u0431 \u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 0 \u043f\u043e \u0441\u0443\u0442\u0438\u00a0\u00a0\u00a0 return -log(tanh(x * 0.5f));}\u041c\u0430\u0433\u043d\u0438\u0442\u0443\u0434\u0430 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u03a6 \u043e\u0442 \u0441\u0443\u043c\u043c\u044b \u03a6(|Q|) \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0451\u0431\u0435\u0440 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0430 \u0437\u043d\u0430\u043a \u2014 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u0445 \u0437\u043d\u0430\u043a\u043e\u0432. \u00ab\u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435, \u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e\u00bb \u2014 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u0451\u043c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0445 \u0438 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043d\u044b\u0445 \u0441\u0443\u043c\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0443\u043c\u043c\u0443 \u0437\u0430\u043d\u043e\u0432\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0431\u0440\u0430:for(int c = 0; c &lt; M; c++){\u00a0\u00a0\u00a0 const auto&amp; elist = check_edges_[c];\u00a0\u00a0\u00a0 int ne = (int)elist.size();\u00a0\u00a0\u00a0 vector&lt;float&gt; phi_vals(ne);\u00a0\u00a0\u00a0 float sign_prod = 1.0f;\u00a0\u00a0\u00a0 for(int i = 0; i &lt; ne; i++){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float q = Q[elist[i]];\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 phi_vals[i] = phi(fabs(q));\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(q &gt;= 0) sign_prod = 1.0f; else sign_prod = -1.0f;\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0 \/\/ \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \/ \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0441\u0443\u043c\u043c\u044b (\u0447\u0442\u043e\u0431\u044b \u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435\u0445 \u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e)\u00a0\u00a0\u00a0 vector&lt;float&gt; prefix(ne + 1,0.0f), suffix(ne + 1,0.0f);\u00a0\u00a0\u00a0 for(int i = 0; i &lt; ne; i++) prefix[i + 1] = prefix[i] + phi_vals[i];\u00a0\u00a0\u00a0 for(int i = ne &#8212; 1; i &gt;= 0; i&#8212;) suffix[i] = suffix[i + 1] + phi_vals[i];\u00a0\u00a0\u00a0\u00a0 for(int i = 0; i &lt; ne; i++){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float phi_sum = prefix[i] + suffix[i + 1];\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float qi = Q[elist[i]]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 float sign_i = sign_prod * ((qi &gt;= 0)? 1.0f:-1.0f);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 R[elist[i]] = sign_i * phi(phi_sum);\u00a0\u00a0\u00a0 }}\u0418\u043d\u0442\u0443\u0438\u0446\u0438\u044f \u0437\u0430 \u03a6: \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0435\u0437\u043a\u043e \u0440\u0430\u0441\u0442\u0451\u0442 \u0443 \u043d\u0443\u043b\u044f \u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043f\u0430\u0434\u0430\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u0443\u043c\u043c\u0443 \u03a6(|Q|) \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0432\u043a\u043b\u0430\u0434 \u0434\u0430\u0451\u0442 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0441\u043e\u0441\u0435\u0434 (\u0435\u0433\u043e |Q| \u043c\u0430\u043b\u043e \u2192 \u03a6 \u0432\u0435\u043b\u0438\u043a\u043e). \u0423\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u0432\u0435\u0440\u0435\u043d\u043e \u0432 \u0431\u0438\u0442\u0435 \u0440\u043e\u0432\u043d\u043e \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0435\u0440\u0435\u043d \u0435\u0433\u043e \u0441\u043b\u0430\u0431\u0435\u0439\u0448\u0438\u0439 \u043f\u0430\u0440\u0442\u043d\u0451\u0440. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0442\u0435\u043a\u0430\u0435\u0442 \u043e\u0442 \u00ab\u0445\u043e\u0440\u043e\u0448\u0438\u0445\u00bb \u0431\u0438\u0442\u043e\u0432 \u043a \u00ab\u043f\u043b\u043e\u0445\u0438\u043c\u00bb.\u0428\u0430\u0433 \u0431\u0438\u0442\u0430 \u0438 \u0440\u0430\u043d\u043d\u044f\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0411\u0438\u0442 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 LLR \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u043c\u0438 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0430\u043c\u0438 R \u2014 \u044d\u0442\u043e \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u0430\u044f \u0430\u043f\u043e\u0441\u0442\u0435\u0440\u0438\u043e\u0440\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430. \u0410 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 Q \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u043c\u0438\u043d\u0443\u0441 \u0432\u043a\u043b\u0430\u0434 \u044d\u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 (\u0438\u043d\u0430\u0447\u0435 \u0431\u0438\u0442 \u0432\u0435\u0440\u043d\u0443\u043b \u0431\u044b \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435 \u2014 \u044d\u0445\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u0441\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c):vector&lt;float&gt; total(N);for(int v = 0; v &lt; N; v++) total[v] = llr_ch[v];for(int e = 0; e &lt; E; e++) total[edges_[e].var] += R[e];for(int e = 0; e &lt; E; e++)\u00a0\u00a0\u00a0 Q[e] = total[edges_[e].var] &#8212; R[e];\u00a0\u00a0 \/\/ \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0432\u043e\u0435 \u0440\u0435\u0431\u0440\u043e\u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0435\u0440\u0451\u043c \u0436\u0451\u0441\u0442\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u0437\u043d\u0430\u043a\u0443 total \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0438\u043d\u0434\u0440\u043e\u043c. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u2014 \u0441\u043b\u043e\u0432\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435, \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0434\u043e\u0441\u0440\u043e\u0447\u043d\u043e, \u043d\u0435 \u0434\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u044f \u0434\u043e \u043b\u0438\u043c\u0438\u0442\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439:BitVec hard(N);for(int v = 0; v &lt; N; v++){\u00a0\u00a0\u00a0 if(total[v]&lt;0) hard[v]=1; else hard[v]=0;}BitVec synd = H_.syndrome(hard);bool valid = true;for(Bit s : synd) if(s){ valid=false; break; }if(valid) return hard;\u00a0\u00a0\u00a0\u00a0 \/\/ \u0441\u0438\u043d\u0434\u0440\u043e\u043c \u043d\u0443\u043b\u0435\u0432\u043e\u0439 &#8212; \u0432\u0441\u0435 \u043e\u043a, \u0432\u044b\u0445\u043e\u0434\u0438\u043cMATLAB \u043f\u0440\u043e\u0442\u0438\u0432 C++\u0412\u0441\u044f \u044d\u0442\u0430 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0432 MATLAB \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0443\u043c\u0435\u0449\u0430\u043b\u0430\u0441\u044c \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443:dec_bits = ldpcDecode(llr, decCfg, maxIter);\u00a0\u00a0 % \u0432\u0441\u0451 BP \u2014 \u0432\u043d\u0443\u0442\u0440\u0438\u0423\u0434\u043e\u0431\u043d\u043e, \u043d\u043e \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e: \u043d\u0438 \u0433\u0440\u0430\u0444\u0430, \u043d\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043d\u0438 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u043e\u0433\u043e \u0442\u0440\u044e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u043e. C++-\u0432\u0435\u0440\u0441\u0438\u044f \u2014 \u044d\u0442\u043e \u0442\u0435 \u0436\u0435 50 \u0441\u0442\u0440\u043e\u043a \u0432\u044b\u0448\u0435, \u0438 \u0432 \u043d\u0438\u0445 \u0432\u0438\u0434\u0435\u043d \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433.\u0427\u0438\u0441\u043b\u0430\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 (n=200, \u0432\u0435\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 3, \u0432\u0435\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 6, R=1\/2), 50 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 BP, \u0437\u0430\u043c\u0435\u0440 \u043f\u043e \u0431\u0438\u0442\u0430\u043c \u043a\u043e\u0434\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430:Eb\/N0, \u0434\u0411BER0.01.2\u00b710\u207b\u00b91.06.0\u00b710\u207b\u00b22.01.2\u00b710\u207b\u00b23.01.2\u00b710\u207b\u00b34.01.5\u00b710\u207b\u2074\u00a0\u0422\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0432\u043e\u0434\u043e\u043f\u0430\u0434: \u043c\u0435\u0436\u0434\u0443 2 \u0438 4 \u0434\u0411 BER \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u0434\u0432\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0430. \u041d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u0431\u043b\u043e\u043a\u0435 n=200 \u043e\u043d \u043f\u043e\u043b\u043e\u0433\u0438\u0439 \u2014 \u0443 DVB-S2 \u043d\u0430 64800 \u0431\u0438\u0442 \u043e\u0431\u0440\u044b\u0432 \u043a\u0443\u0434\u0430 \u043a\u0440\u0443\u0447\u0435, \u043d\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0436\u0435, \u0447\u0442\u043e \u0432 \u043a\u043e\u0434\u0435 \u0432\u044b\u0448\u0435.\u0422\u0443\u0440\u0431\u043e: BCJR \u0438 \u043e\u0431\u043c\u0435\u043d \u043c\u043d\u0435\u043d\u0438\u044f\u043c\u0438\u041e\u0434\u0438\u043d \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442: BCJR\u0422\u0443\u0440\u0431\u043e-\u043a\u043e\u0434 \u2014 \u044d\u0442\u043e \u0434\u0432\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0441\u0432\u0451\u0440\u0442\u043e\u0447\u043d\u044b\u0445 \u043a\u043e\u0434\u0435\u0440\u0430 (RSC), \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u0436\u0438\u0442\u0435\u043b\u0435\u043c. \u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 RSC \u2014 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 [7,5] octal \u043d\u0430 4 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f:\/\/ include\/fec\/turbo\/trellis.hppstruct RSCTrellis {\u00a0\u00a0\u00a0 static const int NUM_STATES = 4;\u00a0\u00a0\u00a0 static const int G0 = 0b111;\u00a0\u00a0 \/\/ 7 &#8212; \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c\u00a0\u00a0\u00a0 static const int G1 = 0b101;\u00a0\u00a0 \/\/ 5 &#8212; \u043f\u0440\u044f\u043c\u0430\u044f \u0432\u0435\u0442\u0432\u044c\u00a0\u00a0\u00a0 \/\/ tr[state][input] = {next_state, output=[sys,par]}};\u0421\u0435\u0440\u0434\u0446\u0435 \u0442\u0443\u0440\u0431\u043e-\u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u2014 BCJR (\u043e\u043d \u0436\u0435 MAP): \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0412\u0438\u0442\u0435\u0440\u0431\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043e\u0434\u0438\u043d \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u0443\u0442\u044c, BCJR \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u0430\u043f\u043e\u0441\u0442\u0435\u0440\u0438\u043e\u0440\u043d\u0443\u044e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u0443\u0441\u0440\u0435\u0434\u043d\u044f\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u0443\u0442\u044f\u043c \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0448\u0451\u0442\u043a\u0443. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u043c\u044f\u0433\u043a\u0438\u0439 \u0432\u044b\u0445\u043e\u0434\u00bb.\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u043d \u0432 \u0442\u0440\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0430. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0432\u0435\u0442\u0432\u0438 \u03b3 \u2014 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u0435\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434 (state, input) \u043f\u0440\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 LLR \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0438\u0442\u0430, \u043f\u0430\u0440\u0438\u0442\u0435\u0442\u0430 \u0438 \u0430\u043f\u0440\u0438\u043e\u0440\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438:\/\/ include\/fec\/turbo\/decoder.hppauto gamma = [&amp;](int s, int u, int t){\u00a0\u00a0\u00a0 auto&amp; trans = tr.tr[s][u];\u00a0\u00a0\u00a0 int sys = (trans.output &gt;&gt; 1) &amp; 1;\u00a0\u00a0\u00a0 int par = trans.output &amp; 1;\u00a0\u00a0\u00a0 float la = La[t], ls = llr_sys[t], lp = llr_par[t];\u00a0\u00a0\u00a0 float lsys = (sys?-1.0f:1.0f)*(ls+la);\u00a0\u00a0\u00a0 float lpar = (par?-1.0f:1.0f)*lp;\u00a0\u00a0\u00a0 return 0.5f*lsys + 0.5f*lpar;};\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u03b1 (\u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u043f\u0443\u0442\u0435\u0439 \u0441\u043b\u0435\u0432\u0430) \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u03b2 (\u0441\u043f\u0440\u0430\u0432\u0430). \u041e\u0431\u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0432 \u043b\u043e\u0433-\u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 max* \u2014 \u00ab\u043c\u044f\u0433\u043a\u0438\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u00bb, \u0442\u043e\u0447\u043d\u044b\u0439 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c \u0441\u0443\u043c\u043c\u044b \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0442:static float lse(float a, float b){\u00a0\u00a0\u00a0 if(a == -1e9f) return b;\u00a0\u00a0\u00a0&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-482477","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482477","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=482477"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482477\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=482477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=482477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=482477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}