Перейти к содержанию

    

Мягкое декодирование кода Голея (24, 12, 8)

@gegel

Первое, что бросается в глаза, - генерация шума. Он у вас не гауссов. Для гауссова в примитивном случае нужно сложить 12 значений, из которых по 6 разного знака.

Кроме того, попробуйте свести отношение сигнал/шум от несколько абстрактных процентов, хотя по ним можно судить про общую картину, к Eb/N0.

Сложно сравнивать полученные результаты по сравнению с известными, когда различны исходные параметры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 hour ago, Grizzly said:

@gegel

 Он у вас не гауссов. Для гауссова в примитивном случае нужно сложить 12 значений, из которых по 6 разного знака.

Кроме того, попробуйте свести отношение сигнал/шум от несколько абстрактных процентов, хотя по ним можно судить про общую картину, к Eb/N0.

Я как раз об этом думал, но не знаю, как сделать верно.

Допустим, я имею биты, промодулированные значениями 63 / -63

Я так понимаю, к каждому значению надо добавить шум в виде результата какой-то функции.  Аргументом функции будет Eb/N0 в dB. Сама функция будет использовать rand(), возвращающую число 0-32767 с равномерным распределением вероятности.

Как математически эту функцию реализовать? Большой точности моделирования в данном случае не требуется, только для беглой оценки результата.

Или, по возможности, дайте ссылку на готовое решение, или хотя бы на понятный источник.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 hours ago, gegel said:

У нас была похожая ситуация. Вышли так: берем результат работы rand и вычитаем из него математическое ожидание процесса. Т.е. например, для 0...255 получаем -127...+127. Суммируем с предыдущим. Повторяем чем больше - тем лучше. Первое значение выходного процесса, у которого будет Гауссово распределение с нулевым математическим ожиданием получено. Продолжаем действия до получения необходимого количества отсчетов. В результате - вполне приличный Гаусс.  На него работает центральная предельная теорема...

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С Гауссом теперь понятно. Остался вопрос об аргументе в виде Eb/No в dB.

Я так понимаю, от него должно определенным образом зависеть максимальное значение M, выдаваемое rand (т.е. rand()%M, в примере выше это 255 и М=256).

Какой должна быть эта зависимость (M от Eb/No) для фиксированного значения модулированных битов (например, 63/-63)? 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
12 hours ago, gegel said:

С Гауссом теперь понятно. Остался вопрос об аргументе в виде Eb/No в dB.

Я так понимаю, от него должно определенным образом зависеть максимальное значение M, выдаваемое rand (т.е. rand()%M, в примере выше это 255 и М=256).

Какой должна быть эта зависимость (M от Eb/No) для фиксированного значения модулированных битов (например, 63/-63)? 

 

Простите, но у гауссова процесса не может быть никакого максимального значения просто по определению. Проще говоря, никакой выброс не запрещен, но вероятность его появления тем меньше, чем больше его отклонение от сигмы. И вероятность эта может быть сколь угодно малой, но никогда не нулевой. Именно это и позволило Галлахеру сказать:" ...гауссов процесс настолько дикий, что в нем возможно абсолютно все" (цит. по памяти). 

В случае синтеза с помощью критериев центральной предельной теоремы максимальный выброс можно полагать равным сумме максимальных значений процессов, которые участвовали в генерации гауссова сигнала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
11 hours ago, Милливольт said:

Простите, но у гауссова процесса не может быть никакого максимального значения просто по определению.

Это понятно, и все хорошо в теории. Но мне, как программисту, все равно придется делать сатурацию в пределах битового размера мягкого значения. И реальный код никогда не будет идеальной моделью, хотя может как угодно близко к ней стремиться.

 

Вообщем,  переделал генератор шума, для генерации каждого мягкого  бита используя сумму 6 положительных и 6 отрицательных rand, равномерно распределенных в диапазоне -16383 до 16383.Затем перевожу в double и умножаю на эмпирический коэффициент, получаю R.  Это будет шум, приведенный к определенной энергии.  Полученное значение R суммирую с битом (63.0/-63.0), округляю до ближайшего целого, выполняю сатурацию до -256 256.  

Кроме того, беру квадрат от R и суммирую в аккумулятор.  По окончании генерации всех 24 битов делю сумму в аккумуляторе на 24, и затем считаю соотношение 63*63 к сумме в аккумуляторе. Я так понимаю, это будет соотношение энергии сигнала к шуму. 

В итоге усредняю это значение во всех итерациях теста, затем перевожу в dB. Так как у нас модуляция бинарная, то это и будет Eb/No. Кроме того, в тесте считаю входной и выходной BER в процентах, побитно  сравнивая исходное кодовое слово и жесткое решение модулированного (это будет исходная BER), а также исходное и жесткое решение декодированного (это будет результирующая BER). По полученному BER, сравнивая его со списком исходного BER, определял результат в Eb/No (не знаю, можно ли, но другого пути не увидел). Таким образом вычислял усиление декодера в dB.

Прошу подсказать, верно ли я делаю и поправить, если где-то фундаментально ошибаюсь.

Также добавил в декодер режим 4, исправляющий до 7 ошибок, и улучшил режим 3 (для 6 ошибок). На быстродействие это практически не повлияло, т.к. у меня Golay(24,12) и есть контрольный бит, и к тому же после первичного жесткого декодирования можно определить, сколько предположительно ошибок, так что все варианты перебирать не приходится. Понимаю, что это можно делать математически, исходя из кода Голея. но я сделал эмпирически, предварительно прогнав статистику - так меньше напряга для мозга :)

Код в аттаче, там же тест-файл с main.c и текстовый файл с выдачей значений пошагового приращения Eb/No, исходного и полученного BER во всех режимах.

 

Вкратце, результаты режима 4 где-то такие:

Исходный Eb/No,dB   Полученный Eb/No, dB       Прирост Eb/No   Исходный  BER,%   Полученный BER,%

        2.96 dB                          8.30 dB                         +5.34 dB                7.89 %                     0.37 %

        1.58 dB                          5.77 dB                         +4.19 dB                11.48 %                   2.51 %

        0.78 dB                          3.80 dB                         +3.02 dB                13.73 %                   5.97 %            

Если методика верна, прошу как-то интерпретировать результат.

 

 

 

  

 

 

 

 

soft_golay1.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 hour ago, gegel said:

Если методика верна, прошу как-то интерпретировать результат.  

 

Quote

Боюсь, здесь ничего не смогу сказать... Вероятно, коллеги "в теме" помогут.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Провел дополнительное тестирование с другим генератором случайного числа с Гауссовым распределением, взятым с чужого кода тестирования мягкого BCH (код генератора и результаты во вложении). Результаты сходные, но все же есть небольшие отличия: в области малых и больших BER (наклон кривой чуть другой). Таки от типа шума зависимость весьма выражена.  Также поискал на предмет чужих графиков зависимости BER от Eb/No для когерентной OOK. Найденные графики очень близки к моим, так что проведенный тест вроде  как верный.

Проверил реальное быстродействие на Cortex M4 SM32F446RE на 180 MHz, компилятор Keil5 (ARMCC), оптимизация -03 + по скорости, выполнение во flash. оценивал по тактам процессора, необходимым для процедуры soft_decode при различных уровнях шума.

В режиме 0 ( однократное жесткое декодирование) при отсутствии шума (тест 0) длительность составила  в среднем 641 такт. При наличии шума скорость снижалась в:

- тест 1 (Eb/No=6.54dB, исходная  BER=1.63%) - в 1.05 раза;

- тест 2 (Eb/No=2.89dB, исходная  BER=8.07%) - в 1.32 раза;

- тест 3 (Eb/No=0dB, исходная  BER=16.30%) - в 1.53 раза;

 

В режимах 1-3 сравнение проводилось с режимом 0 при одинаковых уровнях Eb/No. Коэффициент замедления составил:

                 режим 1 (4 ошибки)      режим 2 (5 ошибок)    режим 3 (6 ошибок)      режим 4 (7 ошибок)

тест 0:               1.12                              1.12                                1.12                              1.12           

тест 1:               1.28                              1.43                                3.17                              3.27

тест 2:               3.25                              8.95                                23.3                              24.4

тест 3:               4.54                              14.9                                34.0                              37.0

 

Таким образом, скорость "мягкого" алгоритма по сравнением с "жестким" больше уменьшалась на высоких BER, и при самых неблагоприятных условиях (сплошной шум в режиме 4, исправление до 7 ошибок), мягкий алгоритм выполнялся в среднем в 37 раз медленнее жесткого.

 

У кого есть своя реализация "мягкого" Голея, прошу сравнить результаты.

 

rnd.c

result1.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Вы сняли бы лучше кривые кодирования на наборе 1е8, они лучше воспринимаются. И до 1е-6...1е-7 будут более менее адекватные измерения.

2. По генератору шума, если штатного генератора гаусова шума нет, то я предпочитаю генератор Box-Mulller, гаусов шум на основе центральной предельной теоремы дает белый шум в узкой полосе и не совсем адекватно показывает.

3. Надеюсь вы учитываете что SNR = EbNo + 10*log10(bps*coderate). И при добавлении шума вам нужно измерить мощность сигнала (либо использовать ее нормированную), посчитать мощность шума по выборке, потом посчитать SNR/EbNo. Либо идти от противного. Задать EbNo, из него определить мощность шума и добавить именно столько шума, скольно нужно.

4. Ну и BER считается по систематической части кода.

5. Квантование 12 бит, в вашем случае совершенно излишне. 8 бит на метрику, вам более чем) думаю даже 4-6 хватило, но у вас проц)

6.кривая кодирования, снятая по 1е7 битам для расширенного голея, алгоритм чейза на 16 кандидатов, Размер метрики 4 бита. ber - остаточный бер, fer - ber по входу, оцененный по статистике работы декодера

# EbNo = 3.000000: ber = 7.158103e-003. fer = 7.836428e-002
# EbNo = 3.500000: ber = 3.475901e-003. fer = 6.713008e-002
# EbNo = 4.000000: ber = 1.464101e-003. fer = 5.642952e-002
# EbNo = 4.500000: ber = 5.773002e-004. fer = 4.651092e-002
# EbNo = 5.000000: ber = 2.032001e-004. fer = 3.762707e-002
# EbNo = 5.500000: ber = 5.950002e-005. fer = 2.982301e-002
# EbNo = 6.000000: ber = 1.320001e-005. fer = 2.302421e-002
# EbNo = 6.500000: ber = 1.600001e-006. fer = 1.726961e-002
# EbNo = 7.000000: ber = 1.000000e-007. fer = 1.255706e-002
# EbNo = 7.500000: ber = 0.000000e+000. fer = 8.826504e-003
# EbNo = 8.000000: ber = 0.000000e+000. fer = 6.001752e-003
# EbNo = 8.500000: ber = 0.000000e+000. fer = 3.888052e-003
# EbNo = 9.000000: ber = 0.000000e+000. fer = 2.415401e-003
# EbNo = 9.500000: ber = 0.000000e+000. fer = 1.408751e-003

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Меня больше интересуют итоговые уровни BER около 1% при высоких входных (для моей задачи). Сейчас попробую сравнить по ber с вашей таблицей, т.к. похоже, EbNo я неверно считал. Да и BER можно оценить в реальном тесте. 

ПС: в моем логе вместо SN надо подразумевать EbNo,т огда входной BER совпадает. А сколько раз в среднем на одно декодированиеваш Чейз на 16 кандидатов вызывает жесткий алгоритм?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
10 minutes ago, gegel said:

Меня больше интересуют итоговые уровни BER около 1% при высоких входных (для моей задачи). Не могли бы Вы добавить в вашу таблицу входные уровни BER: все же эту величину легко замерить в отличие от Eb/No?

 

 

fer это практически они и есть) корка выложена, если с верилогом дружите, можете тестбенч переделать как хотите) и декодеры членомерятся именно на основе EbNo. Из этой величины считается все остальное  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока правил свой пост , Вы уже ответили. И все же: сколько раз у Вас вызывается жесткий алгоритм в варианте с 16 ю кандидатами?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 hour ago, gegel said:

Пока правил свой пост , Вы уже ответили. И все же: сколько раз у Вас вызывается жесткий алгоритм в варианте с 16 ю кандидатами?

у меня же плис, декодирование 1 такт + 2 такта латентности, посчитать вес слова 1 такт + 5 тактов латентности и т.д. декодер вызывается 17 раз. декодирует на лету

1 hour ago, gegel said:

ПС: в моем логе вместо SN надо подразумевать EbNo,т огда входной BER совпадает. А сколько раз в среднем на одно декодированиеваш Чейз на 16 кандидатов вызывает жесткий алгоритм?

 

там пересчет SNR в EbNo. Я приводил формулу. по началу тоже не правильно интерпретировал результаты. Пока не разобрался в этом вопросе. EbNo - энергия приходящаяся на информационный бит относительно плотности шума. А вот модуляция, кодирование накладывается уже потом. Это позволяет сравнивать разные коды и модуляции между собой.

 

ЗЫ. Еще рекомендую вам, взять матлаб. там есть инструмент bertool. В нем можно построить кривые кодирование для сырых данных и жесткого голея. Это позволит вам привязать свои тесты относительно эталонных. Там точно ошибки нет)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация