Прямое исправление ошибок с использованием коррекции стирания Рида-Соломона

У меня есть задача кодирования и декодирования некоторых байтов звука с использованием метода контрольной суммы четности и коррекции стирания Рида-Соломона. Я выполнил кодирование для первого метода (контрольной суммы четности), но мне нужна помощь для завершения второго метода, который является обнаружением с помощью коррекции стирания Рида-Соломона.

Насколько я знаю, код RS добавляет t символы для k символы данных. Таким образом, он может найти и исправить до t/2 символы или если места ошибок известны, так называемые стирания. Это может исправить до t, Для этой задачи я должен использовать поле Галуа GF (28) для представления каждого символа в виде байта. Операция сложения и вычитания основана на XOR. Таким образом, я должен использовать коды Рида-Соломона, которые могут корректироваться до t=3 подчистки. Вычисление одного кода Рида-Соломона теперь выполняется следующим образом

C0 | C1 |........ | Ck-1 | Ck | Ck + 1 | Ck + 2

поэтому байты кода можно рассматривать как вектор c=[c0,c1,...,ck+2]и один код C вычисляется из k байтов данных следующим образомd=[d0,d1,...,dk-1], так что мой процесс кодирования и декодирования требует следующую матрицу Вандермонда F

1 1 12 13... 1к-11 2 22 23... 2к-1...
1 k + 2 (k + 2)2 (k + 2)3... (k + 2)k-11 k + 3 (k + 3)2 (k + 3)3... (k + 3)k-1

поэтому простое матричное векторное умножение с использованием F & D мы получаем C=F.D,

пока что я сделал для кодирования следующим образом:

#else

void fox_encode(Buffer* bufin, Buffer* bufout, FoxEncData* algorithm_data){

    // Your encoder for Task 2.C.3 goes in here !!!

    while (bufin->size >= 1){
        guint8 databyte = bufin->data[0];       //Pick up a byte from input buffer
        buffer_push_byte (bufout, databyte);    //Send it 3 times
        buffer_push_byte (bufout, databyte);
        buffer_push_byte (bufout, databyte);
        buffer_pop (bufin, 1);                  //Remove it from the input buffer
    }
}

#endif

Мне нужен код, чтобы завершить этот код для кодирования и декодирования моего класса fox_encode и fox_decode с использованием коррекции стирания Рида-Соломона. Любая помощь будет оценена, чтобы выполнить эту задачу как можно скорее.

заранее спасибо

2 ответа

В настоящее время в Викиверситете есть хороший учебник, в котором подробно описывается, как обрабатывать как стирания, так и ошибки.

Вот схема того, что вам нужно реализовать для процесса декодирования стираний:

  1. Вычислить синдромы. Затем проверьте, все ли это 0 коэффициентов, сообщение не нуждается в исправлении, иначе продолжите.
  2. Вызовите алгоритм Форни с синдромом и позициями стирания в качестве входных данных для вычисления полинома величины стирания (т. Е. Значений, которые нужно вычесть из полинома сообщения, чтобы получить исходное сообщение обратно).
  3. вычитать message - erasure_magnitude_polynomial восстановить исходное сообщение (если оно находится в пределах синглтона).

Помимо алгоритма Форни, который может быть немного сложным, все остальные части очень просты и понятны. Действительно, самые сложные части, такие как алгоритм Берлекампа-Мэсси и поиск Чиена, необходимы только тогда, когда вы хотите декодировать ошибки, а вычисление синдромов Форнея необходимо только в том случае, если вы хотите исправить как стирания, так и ошибки (т.е. ошибки), хотя я Я читал статью, в которой описывается, что вычисление синдромов Форнея можно обойти, но я никогда не видел такого кода.

Вы можете взглянуть на мою C-реализацию RS(255,255-k), которая доступна на моей домашней странице.

Он обрабатывает как ошибки, так и стирания и исправляет любые байтовые шаблоны ошибок / стираний, ограниченные:

(2 * errorCount + erasureCount) <= k.

Другие вопросы по тегам