|
|
  |
Коды БЧХ, Вопросы по алгоритмам декодирования |
|
|
|
Oct 5 2010, 12:22
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(des00 @ Oct 5 2010, 00:15)  UPD. Конечно можно сгенерить всё в матлабе и копипастом перенести в код. Но интересно написать функции генерации кода БЧХ на SV, которые будут определять всю структуру (все функции кроме генерации генераторного полинома на SV есть и работают, ква таки сила), чтобы не зависеть ни от каких генераторов. сорцы выложены тут автоматическое определение генераторного полинома еще не допилил %) Цитата(SKov @ Oct 5 2010, 04:38)  Спасибо. Извините, забыл про ваш вопрос. Интересующие Вас минимальные многочлены можно взять из таблицы в конце книжки Питерсона и Уэлдона. Она есть в и-нете. вот что странно, в Си коде, который я приводил функция генерации генераторного полинома CODE void gen_poly() /* * Compute the generator polynomial of a binary BCH code. Fist generate the * cycle sets modulo 2**m - 1, cycle[][] = (i, 2*i, 4*i, ..., 2^l*i). Then * determine those cycle sets that contain integers in the set of (d-1) * consecutive integers {1..(d-1)}. The generator polynomial is calculated * as the product of linear factors of the form (x+alpha^i), for every i in * the above cycle sets. */ { register int i, ii, jj, ll, kaux; register int test, aux, nocycles, root, noterms, rdncy; int cycle[1024][21], size[1024], min[1024], zeros[1024];
/* Generate cycle sets modulo n, n = 2**m - 1 */ cycle[0][0] = 0; size[0] = 1; cycle[1][0] = 1; size[1] = 1; jj = 1; /* cycle set index */ if (m > 9) { printf("Computing cycle sets modulo %d\n", n); printf("(This may take some time)...\n"); } do { /* Generate the jj-th cycle set */ ii = 0; do { ii++; cycle[jj][ii] = (cycle[jj][ii - 1] * 2) % n; size[jj]++; aux = (cycle[jj][ii] * 2) % n; } while (aux != cycle[jj][0]); /* Next cycle set representative */ ll = 0; do { ll++; test = 0; for (ii = 1; ((ii <= jj) && (!test)); ii++) /* Examine previous cycle sets */ for (kaux = 0; ((kaux < size[ii]) && (!test)); kaux++) if (ll == cycle[ii][kaux]) test = 1; } while ((test) && (ll < (n - 1))); if (!(test)) { jj++; /* next cycle set index */ cycle[jj][0] = ll; size[jj] = 1; } } while (ll < (n - 1)); nocycles = jj; /* number of cycle sets modulo n */
/* printf("Enter the error correcting capability, t: "); scanf("%d", &t); */ t = 3;
d = 2 * t + 1;
/* Search for roots 1, 2, ..., d-1 in cycle sets */ kaux = 0; rdncy = 0; for (ii = 1; ii <= nocycles; ii++) { min[kaux] = 0; test = 0; for (jj = 0; ((jj < size[ii]) && (!test)); jj++) for (root = 1; ((root < d) && (!test)); root++) if (root == cycle[ii][jj]) { test = 1; min[kaux] = ii; } if (min[kaux]) { rdncy += size[min[kaux]]; kaux++; } } noterms = kaux; kaux = 1; for (ii = 0; ii < noterms; ii++) for (jj = 0; jj < size[min[ii]]; jj++) { zeros[kaux] = cycle[min[ii]][jj]; kaux++; }
k = length - rdncy;
if (k<0) { printf("Parameters invalid!\n"); // exit(0); return ; }
printf("This is a (%d, %d, %d) binary BCH code\n", length, k, d);
/* Compute the generator polynomial */ g[0] = alpha_to[zeros[1]]; g[1] = 1; /* g(x) = (X + zeros[1]) initially */ for (ii = 2; ii <= rdncy; ii++) { g[ii] = 1; for (jj = ii - 1; jj > 0; jj--) if (g[jj] != 0) g[jj] = g[jj - 1] ^ alpha_to[(index_of[g[jj]] + zeros[ii]) % n]; else g[jj] = g[jj - 1]; g[0] = alpha_to[(index_of[g[0]] + zeros[ii]) % n]; /* printf("Generator polynomial:\ng(x) = "); for (i = 0; i <= 31; i++) { printf("%d", g[i]); } printf("\n"); */ } printf("Generator polynomial:\ng(x) = "); for (ii = 0; ii <= rdncy; ii++) { printf("%d", g[ii]); if (ii && ((ii % 50) == 0)) printf("\n"); } printf("\n"); }
явно показывает что никакие таблицы не используются. Все вычисления производятся на лету. Надо будет еще раз к ней подойти до полной ясности %)
--------------------
|
|
|
|
|
Oct 5 2010, 12:27
|
Знающий
   
Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119

|
Цитата(vadimuzzz @ Oct 5 2010, 15:51)  в нашей стране проще ознакомиться с трудами IEEE, чем увидеть журналы типа того, что вы указали В 95-м году это было не так. Надо было одинаково идти в крупную библиотеку какого-нибудь крупного города. Это не журнал, это тезисы докладов научной конференции. Сейчас их не стоит и смотреть, поскольку прошло 15 лет, там все устарело. Это интересно разве что с точки зрения истории и приоритетов.
|
|
|
|
|
Nov 2 2010, 11:23
|
Группа: Новичок
Сообщений: 4
Регистрация: 28-01-10
Пользователь №: 55 123

|
А кто-нибудь сталкивался с алгоритмом на основе матрицы Вандермормонда? Мне он показался более практичным чем Форни для малых значений ошибок, но разобраться с ним у Сарагосы у меня не получилось.
|
|
|
|
|
Jan 19 2011, 09:57
|
Профессионал
    
Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942

|
Цитата(des00 @ Oct 4 2010, 16:34)  ЗЫ. Мне сильно желательно диагностика такой ситуации для канала без явной синхронизации. Чтобы лучше работала система синхронизации. Подобное я делал на корке RS, но никогда не задумывался, до сего момента, что decfailed корки мне врал %( Ув. des00, Вы обеспечиваете синхронизацию декодера по доминирующим нулевым синдромам? Или я не в ту степь?! Цитата(Mikhalych @ Sep 28 2010, 16:02)  нет - всё на логике и сдвиговых регистрах Буфер принятого слова для ожидания декодирования тоже на регистрах или в нем нет необходимости?
|
|
|
|
|
Jan 21 2011, 13:19
|
Профессионал
    
Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942

|
Цитата(des00 @ Jan 21 2011, 11:43)  да именно так, но такое хорошо работает только на декодерах с большой исправляющей способностью (1/2, 3/4, 5/6, 7/8, 9/10) и большим размером блока. Для сабжевого конкретного случая я перешел на синхронизацию по шапочке. Спасибо. Знакомы ли Вы с многочисленными статьями а-ля «blind frame synch. of BCH»? В большинстве статей для синхронизации предлагается parity check matrix. Пытаюсь разобраться в особенностях популярных алгоритмов  Цитата(Mikhalych @ Sep 28 2010, 10:26)  Недавно сам занимался аппаратной реализацией такого декодера... ... 8 - готовая прожка кодирования/декодирования от микрона (по ней я отлаживался) Правильно ли я понимаю, что программа использует исключительно укороченные коды? (”Number of data bits to be encoded. Must divide 4.“) Что кажется логичным, т.к. программа реализует защиту флеш-памяти.
|
|
|
|
|
Jan 22 2011, 21:12
|
Профессионал
    
Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942

|
Хорошо. Итак. Архив содержит следующие документы: Blind Frame Synchronization For Block Code.pdf Blind Frame Synchronization And Phase Offset Estimation For Coded Systems.pdf Blind Frame Synchronization For Error Correcting Codes Having a Sparse Parity Check Matrix.pdf Blind frame synchronization of product codes based on the adaptation of the parity check matrix.pdf Blind Frame Synchronization of Reed-Solomon Codes.pdf Blind Frame Synchronization on Gaussian Channel.pdf
Blind_Frame_Synchronization.rar ( 1.37 мегабайт )
Кол-во скачиваний: 161Кое-что вынес за скобки. В принципе всё есть в инете. Из того, что очень интересно, но найти не удалось. http://elibrary.ru/item.asp?id=11532386Приведен пример реализации кодовой цикловой синхронизации для каскадного кода БЧХ(31,16) - - Рида-Соломона(32,16), обеспечивающего надежную синхронизацию в канале связи с вероятностью ошибки до 10^-1.http://elibrary.ru/item.asp?id=11520710Методы кодовой цикловой синхронизации и их применение для передачи сообщений в каналах связи с вероятностью ошибки до 10^-1
|
|
|
|
|
Jan 12 2012, 06:46
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(petrov @ Oct 4 2010, 10:54)  Хотя бы мягкое декодирование БЧХ по алгоритму Чейза используйте. Цитата(SKov @ Oct 4 2010, 12:59)  Конечно, и в этом случае можно использовать декодер БЧХ для ДСК, применяя алгоритмы Чейза или декодирование по МОР (Форни.) Но много там не получишь (обычно в пределах 1.5...2 дБ дополнительного выигрыша к ЭВК дискретного канала). Но для длин <100 это все равно надо делать и это будет хорошо. Нашел время вернуться к БЧХ кодам и алгоритму Чейза. Есть несколько вопросов : 1. в книге Кларка, при описании алгоритма Чейза он пишет : Цитата Метод 2: взять в качестве векторов 1 множество из 2^d/2 векторов, имеющих всевозможные символы на d/2 наименее достоверных позициях и нулевые символы на остальных. Но нигде в книге нет ни слова, как определить какие символы наименее достоверные. Неужели предполагается выделять достоверность символов с помощью сравнения их квантованных амплитуд, считая что чем больше амплитуда (например для BPSK) тем символ достовернее ? 2. В разделе "8.1.3. Системы, использующие код Рида—Соломона и короткий блоковый код". Неужели такие системы использовались/используются? Всегда считал что наиболее подходящими для каскада являются блоковый и сверточные коды. 3. Прочитал у него же про многопороговое декодирование блоковых кодов. Правильно ли я понял, что при использовании того же БЧХ (15,5,7) и многопорогового декодера с мягким решением, выигрыш от кодирования будет больше чем при использовании арифметического БЧХ с Чейзом ? Спасибо.
--------------------
|
|
|
|
|
Jan 12 2012, 14:39
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 28-10-11
Из: Москва
Пользователь №: 68 022

|
Цитата(des00 @ Oct 1 2010, 10:40)  либо я тупой, либо одно из двух  в статьях выложенных выше приведены 4 варианта алгоритма SiBM. Но все они разные. В целях пристрелки реализовал один в один 3 штуки ни один не работает(причем в одном алгоритме была ошибка). Детальное исполнение алгоритма на бумажке показывает что косяков в реализации нет, но алгоритм не работает %) Может быть у кого нить есть статья с описанием SiBM который приведен без ошибок? Спасибо. Возникла та же проблема. Реализовал SiBM, вношу одну ошибку в КС. А декодер показывает что их две (вычисления приводят к полиному локаторов 2-й степени, Ченя соответственно решает и находит 2 корня). Считаю на бумаге все получается. Может где в алгоритме ошибка?
|
|
|
|
|
Jan 13 2012, 05:57
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(petrov @ Jan 12 2012, 03:28)  Да. нда, все оригинальное просто Цитата(Gold777 @ Jan 12 2012, 09:39)  Возникла та же проблема. Реализовал SiBM, вношу одну ошибку в КС. А декодер показывает что их две (вычисления приводят к полиному локаторов 2-й степени, Ченя соответственно решает и находит 2 корня). Считаю на бумаге все получается. Может где в алгоритме ошибка?
все алгоритмы в статьях рабочие, отличия только в деталях/индексах и т.д. реализации для плис всех этих алгоритмов для БЧХ/РС кодов я выкладывал в этой теме.
--------------------
|
|
|
|
|
Jan 13 2012, 09:45
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 28-10-11
Из: Москва
Пользователь №: 68 022

|
Цитата(des00 @ Jan 13 2012, 08:57)  нда, все оригинальное просто все алгоритмы в статьях рабочие, отличия только в деталях/индексах и т.д. реализации для плис всех этих алгоритмов для БЧХ/РС кодов я выкладывал в этой теме. Если я работаю с записанным сигналом, прогоняю его через Моделсим алгоритм работает правильно. Если в реальном времени, вношу к примеру одну ошибку в чистый сигнал находится внесенная ошибка правильно, но помимо нее декодер находит определенную постоянную вторую ошибку на месте на котором ее быть не должно в каждом кодовом слове (соответственно полином локаторов имеет в данном случае вторую степень). Вот собственно такую ситуацию я наблюдаю в SignalTab. Такая же ситуация наблюдается при увеличении числа ошибок. Вот не пойму где ошибка то у меня?
Сообщение отредактировал Gold777 - Jan 13 2012, 09:47
|
|
|
|
|
Jan 16 2012, 09:24
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 28-10-11
Из: Москва
Пользователь №: 68 022

|
Цитата(des00 @ Jan 13 2012, 17:15)  ошибка описания, синтезируемая модель и поведенческая ведут себя по-разному. Спасибо за помощь. Разобрался. Старую таблицу памяти подцепил, в которой ошибка была.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|