TURBO CODES : a tutorial on a new class of powerful error correcting coding schemes Part I : Code Structures and Interleaver Design