будут созданы соответствующие потоки }
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 }
В результате проделанной работы были реализованы:
1. гибкая, легко расширяемая система, основанная на принципах объектно-ориентированного программирования;
2. класс кода БЧХ(5, 15, 7);
3. класс кода Рида-Маллера с произвольными параметрами;
4. наборы классов для операций кодирования и декодирования;
Из-за стремления к универсальности и удобству использования, скорость работы невысока. Однако, имеются большие резервы для ее повышения без ущерба универсальности и удобству.
Аттестационная работа имеет хорошие перспективы для дальнейшего развития, например, интересной представляется возможность создания универсального класса для БЧХ-кодов, а также повышение производительности до качественно нового уровня. Еще более интересной является задача исследования поведения кодов в ситуациях, когда возникающие при передаче информации ошибки превышают конструктивные способности кода их исправлять. Т.е. если код по построению способен исправлять ошибки веса не больше 3-х, то как он проявит себя с ошибками веса 4 и выше?
Данная аттестационная работа может служить пособием для изучающих основы теории кодирования.
1. Robert H. Morelos-Zaragoza, «The Art of Error Correcting Coding», Wiley, 2002.
2. Ben Cooke, «Reed_Muller Error Correcting Codes».
3. William J. Gilbert, W. Keith Nicholson, «Modern algebra with applications», 2nd ed, Wiley, 2004.
4. М. Н. Аршинов, Л. Е. Садовский, «Коды и математика (рассказы о кодировании)», М.: Наука, 1983. – 144с.
5. Лидовский В. В., «Теория информации», М.:2003. – 112с.
[1] Назначение тех или иных методов можно найти в разделе «Описание модулей», а также в комментариях к исходному коду проекта Magic Coder.