Прямое исправление ошибок с использованием коррекции стирания Рида-Соломона
У меня есть задача кодирования и декодирования некоторых байтов звука с использованием метода контрольной суммы четности и коррекции стирания Рида-Соломона. Я выполнил кодирование для первого метода (контрольной суммы четности), но мне нужна помощь для завершения второго метода, который является обнаружением с помощью коррекции стирания Рида-Соломона.
Насколько я знаю, код 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 ответа
В настоящее время в Викиверситете есть хороший учебник, в котором подробно описывается, как обрабатывать как стирания, так и ошибки.
Вот схема того, что вам нужно реализовать для процесса декодирования стираний:
- Вычислить синдромы. Затем проверьте, все ли это 0 коэффициентов, сообщение не нуждается в исправлении, иначе продолжите.
- Вызовите алгоритм Форни с синдромом и позициями стирания в качестве входных данных для вычисления полинома величины стирания (т. Е. Значений, которые нужно вычесть из полинома сообщения, чтобы получить исходное сообщение обратно).
- вычитать
message - erasure_magnitude_polynomial
восстановить исходное сообщение (если оно находится в пределах синглтона).
Помимо алгоритма Форни, который может быть немного сложным, все остальные части очень просты и понятны. Действительно, самые сложные части, такие как алгоритм Берлекампа-Мэсси и поиск Чиена, необходимы только тогда, когда вы хотите декодировать ошибки, а вычисление синдромов Форнея необходимо только в том случае, если вы хотите исправить как стирания, так и ошибки (т.е. ошибки), хотя я Я читал статью, в которой описывается, что вычисление синдромов Форнея можно обойти, но я никогда не видел такого кода.
Вы можете взглянуть на мою C-реализацию RS(255,255-k), которая доступна на моей домашней странице.
Он обрабатывает как ошибки, так и стирания и исправляет любые байтовые шаблоны ошибок / стираний, ограниченные:
(2 * errorCount + erasureCount) <= k.