در تئوری کدگذاری کانال مخابراتی، **کدهای هم‌پیوسته** (Concatenated codes)، دسته‌ای از کدهای تصحیح‌کننده خطا هستند که از به‌هم‎‌پیوستن یک **کد درونی** (inner code) و یک **کد بیرونی** (outer code) به‌دست می‌آیند. این کدها را دیو فورنی در سال 1966، در جست‌وجوی کدی که هم احتمال خطا با افزایش طول کد و هم پیچیدگی کدگشایی را نمایی (exponential) کاهش دهد، پیش نهاد. کدهای هم‌پیوسته در دهۀ هفتاد میلادی در مخابرات فضایی، استفاده شد.

پیش‌زمینه
---------

کدگذاری کانال، به فرستادن رشته‌ای از داده‌ها - با بیشترین نرخ (سرعت) ممکن - روی یک کانال مخابراتی مشخص، و سپس کدگشایی قابل‌اطمینان داده‌ها در گیرنده و به‌کمک الگوریتم‌های قابل پیاده‌سازیِ کدگذاری و کدگشایی می‌پردازد.

قضیه کدگذاری کانال شانون نشان می‌دهد که برای بسیاری از کانال‌های رایج، می‌توان کدهایی یافت که داده‌ها را قابل‌اطمینان و با نرخ‌ دلخواه R که کمتر از یک آستانه مشخص C، که ظرفیت کانال است، منتقل کنند. در واقع، احتمال خطای کدگشایی می‌تواند با افزایش طول کد (N)، نمایی کاهش یابد. اما، پیچیدگی یک کدگشایی بهینۀ ساده‌لوحانه هم - که تنها بر محاسبۀ درست‌نمایی (likelihood) هر کلمۀ کدِ فرستاده‌شدۀ ممکن استوار است - نمایی (exponentially) با طول کد (N) افزایش می یابد. بنابراین چنین کدگشایی بهینه‌ای، به‌سرعت ناممکن می‌شود.

دیو فورنی در پایان نامه دکترایش نشان داد که می‌توان از کدهای هم‌پیوسته برای دست‌یابی به احتمالات خطایی که به‌ازای همۀ نرخ‌های دادۀ کمتر از ظرفیت کانال، نمایی کاسته می‌شوند، و از سوی دیگر، پیچیدگیِ کدگشایی‌شان، تنها به‌طور چندجمله‌ای (polynomial-time) با طول کد افزایش می‌یابد، بهره برد.

شرح
---

 نمایش طرح‌واره از کد هم‌پیوسته که برپایۀ یک کد درونی و یک کد بیرونی ساخته شده‌است.
 این یک نمایش تصویری از به هم پیوستن دو کد است،به‌ویژه، کد Reed–Solomon با n=q=4 و k=2 به‌عنوان کد بیرونی و کد آدامار با n=q و k=log q استفاده می‌شود. به عنوان کد درونی استفاده می شود. به طور کلی، کد هم‌پیوسته است {\displaystyle [q^{2},k\log q]} -کد
فرض کنید *Cin* یک کد [*n*، *k*، *d*] *باشد*، یعنی یک کد بلوکی به طول *n* ، بعد *k* ، حداقل فاصله همینگ *d* ، و نرخ *r* = *k* / *n* ، روی الفبای *A* :

{\displaystyle C\_{in}:A^{k}\rightarrow A^{n}}
و *Cout* یک کد [ *N*، *K*، *D*] روی الفبای *B* با تعداد سمبول‌های *B|* = |*A*|*k**|* باشد:

{\displaystyle C\_{out}:B^{K}\rightarrow B^{N}}
کد درونی *Cin*، یکی از |*A*|*k* = |*B*| ورودی‌های ممکن را می‌پذیرد، آن را به یک *n*-تایی روی *A* کد میکند، روی کانال می‌فرستد، و به یکی از |*B*| خروجی‌های ممکن کدگشایی می‌کند. این را می‌توان به‌عنوان یک فراکانال (super channel) در نظر گرفت که یک سمبل را از الفبای *B* منتقل می‌کند. از این کانال *N* بار برای انتقال هر یک از *N* سمبل در یک کلمه کد *C**out* استفاده می‌کنیم. بنابراین، هم‌پیوستگی *C**out* (کد بیرونی) با Cin (کد درونی)، که با *Cout*∘*Cin* نشان داده می‌شود، کدی به طول *Nn* روی الفبای *A* است: 

{\displaystyle C\_{out}\circ C\_{in}:A^{kK}\rightarrow A^{nN}}
هر پیام ورودی *m* = (*m*1, *m*2, ... *m*K) را به یک کلمه کد (*Cin*(*m*'1), *Cin*(*m*'2), ... *Cin*(*m*'N)) می‌نگارد، که (*m*'1, *m*'2, ... *m*'N) = *Cout*(*m*1, *m*2, ... *m*K)

نکتۀ کلیدی در این رویکرد این است که اگر *C**in* به روش بیشترین درست‌نمایی، کدگشایی شود (که احتمال خطای نمایی کم‌شونده با افزایش طول کد دارد)، و *C**out* یک کد با طول *N* = 2*nr* باشد که می‌تواند با پیچیدگی محاسباتی چندجمله‌ای بر حسب *N* کدگشایی شود. سپس کد هم‌پیوسته را می‌توان با پیچیدگی محاسباتی چندجمله‌ای *n*2*nr* = *O*(*N*⋅log(*N*)) کدگشایی کرد، که احتمال خطای نمایی کم‌شونده دارد، حتی اگر کدگشایی *C**in*، دارای پیچیدگی نمایی باشد.

در تعمیم این هم‌پیوستگی، *N* کد درونی ممکن *Cin*,*i* وجود دارد و نماد *i-* ام در یک کلمه رمز از *C* *out* با استفاده از کد داخلی *i-* ام در کانال داخلی منتقل می شود. کدهای جاستسن نمونه‌هایی از کدهای پیوسته تعمیم‌یافته هستند که کد بیرونی یک کد رید-سولومون است.

ویژگی‌ها
--------

**1.** فاصله کد هم‌پیوسته *C**out* ∘ *C*، دست‌کم *dD* است، یعنی یک کد [*nN*، *kK*، *D*'] با *D*' ≥ *dD* است.

*اثبات:* دو پیام *m*1 ≠ *m*2 ∈ *B**K* را در نظر بگیرید. اگر Δ نشان‌دهنده فاصلۀ دو کلمه کد باشد، پس

{\displaystyle \Delta (C\_{out}(m^{1}),C\_{out}(m^{2}))\geq D.}
بنابراین، دست‌کم *D* جا در دنباله‌ای از *N* سمبول کلمات کد *C**out*(*m*1) و *C**out*(*m*2) می‌توان یافت که یکسان نباشند. برای این جاها، که با *i* نشان داده‌شده‌اند داریم

{\displaystyle \Delta (C\_{in}(C\_{out}(m^{1})\_{i}),C\_{in}(C\_{out}(m^{2})\_{i}))\geq d.}
بنابراین، دست‌کم *d*⋅*D* جا در دنباله *n*⋅*N* سمبولِ برگرفته از الفبای *A* هستند که در آن‌ها دو کلمه کد با هم فرق دارند، و ازاین‌رو

{\displaystyle \Delta (C\_{in}(C\_{out}(m^{1})),C\_{in}(C\_{out}(m^{2})))\geq dD.}
**2.** اگر *C**out* و *C**in* کدهای بلوک خطی باشند، *C**out* ∘ *C**in* نیز یک کد بلوک خطی است.

این ویژگی را می‌توان به‌سادگی برپایۀ ایده تعریف یک ماتریس مولد برای کد هم‌پیوسته برحسب ماتریس‌های مولد *C**out* و *Cin* نشان داد.

کدگشایی کد هم‌پیوسته
--------------------

یک راه طبیعی برای کدگشایی کد هم‌پیوسته این است که نخست کد درونی و سپس کد بیرونی را کدگشاییم. برای عملی بودن، پیچیدگی محاسباتی این الگوریتم باید برحسب طول بلوک نهایی، چندجمله‌ای باشد. فرض کنید که یک الگوریتم کدگشایی منحصربه‌فرد چندجمله‌ای برای کد بیرونی در دست باشد. باید یک الگوریتم کدگشایی چندجمله‌ای برای کد درونی پیدا کنیم. زمان اجرای چندجمله‌ای در اینجا به این معنی است که مدت زمان اجرای الگوریتم در طول بلوک نهایی، یک چندجمله‌ای از طول کد است. ایده اصلی این است که اگر طول بلوک درونی، لگاریتمی از طول کد بیرونی انتخاب شود، مدت زمان اجرای الگوریتم کدگشایی کد درونی ممکن است تابعی نمایی از طول بلوک درونی شود، و بنابراین می‌توانیم از کدگشایی بیشترین درست‌نمایی بهینه (MLD) برای کد درونی اما با مدت زمان اجرای نمایی بهره بریم. 

فرض کنید ورودی کدگشا بردار *y* = (*y*1, ... *y**N*) ∈ (*A**n*)*N* باشد. الگوریتم کدگشایی یک فرآیند دو مرحله‌ای‌ست:

1. از MLD کد درونیِ *C*in برای بازسازی مجموعه‌ای از کلمات کد درونی استفاده کنید *y*' = (*y*'1, ... *y*'*N*) که *y*'*i* = MLD*C*in (*y*i), 1 ≤ *i* ≤ *N.*
2. الگوریتم کدگشایی یگانه برای *C*out را روی *y* پیاده کنید.

اکنون، پیچیدگی اجرای مرحله اول *O*(*N⋅exp*(*n*)) است، که در آن *n* = *O* (log( *N* )) طول بلوک درونی است. به عبارت دیگر، *N**O*(1) (یعنی چندجمله‌ای) بر حسب طول بلوک بیرونی *N* است. در مرحله دوم - که فرض می‌شود پیچیدگی الگوریتم کدگشایی بیرونی، چندجمله‌ای است - پیچیدگی الگوریتم کدگشایی کد هم‌پیوستۀ حاصل نیز چندجمله‌ای است.

### نکات

الگوریتم کدگشایی بالا، می‌تواند برای تصحیح همۀ خطاهای کمتر از *dD*/4 از نظر تعداد، استفاده شود. با استفاده از کدگشایی کمترین فاصله، کدگشای *بیرونی* می‌تواند همۀ ورودی‌های '*y* که کمتر از *D*/2 سمبل خطا دارند را تصحیح کند. همچنین، اگر کمتر از *d*/2 سمبل‌های درونی، نادرست باشند، کد درونی می‌تواند ورودی *y**i* را قابل‌اعتماد تصحیح کند. بنابراین، برای نادرست بودن یک سمبل بیرونی *y*'*i* پس‌از رمزگشایی درونی، دست‌کم *d*/2 سمبل‌های درونی باید نادرست باشند، و برای اینکه کد بیرونی درست کار نکند، دست‌کم *D*/2 سمبل بیرونی باید نادرست باشند. بنابراین، شمار کل سمبل‌های درونی که باید نادرست دریافت شده‌باشند تا کد هم‌پیوسته از کار بیفتد، باید دست‌کم*d*/2⋅ *D*/2 = *dD*/4 باشد.

همچنین این الگوریتم در صورتی کار می‌کند که کدهای درونی متفاوت باشند، برای نمونه، برای کدهای یوستسن. الگوریتم کمترین فاصله تعمیم‌یافته، که فورنی پیش نهاد، می‌تواند برای تصحیح *dD*/2 خطا به کار رود.  این الگوریتم، از اطلاعات مخدوش (erasure) کد درونی برای بهبود عملکرد کد بیرونی بهره می‌گیرد و نخستین الگوریتمی بود که از کدگشایی با تصمیم‌گیری نرم استفاده می‌کرد.

کاربردها
--------

اگرچه یک روش هم‌پیوستگی ساده برای مأموریت مدارگرد مارینر مریخ، پیشتر در 1971 پیاده شده‌بود، کاربرد مرتب کدهای هم‌پیوسته برای مخابرات فضای دوردست با برنامه وویجر، - که دو کاوشگر فضایی را در 1977 پرتاب کرد - آغاز شد. از آن زمان، این کدها، ابزار کدگذاری تصحیح خطای کارآمد شدند و کاربردشان دست‌کم تا اختراع کدهای توربو و کدهای ال‌دی‌پی‌سی ادامه یافت. 

معمولا، کد درونی، یک کد بلوکی نیست، بلکه یک کد کانولوشنال کدگشایی‌شده به روش ویتربی نرم با طول قید (constraint length) کوتاه است. کد بیرونی هم، یک کد بلوکی درازتر با تصمیم‌گیری سخت (hard decision) - اغلب یک کد رید-سولومون با سمبل‌های هشت‌بیتی - است.  اندازۀ سمبل بزرگتر باعث می‌شود کد بیرونی در برابر خطاهای رگباری (burst error) - که ممکن است در اثر اختلالات کانال رخ دهند یا در اثر اینکه خروجی کد کانولوشنال، پیاپی خطا دارد، قوی‌تر شود.  معمولاً میان دو کد، یک درهم‌کننده (interleaver) هم می‌گذارند تا خطاهای رگباری را پخش کند.

هم‌پیوستگی کد کانولوشنال ویتربی درونی و کد رید-سولومون بیرونی (معروف به کد RSV)، نخستین‌‌بار در *وویجر 2* به‌کار رفت  و یک ساختار محبوب شد. امروزه در مخابرات ماهواره‌ای، مانند استاندارد تلویزیون دیجیتال DVB-Sاز این کد استفاده می‌شود. 

در نگاهی فراخ‌تر، هر ترکیب (سریالی) دو یا چند کد، ممکن است یک کد هم‌پیوسته نامیده شود. برای نمونه، در استاندارد DVB-S2، از راه هم‌پیوستگی یک کد ال‌دی‌پی‌سی بسیار کارآمد و یک کد بیرونی جبری، هرگونه خطای بازمانده از کد ال‌دی‌پی‌سی درونی در اثر کف خطای ذاتی این کد، تصحیح شود. 

یک کد هم‌پیوستۀ ساده نیز در لوح فشرده (CD) به‌کار می‌رود، که در آن یک درهم‌کنندۀ میان دو کد رید-سولومون مختلف، خطاها را در بلوک‌ها پخش می‌کند.

کدهای توربو: رویکرد هم‌پیوستگی موازی
------------------------------------

کدهای توربو را می‌توان یک هم‌پیوستگی موازی از دو کد کانولوشنال دانست که یک درهم‌کننده (interleaver)، میان آن دو قرار گرفته و تکرارشونده (iterative) کدگشایی می‌شوند. این طرح، عملکرد بهتری نسبت به کدهای هم‌پیوسته پیشین دارد.

اما، یک جنبه کلیدی کدهای توربو، رویکرد کدگشایی تکرارشوندۀ آنهاست. کدگشایی تکرارشونده، اکنون برای هم‌پیوستگی سریال و با هدف دستیابی به بهرۀ (gain) کدگذاری بیشتر هم به‌کار می‌روند، برای نمونه، در کدهای کانولوشنال هم‌پیوسته سریالی. یک نسخه ابتدائی کدگشایی تکرارشونده با دو تا پنج تکرار، در "کد گالیله" کاوشگر فضایی گالیله پیاده شد.

همچنین ببینید
-------------

* قید گیلبرت – ورشاموف
* کد یوستِسِن
* قید سینگلتون
* قید زیابلوف

منابع
-----

1. 1 2 3 4 5  
G. D. Forney (1967). "Concatenated codes". Cambridge, Massachusetts: MIT Press. `{{cite journal}}`: Cite journal requires `|journal=` (help)
2. ↑  
Forney, G. David (April 1966). "Generalized Minimum Distance Decoding". *IEEE Transactions on Information Theory*. **12** (2): 125–131. doi:10.1109/TIT.1966.1053873.
3. ↑  Yu, Christopher C.H.; Costello, Daniel J. (March 1980). "Generalized Minimum Distance Decoding for *Q*ary Output Channels". *IEEE Transactions on Information Theory*. **26** (2): 238–243. doi:10.1109/TIT.1980.1056148.
4. ↑  Wu, Yingquan; Hadjicostis, Christoforos (January 2007). "Soft-Decision Decoding of Linear Block Codes Using Preprocessing and Diversification". *IEEE Transactions on Information Theory*. **53** (1): 387–393. doi:10.1109/tit.2006.887478.
5. 1 2 3 4 5 6 7  
Robert J. McEliece; Laif Swanson (20 August 1993). "Reed–Solomon Codes and the Exploration of the Solar System". JPL. `{{cite journal}}`: Cite journal requires `|journal=` (help)
6. 1 2 3  K. Andrews et al. *The Development of Turbo and LDPC Codes for Deep-Space Applications*, Proceedings of the IEEE, Vol. 95, No. 11, Nov. 2007.
7. ↑  
J. P. Odenwalder (1970). "Optimal decoding of convolutional codes". U.C.L.A. Systems Science Dept. (dissertation). `{{cite journal}}`: Cite journal requires `|journal=` (help)
8. ↑  R. Ludwig, J. Taylor, Voyager Telecommunications Manual, JPL DESCANSO *(Design and Performance Summary Series)*, March 2002.
9. ↑  Digital Video Broadcasting (DVB); Framing structure, channel coding and modulation for 11/12 GHz satellite services, ETSI EN 300 421, V1.1.2, August 1997.
10. ↑  Digital Video Broadcasting (DVB); Second generation framing structure, channel coding and modulation systems for Broadcasting, Interactive Services, News Gathering and other broadband satellite applications (DVB-S2), ETSI EN 302 307, V1.2.1, April 2009.

بیشتر بخوانید
-------------

*

لینک‌های بیرونی
---------------

* 
* University at Buffalo Lecture Notes on Coding Theory – Dr. Atri Rudra