در تئوری کدگذاری کانال مخابراتی، کدهای همپیوسته (Concatenated codes)، دستهای از کدهای تصحیحکننده خطا هستند که از بههمپیوستن یک کد درونی (inner code) و یک کد بیرونی (outer code) بهدست میآیند. این کدها را دیو فورنی در سال 1966، در جستوجوی کدی که هم احتمال خطای آن با افزایش طول کد، بهطور نمایی (Exponential) کاهش یابد و هم دارای پیچیدگیِ کدگشاییِ چندجملهای برحسب طول کد (Polynomial-time) باشد، پیش نهاد.[۱] کدهای همپیوسته در دهۀ هفتاد میلادی در مخابرات فضایی، استفاده شد.
کدگذاری کانال، به فرستادن رشتهای از دادهها - با بیشترین نرخ (سرعت) ممکن - روی یک کانال مخابراتی مشخص، و سپس کدگشایی قابلاطمینان دادهها در گیرنده و بهکمک الگوریتمهای قابل پیادهسازیِ کدگذاری و کدگشایی میپردازد.
قضیه کدگذاری کانال شانون نشان میدهد که برای بسیاری از کانالهای رایج، میتوان کدهایی یافت که دادهها را قابلاطمینان و با نرخ دلخواه که کمتر از یک آستانه مشخص (ظرفیت کانال)، منتقل کنند. در واقع، احتمال خطای کدگشایی میتواند با افزایش طول کد ()، بهطور نمایی کاهش یابد. اما، پیچیدگی یک کدگشایی بهینۀ سادهلوحانه هم - که تنها بر محاسبۀ درستنمایی (likelihood) هر کلمۀ کدِ فرستادهشدۀ ممکن، استوار است - بهطور نمایی (exponentially) با طول کد () افزایش می یابد. بنابراین چنین کدگشایی بهینهای، بهسرعت ناممکن میشود.
دیو فورنی در پایان نامه دکترایش نشان داد که میتوان از کدهای همپیوسته برای دستیابی به احتمالات خطایی که بهازای همۀ نرخهای دادۀ کمتر از ظرفیت کانال، بهطور نمایی کاسته میشوند، و از سوی دیگر، پیچیدگیِ کدگشاییشان، تنها بهطور چندجملهای (polynomial-time) با طول کد افزایش مییابد، بهره برد.
فرض کنید Cin یک کد [n، k، d] باشد، یعنی یک کد بلوکی به طول n ، بعد k ، حداقل فاصله همینگ d ، و نرخ r = k/n ، روی الفبای A :
و Cout یک کد [ N، K، D] روی الفبای B با تعداد سمبولهای B| =||A|k| باشد:
کد درونی Cin، یکی از |A|k = |B| ورودیهای ممکن را میپذیرد، آن را به یک n-تایی روی A کد میکند، روی کانال میفرستد، و به یکی از |B| خروجیهای ممکن کدگشایی میکند. این را میتوان بهعنوان یک فراکانال (super channel) در نظر گرفت که یک سمبل را از الفبای B منتقل میکند. از این کانال N بار برای انتقال هر یک از N سمبل در یک کلمه کد Cout استفاده میکنیم. بنابراین، همپیوستگی Cout (کد بیرونی) با Cin (کد درونی)، که با Cout∘Cin نشان داده میشود، کدی به طول Nn روی الفبای A است: [۱]
هر پیام ورودی m = (m1, m2, ..., mK) را به یک کلمه کد (Cin(m'1), Cin(m'2), ..., Cin(m'N)) مینگارد، که (m'1, m'2, ..., m'N) = Cout(m1, m2, ..., mK)
نکتۀ کلیدی در این رویکرد این است که اگر Cin به روش درستنمایی بیشینه (Maximum likelihood)، کدگشایی شود (که احتمال خطای نماییِ کمشونده با افزایش طول کد دارد)، و Cout یک کد با طول N = 2nr باشد که میتواند با پیچیدگی محاسباتی چندجملهای (Polynomial time) بر حسب N کدگشایی شود. سپس کد همپیوسته را میتوان با پیچیدگی محاسباتی چندجملهای n2nr = O(N⋅log(N)) کدگشایی کرد، که احتمال خطای نماییکمشونده (Exponentially decreasing) دارد، حتی اگر کدگشایی Cin، دارای پیچیدگی نمایی (Exponential time) باشد.[۱]
در تعمیم این همپیوستگی، N کد درونی ممکن Cin, i وجود دارد و نماد i-ام در کلمه کد Cout با استفاده از کد درونی i-ام در کانال درونی منتقل میشود. کدهای یوستِسِن نمونهای از کدهای همپیوسته تعمیمیافته هستند که کد بیرونی آنها یک کد رید-سولومون است.
1. فاصله کد همپیوسته Cout∘C، دستکم dD است، یعنی یک کد [nN، kK، D'] با D' ≥ dD است.
اثبات: دو پیام m1 ≠ m2 ∈ BK را در نظر بگیرید. اگر Δ نشاندهنده فاصلۀ دو کلمه کد باشد، پس
بنابراین، دستکم D جا در دنبالهای از N سمبول کلمات کد Cout(m1) و Cout(m2) میتوان یافت که یکسان نباشند. برای این جاها، که با i نشان دادهشدهاند داریم
بنابراین، دستکم d⋅D جا در دنباله n⋅N سمبولِ برگرفته از الفبای A هستند که در آنها دو کلمه کد با هم فرق دارند، و ازاینرو
2. اگر Cout و Cin کدهای بلوک خطی باشند، Cout ∘ Cin نیز یک کد بلوک خطی است.
این ویژگی را میتوان بهسادگی برپایۀ ایده تعریف یک ماتریس مولد برای کد همپیوسته برحسب ماتریسهای مولد Cout و Cin نشان داد.
یک راه طبیعی برای کدگشایی کد همپیوسته این است که نخست کد درونی و سپس کد بیرونی را کدگشاییم. برای عملی بودن، پیچیدگی محاسباتی این الگوریتم باید برحسب طول بلوک نهایی، چندجملهای باشد. فرض کنید که یک الگوریتم کدگشایی منحصربهفرد چندجملهای برای کد بیرونی در دست باشد. باید یک الگوریتم کدگشایی چندجملهای برای کد درونی پیدا کنیم. زمان اجرای چندجملهای در اینجا به این معنی است که مدت زمان اجرای الگوریتم در طول بلوک نهایی، یک چندجملهای از طول کد است. ایده اصلی این است که اگر طول بلوک درونی، لگاریتمی از طول کد بیرونی انتخاب شود، مدت زمان اجرای الگوریتم کدگشایی کد درونی ممکن است تابعی نمایی از طول بلوک درونی شود، و بنابراین میتوانیم از کدگشایی درستنمایی بیشینه بهینه (MLD) برای کد درونی اما با پیچیدگی نمایی (Exponential time) بهره بریم.
فرض کنید ورودی کدگشا، بردار y = (y1, ..., yN) ∈ (An)N باشد. الگوریتم کدگشایی یک فرآیند دو مرحلهایست:
اکنون، پیچیدگی اجرای مرحله اول O(N⋅exp(n)) است، که در آن n = O (log( N )) طول بلوک درونی است. به عبارت دیگر، NO(1) (یعنی چندجملهای) بر حسب طول بلوک بیرونی N است. در مرحله دوم - که فرض میشود پیچیدگی الگوریتم کدگشایی بیرونی، چندجملهای است - پیچیدگی الگوریتم کدگشایی کد همپیوستۀ حاصل نیز چندجملهای است.
الگوریتم کدگشایی بالا، میتواند برای تصحیح همۀ خطاهای کمتر از dD/4 از نظر تعداد، استفاده شود. با استفاده از کدگشایی کمترین فاصله، کدگشای بیرونی میتواند همۀ ورودیهای 'y که کمتر از D/2 سمبل خطا دارند را تصحیح کند. همچنین، اگر کمتر از d/2 سمبلهای درونی، نادرست باشند، کد درونی میتواند ورودی yi را قابلاعتماد تصحیح کند. بنابراین، برای نادرست بودن یک سمبل بیرونی y'i پساز رمزگشایی درونی، دستکم d/2 سمبلهای درونی باید نادرست باشند، و برای اینکه کد بیرونی درست کار نکند، دستکم D/2 سمبل بیرونی باید نادرست باشند. بنابراین، شمار سمبلهای درونی که باید نادرست دریافت شدهباشند تا کد همپیوسته از کار بیفتد، باید دستکم d/2⋅ D/2 = dD/4 باشد.
همچنین این الگوریتم در صورتی کار میکند که کدهای درونی متفاوت باشند، برای نمونه، برای کدهای یوستسن. الگوریتم کمترین فاصله تعمیمیافته، که فورنی پیش نهاد، میتواند برای تصحیح dD/2 خطا به کار رود. [۲] این الگوریتم، از اطلاعات مخدوش (erasure) کد درونی برای بهبود عملکرد کد بیرونی بهره میگیرد و نخستین الگوریتمی بود که از کدگشایی با تصمیمگیری نرم (Soft decision) استفاده میکرد.[۳] [۴]
اگرچه یک روش همپیوستگی ساده برای مأموریت مدارگرد مارینر مریخ، پیشتر در 1971 پیاده شدهبود،[۵] کاربرد مرتب کدهای همپیوسته برای مخابرات فضای دوردست با برنامه وویجر، - که دو کاوشگر فضایی را در 1977 پرتاب کرد - آغاز شد.[۶] از آن زمان، این کدها، ابزار کدگذاری تصحیح خطای کارآمد شدند و کاربردشان دستکم تا اختراع کدهای توربو و کدهای الدیپیسی ادامه یافت.[۵] [۶]
معمولا، کد درونی، یک کد بلوکی نیست، بلکه یک کد کانولوشنال کدگشاییشده به روش ویتربی نرم با طول قید (constraint length) کوتاه است.[۷] کد بیرونی هم، یک کد بلوکی درازتر با تصمیمگیری سخت (hard decision) - اغلب یک کد رید-سولومون با سمبلهای هشتبیتی - است.[۱] [۵] اندازۀ سمبل بزرگتر باعث میشود کد بیرونی در برابر خطاهای رگباری (burst error) - که ممکن است در اثر اختلالات کانال رخ دهند یا در اثر اینکه خروجی کد کانولوشنال، پیاپی خطا دارد، قویتر شود.[۱] [۵] معمولاً میان دو کد، یک درهمکننده (interleaver) هم میگذارند تا خطاهای رگباری را پخش کند.[۵]
همپیوستگی کد کانولوشنال ویتربی درونی و کد رید-سولومون بیرونی (معروف به کد RSV)، نخستینبار در وویجر 2 بهکار رفت[۵] [۸] و یک ساختار محبوب شد. امروزه در مخابرات ماهوارهای، مانند استاندارد تلویزیون دیجیتال DVB-Sاز این کد استفاده میشود. [۹]
در نگاهی فراختر، هر ترکیب (سریالی) دو یا چند کد، ممکن است یک کد همپیوسته نامیده شود. برای نمونه، در استاندارد DVB-S2، از راه همپیوستگی یک کد الدیپیسی بسیار کارآمد و یک کد بیرونی جبری، هرگونه خطای بازمانده از کد الدیپیسی درونی در اثر کف خطای ذاتی این کد، تصحیح شود. [۱۰]
یک کد همپیوستۀ ساده نیز در لوح فشرده (CD) بهکار میرود، که در آن یک درهمکنندۀ میان دو کد رید-سولومون مختلف، خطاها را در بلوکها پخش میکند.
کدهای توربو را میتوان یک همپیوستگی موازی از دو کد کانولوشنال دانست که یک درهمکننده (interleaver)، میان آن دو قرار گرفته و تکرارشونده (iterative) کدگشایی میشوند.[۶] این طرح، عملکرد بهتری نسبت به کدهای همپیوسته پیشین دارد.
اما، یک جنبه کلیدی کدهای توربو، کدگشایی تکرارشوندۀ آنهاست. کدگشایی تکرارشونده، اکنون برای همپیوستگی سریال و با هدف دستیابی به بهرۀ (gain) کدگذاری بیشتر هم بهکار میروند، برای نمونه، در کدهای کانولوشنال همپیوسته سریالی. یک نسخه ابتدائی کدگشایی تکرارشونده با دو تا پنج تکرار، در "کد گالیله" کاوشگر فضایی گالیله پیاده شد. [۵]
{{cite journal}}
: Cite journal requires |journal=
(help)
{{cite journal}}
: Cite journal requires |journal=
(help)
{{cite journal}}
: Cite journal requires |journal=
(help)