Автор: Пользователь скрыл имя, 14 Мая 2013 в 16:19, курсовая работа
С ростом использования электроники и компьютеров, растет потребность в быстрой и надежной передаче информации по радио- и телефонным каналам связи, а также от одного устройства к другому. В любом канале связи присутствуют шумы – сигналы, которые могут искажать передаваемую по каналу информацию. С этими искажениями можно бороться, преобразуя передаваемую информацию при помощи кода, который будет обнаруживать, и исправлять ошибки. Так, например, в CD и DVD, в модемах, используются коды исправляющие ошибки.
ВВЕДЕНИЕ 3
1. Постановка задачи 4
2. Реализация кодов 5
2.1. Общие сведения 5
2.2. БЧХ(5, 15, 7) 5
2.3. Код Рида-Маллера 5
3. Magic Coder 7
3.1. Руководство пользователя 7
3.1.1. Меню «Файл» 7
3.1.2. Меню «Код» 7
3.2. Добавление новых кодов 8
3.3. Описание модулей программы 9
3.3.1. Модуль «BitsUtils.pas» 9
3.3.2. Модуль «MathUtils.pas» 12
3.3.3. Модуль «Code.pas» 12
3.3.4. Модуль «CodeThreads.pas» 20
3.3.5. Модуль «RM.pas» 25
3.3.6. Модуль «BCH.pas» 27
3.3.7. Прочие модули 29
4. Заключение 30
5. Литература 31
{ Метод реализует работу потока (thread) }
end; { TCustomCodecThread }
{ TCodecThread
Наследник TCustomCodecThread. Просто публикует свойства
класса TCustomCodecThread }
TCodecThread = class(TCustomCodecThread)
public
property Code;
property EncodeMode;
property InStream;
property Interval;
property OutStream;
property OnDecodeCodeCreate;
property OnProgress;
property OnException;
end; { TEncodeThread }
{ TFileEncodeThread
Наследник TCustomCodecThread, надстройка. Позволяет сделать
кодирование и декодирование файлов проще.
Нужно указать имена исходного и целевого файлов, автоматически
будут созданы соответствующие потоки }
TFileCodecThread = class(TCustomCodecThread)
private
FInputFileName: String;
{ Имя исходного файла }
FOutputFileName: String;
{ Имя целевого файла }
{ Set методы свойств класса }
procedure SetInputFileName(const Value: String);
procedure SetOutputFileName(const Value: String);
public
destructor Destroy; override;
{ Свойства класса }
property InputFileName: String read FInputFileName
write SetInputFileName;
property OutputFileName: String read FOutputFileName
write SetOutputFileName;
{ Публикация свойств унаследованных от TCustomCodecThread }
property EncodeMode;
property Code;
property Interval;
property OnDecodeCodeCreate;
property OnProgress;
property OnException;
end; { TFileEncodeThread }
Содержит реализацию кода Рида-Маллера.
unit RM;
interface
uses
BitsUtils, Code, MathUtils, Windows, SysUtils, Classes;
{ Параметры кода Рида-Маллера по умолчанию }
const
DEF_RM_M = 5;
DEF_RM_R = 2;
type
ERMCode = class(ECode);
TRMCode = class(TCode)
private
{ Параметры кода Рида-Маллера }
FM: Integer;
FR: Integer;
{ Новые параметры кода Рида-Маллера. Эти поля используются
set-методами свойств R, M. Когда оба поля принимают ненулевые
значения, проверяется допустимость этих параметров. Если
они допустимы, то происходит создание новой порождающей матрицы
и т.п. }
FNewM: Integer;
FNewR: Integer;
FGkRows: array of Integer;
{ Массив числа строк в минорах G_k порождающей матрицы.
Используется при декодировании для увеличения производительности }
procedure FreeCode;
{ Освобождает память занятую порождающей матрицей, характеристическими
векторами и FGkRows }
procedure FreeCharacterVectors;
{ Освобождает память занятую характеристическими векторами }
procedure FreeGeneratorMatrix;
{ Освобождает память занятую порождающей матрицей }
protected
FK: Integer;
{ Размер информационного свойства }
FN: Integer;
{ Размер кодового слова }
FG: array of TWord;
{ Порождающая матрица }
FCharacterVectors: array of array of TWord;
{ Характеристические векторы для строк порождающей матрицы }
procedure BuildGeneratorMatrix;
{ Строит порождающую матрицу }
procedure BuildCharacterVectors;
{ Строит характеристические векторы для строк порождающей матрицы.
Используется для ускорения процесса декодирования }
procedure GenerateCode;
{ Проверяет допустимость FNewR и FNewM. Если все в порядке,
вызывает FreeCode, а затем BuildGeneratorMatrix и
BuildCharacterVectors.
FNewR, FNewM сбрасываются в 0 }
procedure FillE(var E: array of Integer; Monomial: array of Integer);
{ Заполняет множество E, состоящее из индексов переменных от 1 до M
не входящих в моном Monomial. Используется при генерации
характеристических векторов.
Пример: M = 3. Monomial = [1]. Тогда E = [2, 3] }
procedure NextIndexes(var Indexes: array of Integer);
{ Генерирует всевозможные перестановки на M элементах длины
Length(Indexes).
Используется при генерации строк порождающей матрицы }
{ Set-методы свойств }
procedure SetM(Value: Integer);
procedure SetR(Value: Integer);
{ Перекрытые методы, унаследованные от TCode }
function GetK: Integer; override;
function GetN: Integer; override;
function GetFullName: String; override;
class function GetName: String; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
{ Перекрытые методы, унаследованные от TCode }
procedure Encode(Word: TWord; CodeWord: TCodeWord); override;
procedure Decode(RecievedWord: TCodeWord; Word: TWord); override;
{ Свойства класса }
property K: Integer read GetK;
property N: Integer read GetN;
published
{ Published свойства автоматически сохраняются при записи класса в
поток, и восстанавливаются при создании класса из потока.
При декодировании это позволяет создать код Рида-Маллера
с теми параметрами, которые использовались при кодировании }
property M: Integer read FM write SetM default DEF_RM_M;
property R: Integer read FR write SetR default DEF_RM_R;
end; { TRMCode }
Содержит реализацию кода БЧХ(5, 15, 7).
unit BCH;
interface
uses
SysUtils, Code, BitsUtils, Windows, Math, Classes;
const
{ Параметры кода }
BCH_K = 5;
BCH_N = 15;
BCH_D = 7;
{ Число слов длины 15 и кодовых слов }
BCH_WORDS_COUNT = 32768; { 2^15 }
BCH_CODEWORDS_COUNT = 32; { 2^5 }
{ Порождающий многочлен для БЧХ(5, 15, 7):
x^10 + x^8 + x^5 + x^4 + x^2 + x + 1 }
{ Порождающая матрица }
BCH_GEN: array[0..BCH_K-1, 0..BCH_N-1] of TBit =
( (1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0),
(0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0),
(0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0),
(0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0),
(0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1)
);
type
{ Класс исключительной ситуации }
EBCHCode = class(ECode);
{ БЧХ код (5, 15, 7)
Используется табличное кодирование и декодирование }
TBCHCode = class(TCode)
protected
{ Параметры кода }
FK: Integer;
FN: Integer;
{ Таблица декодирования }
FDecodeTable: array[0..BCH_WORDS_COUNT - 1] of Byte;
{ Таблица кодирования }
FEncodeTable: array[0..BCH_CODEWORDS_COUNT - 1] of Word;
{ Построение таблицы декодирования.
Cлова разбиваются на смежные классы. В каждом
смежном классе выбирается лидер и заполняется таблица декодирования }
procedure BuildDecodeTable;
{ Построение таблицы кодирования }
procedure BuildEncodeTable;
{ Перекрытые методы, унаследованные от TCode }
function GetD: Integer; override;
function GetK: Integer; override;
function GetN: Integer; override;
function GetFullName: String; override;
class function GetName: String; override;
public
constructor Create(AOwner: TComponent); override;
constructor CreateNew;
{ Кодирование
Информационное слово рассматривается как индекс (0..31).
Кодовое слово получается копированием содержимого таблицы кодирования,
находящегося по указанному индексу }
procedure Encode(Word: TWord; CodeWord: TCodeWord); override;
{ Декодирование
Полученное слово рассматривается как индекс (0..32767}.
Информационного слово получается копированием содержимого таблицы
декодирования, находящегося по указанному индексу }
procedure Decode(RecievedWord: TCodeWord; Word: TWord); override;
{ Свойства унаследованные от TCode }
property K: Integer read GetK;
property N: Integer read GetN;
end; { TBCHCode }
В результате проделанной работы были реализованы:
Из-за стремления к универсальности и удобству использования, скорость работы невысока. Однако, имеются большие резервы для ее повышения без ущерба универсальности и удобству.
Аттестационная работа имеет хорошие перспективы для дальнейшего развития, например, интересной представляется возможность создания универсального класса для БЧХ-кодов, а также повышение производительности до качественно нового уровня. Еще более интересной является задача исследования поведения кодов в ситуациях, когда возникающие при передаче информации ошибки превышают конструктивные способности кода их исправлять. Т.е. если код по построению способен исправлять ошибки веса не больше 3-х, то как он проявит себя с ошибками веса 4 и выше?
Данная аттестационная работа может служить пособием для изучающих основы теории кодирования.
1 Назначение тех или иных методов можно найти в разделе «Описание модулей», а также в комментариях к исходному коду проекта Magic Coder.