|
|
  |
Процедура Ченя на ПЛИС |
|
|
|
Dec 20 2011, 08:32
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 28-10-11
Из: Москва
Пользователь №: 68 022

|
Цитата(barabek @ Dec 16 2011, 01:32)  Да, если длина пакета у Вас 2048 (максимальная для 11 степени), то так и есть. Длина пакета в общем случае может быть и меньше. Количество тактов равно длине пакета. Просто для укороченного пакета инициализация посложней. Подскажите, а как поступать с укороченным кодом
|
|
|
|
|
Dec 21 2011, 23:22
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Цитата(Gold777 @ Dec 20 2011, 18:32)  Подскажите, а как поступать с укороченным кодом При укороченном пакете подразумевается, что все старшие члены нулевые и в них не может быть ошибки (если это не так, а это может быть только при количестве ошибок больше допустимого для выбранного количества проверочных символов, то это только на руку - повышается вероятность обнаружения неисправимой ошибки). Следовательно эти старшие члены можно быстро обсчитать и начать процедуру Ченя с нужной позиции. Если для полной длины начальным состоянием регистров были коэффициенты полинома lambda[n], то с укороченным lambda[n]*alfa {(LENGTHFULL-PACKLENGTH)*n}%( LENGTHFULL-1) где LENGTHFULL - 2 width (при 11-битном символе =2048) PACKLENGTH- реальная длина пакета. К примеру у Вас длина пакета 2037, на 10 меньше максимальной длины для 11-битного символа. Тогда для старшего члена многочлена lambda в степени 8 необходимо инициализировать регистр lambda[8]*alfa 10*8=lambda[8]*alfa 80 , для члена со степенью 7 lambda[7]*alfa 70 и т.д.
|
|
|
|
|
Dec 22 2011, 04:34
|

Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 7-12-05
Из: 77
Пользователь №: 11 952

|
Цитата(des00 @ Dec 22 2011, 07:53)  Чую следующий вопрос будет про мягкое декодирование кодов БЧХ. Вот так общими усилиями и разработаем 3 велосипеда, и будет нам высокоплачиваемое счастье! На то и форум =)
--------------------
Не, ну наболело, капитан - он выступает как директор пляжа, посол! (с) Ширли-Мырли
|
|
|
|
|
Dec 23 2011, 09:41
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 28-10-11
Из: Москва
Пользователь №: 68 022

|
Цитата(barabek @ Dec 22 2011, 02:22)  При укороченном пакете подразумевается, что все старшие члены нулевые и в них не может быть ошибки (если это не так, а это может быть только при количестве ошибок больше допустимого для выбранного количества проверочных символов, то это только на руку - повышается вероятность обнаружения неисправимой ошибки). Следовательно эти старшие члены можно быстро обсчитать и начать процедуру Ченя с нужной позиции. Если для полной длины начальным состоянием регистров были коэффициенты полинома lambda[n], то с укороченным lambda[n]*alfa{(LENGTHFULL-PACKLENGTH)*n}%( LENGTHFULL-1)
где LENGTHFULL - 2 width (при 11-битном символе =2048) PACKLENGTH- реальная длина пакета.
К примеру у Вас длина пакета 2037, на 10 меньше максимальной длины для 11-битного символа. Тогда для старшего члена многочлена lambda в степени 8 необходимо инициализировать регистр lambda[8]*alfa10*8=lambda[8]*alfa80 , для члена со степенью 7 lambda[7]*alfa70 и т.д. Большое спасибо за подробный и понятный ответ.
|
|
|
|
|
Dec 26 2011, 07:50
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 28-10-11
Из: Москва
Пользователь №: 68 022

|
Цитата(barabek @ Dec 15 2011, 14:36)  Я же Вам посоветовал литературу. Смотрим на рисунок. Не 8 раз, а в каждом такте предыдущее содержание регистра умножается на alfa^8 , т.е. на константу. Понятное дело, что 7 умножителей нужно для каждого члена полинома, кроме члена с нулевой степенью. Но результат в каждом такте. Может это очевидно, но на всякий поясню. Возьмем Ваш старший член полинома 838*x^8. Подставляем в него альфа. 838*alfa*alfa*....*alfa=838*(alfa^8)=X1. На следующем такте нужно подставить вместо x alfa^2. Получаем 838*alfa^2*alfa^2*....*alfa^2=838*(alfa^16)=(838*(alfa^8))*alfa^8=X1*alfa^8=X2. Ну и так со всеми остальными степенями. Параллельно для всех членов полинома. Ага? Вроде все получилось. Нахожу корни уравнения. По теории обратные корни уравнения должны показывать позиции ошибок. А у меня получается, что найденные корни соответствуют позициям ошибок и обратные корни вообще мне не нужны. Вносил ошибки в сигнал и сравнивал с сигналом без ошибок, вот такую закономерность и увидел. Что может быть не так?
Сообщение отредактировал Gold777 - Dec 26 2011, 07:51
|
|
|
|
|
Dec 27 2011, 10:49
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 28-10-11
Из: Москва
Пользователь №: 68 022

|
Цитата(des00 @ Dec 26 2011, 11:41)  все так, в процедуре ченя поиск идет в обратном порядке, поэтому и не нужно обращение и все получается на лету. неплохо это объяснено в книге Кларка "Кодирование с исправлением ошибок" Что значит поиск идет в обратном порядке? Я последовательно подставляю alfa, alfa^2,alfa^3 и так далее в ключевое уравнение. В теории, если к примеру подставим alfa и ключевое уравнение обратится в ноль, то позицией ошибки будет обратный элемент поля. А у меня получается, что корни уравнения это и есть обратные корни. Если возможно, объяните где я ошибаюсь?
|
|
|
|
|
Dec 27 2011, 12:41
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(Gold777 @ Dec 27 2011, 05:49)  Что значит поиск идет в обратном порядке? Я последовательно подставляю alfa, alfa^2,alfa^3 и так далее в ключевое уравнение. В теории, если к примеру подставим alfa и ключевое уравнение обратится в ноль, то позицией ошибки будет обратный элемент поля. А у меня получается, что корни уравнения это и есть обратные корни. Если возможно, объяните где я ошибаюсь? на скриншоте же написано %)? по тексту "Возможные положения ошибок проверяются последовательно с индекса n-1. Суммируя величины на выходе регистра в момент i, проверяем, выполнено ли равенство L(alpha^-i) == 0". Этот алгоритм основан на модульности арифметики в полях галуа и определении свойства поля о существовании обратного элемента по умножению. В вашем случае элементом обратным к элементу alpha^1 будет alpha^(n-1). Поэтому и не требуется отдельного обращения. Код alpha*inv(alpha) = 1 alpha^1*alpha^(n-1) = alpha^(1 + n - 1)%n = alpha^(n%n) = alpha^0 = 1
--------------------
|
|
|
|
|
Dec 28 2011, 06:04
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 28-10-11
Из: Москва
Пользователь №: 68 022

|
Цитата(des00 @ Dec 27 2011, 15:41)  на скриншоте же написано %)? по тексту "Возможные положения ошибок проверяются последовательно с индекса n-1. Суммируя величины на выходе регистра в момент i, проверяем, выполнено ли равенство L(alpha^-i) == 0". Этот алгоритм основан на модульности арифметики в полях галуа и определении свойства поля о существовании обратного элемента по умножению. В вашем случае элементом обратным к элементу alpha^1 будет alpha^(n-1). Поэтому и не требуется отдельного обращения. Код alpha*inv(alpha) = 1 alpha^1*alpha^(n-1) = alpha^(1 + n - 1)%n = alpha^(n%n) = alpha^0 = 1 Понял. Спасибо.
|
|
|
|
|
Jan 10 2012, 15:26
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 28-10-11
Из: Москва
Пользователь №: 68 022

|
[/quote] По ходу дела возникло несколько вопросов по данной теме: 1) Код исправляет 8 ошибок. К примеру, для какого-то кодового слова получился полином локаторов ошибок 4-й степени. Т.е. по теории в кодовом слове возникло 4 ошибки. Посчитав для этого КС корни по процедуре Ченя у меня количество корней получается меньше степени полинома локаторов ошибок (к примеру 2 корня) и декодер рапортует об обнаружении неисправимой ошибки. Подскажите возможна ли такая ситуация или я где-то ошибаюсь?
2) Код исправляет 8 ошибок, значит обнаружить может 16. Про ошибки которые исправляются все понятно, определяются по степени полинома локаторов и им же ограничиваются т.е. для 8 ошибок 8-я степень. Я если к примеру у меня 13 ошибок, то, что произошла неисправимая ошибка я пойму в процедуре Ченя, увидив, что кол-во корней меньше степени полинома локаторов. Вопрос, как я обнаружу, что произошло именно 13 ошибок, а не 9 к примеру?
|
|
|
|
|
Jan 10 2012, 23:12
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Цитата(Gold777 @ Jan 11 2012, 01:26)  По ходу дела возникло несколько вопросов по данной теме: 1) Код исправляет 8 ошибок. К примеру, для какого-то кодового слова получился полином локаторов ошибок 4-й степени. Т.е. по теории в кодовом слове возникло 4 ошибки. Посчитав для этого КС корни по процедуре Ченя у меня количество корней получается меньше степени полинома локаторов ошибок (к примеру 2 корня) и декодер рапортует об обнаружении неисправимой ошибки. Подскажите возможна ли такая ситуация или я где-то ошибаюсь?
2) Код исправляет 8 ошибок, значит обнаружить может 16. Про ошибки которые исправляются все понятно, определяются по степени полинома локаторов и им же ограничиваются т.е. для 8 ошибок 8-я степень. Я если к примеру у меня 13 ошибок, то, что произошла неисправимая ошибка я пойму в процедуре Ченя, увидив, что кол-во корней меньше степени полинома локаторов. Вопрос, как я обнаружу, что произошло именно 13 ошибок, а не 9 к примеру? 2)никак. Да и какая Вам разница если ошибки все равно не исправить? 1)Да вроде правильно рассуждаете. А вообще просто промоделируйте свой декодер и сомнения в его работоспособности отпадут. Еще добавлю. Я когда свой делал, то тестбенч писать влом было. Поэтому сделал интерфейс своего модуля схожим с таким от альтеровского модуля. Сгенерил мегавизардом альтеровский модуль с такими же как у меня параметрами и его тестбенч использовал для проверки своего декодера. Хотя он и не очень то и хорош. Я ожидал от такой конторы более детального теста. Проверка исправляющих и обнаруживающих свойств нормальная, а вот проверка (не знаю как правильно выразиться) соответствия интерфейса на взаимодействие с внешними устройствами никакущая. Я поэтому некоторые ошибки свои не сразу словил.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|