реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> LDPC код из стандарта DVB-S2, BER, отношение сигнал-шум, DVB-S2, LDPC
Vehfl
сообщение Nov 28 2012, 09:37
Сообщение #16





Группа: Участник
Сообщений: 14
Регистрация: 9-11-12
Пользователь №: 74 305



Цитата(slash_spb @ Nov 22 2012, 18:31) *
Алгоритм декодирования MIN-SUM, такой же как в DVB-S2, только нет коррекции. Ну еще он с одним проходом по строкам кодовой матрице. У меня он есть на матлабе, на си нет. Вам исходник нужен, я правильно понял?

Был бы признателен если бы вы предоставили закодированные блоки с исходными сообщениями для нескольких скоростей скажем для 1/2,2/5 и 1/3. У нас есть подозрения на неправильную работу кодера.
Go to the top of the page
 
+Quote Post
slash_spb
сообщение Nov 29 2012, 14:47
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 20-03-06
Пользователь №: 15 425



Цитата(Vehfl @ Nov 28 2012, 12:37) *
Был бы признателен если бы вы предоставили закодированные блоки с исходными сообщениями для нескольких скоростей скажем для 1/2,2/5 и 1/3. У нас есть подозрения на неправильную работу кодера.


Не совсем понял) Вы вроде приводили скрипт в котором можете с легкостью с генерировать нужные кодовые блоки.

Код
function [vHat n] = decodeLogMinSumOffsetSinglePassFpga(rx, H, iteration, beta)

llr_bit_width = 8;

max_val = (2^(llr_bit_width-1))-1;
min_val = -(2^(llr_bit_width-1));

[M N] = size(H);

Lci = rx';

% Initialization
Lrji = zeros(M, N);
Pibetaij = zeros(M, N);

Zn   = Lci;

for n = 1:iteration
  
   Lrji_prev =  Lrji;
  
   betaij  = ( repmat( Zn, M, 1 ).*H - Lrji );
  
   %Limit data by bit width value. Like in fpga.
    for i=1:size(betaij,1)*size(betaij,2)
              
        if (betaij(i) > max_val)
          betaij(i) = max_val;
        end
        
        if (betaij(i) < min_val)
          betaij(i) = min_val;
        end
    end    
  
   %In convertion two's compliment to absolute value
   %didn't add 1 to save some resources
    %for i=1:size(betaij,1)*size(betaij,2)
    %  if ( betaij(i) < 0 )
    %    betaij(i) = betaij(i) + 1;  
    %  end
    %end
  
   betaij  = abs( betaij );
   alphaij = nonzerosign( repmat( Zn, M, 1 ).*H - Lrji );

   % ----- Horizontal and Vertical step -----
   for i = 1:M
      
      % Find non-zeros in the column
      c1 = find(H(i, :));
      
      for k = 1:length(c1)

         % Maximum betaij\c1(k) - beta
         beta_row = betaij(i, c1);
         beta_row(k) = realmax;
         minOfbetaij = min( beta_row ) - beta;
         minOfbetaij = max( [minOfbetaij 0] );
        
         % Multiplication alphaij\c1(k) (use '*' since alphaij are -1/1s)
         prodOfalphaij = prod(alphaij(i, c1))*alphaij(i, c1(k));
        
         % Update L(rji)
         Lrji(i, c1(k)) = prodOfalphaij*( minOfbetaij );
                  
         Zn_inc = Lrji(i, c1(k)) - Lrji_prev(i, c1(k));
        
         if ( Zn_inc  > max_val )
             Zn_inc = max_val;
         end
        
         if ( Zn_inc  < min_val )
             Zn_inc = min_val;
         end
                
         Zn( c1(k) ) = Zn( c1(k) ) + Zn_inc;
        
         if ( Zn( c1(k) ) > max_val )
             Zn( c1(k) ) = max_val;
         end
        
         if ( Zn( c1(k) ) < min_val )
             Zn( c1(k) ) = min_val;
         end
        
      end % for k

   end % for i
  
   %check parity
   if ( n ~= 1 )
     bits = ( nonzerosign( Zn_prev ) - 1 ) / -2;
     if ( sum(mod(H*bits',2)) == 0 )
       break;
     end
   end
  
   Zn_prev = Zn;
end % for n

for i=1:length(Zn)
  if( (Zn(i)) < 0 )
     vHat(i) = 1;
  else
     vHat(i) = 0;
  end
end
%nn = n_last;


Мягкие решения делятся на delta=0.075, beta = 2. Ну этот алгоритм для фиксированной точки с ограничением динамическим диапазоном.
Go to the top of the page
 
+Quote Post
agate
сообщение Nov 30 2012, 02:42
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 19-06-10
Пользователь №: 58 021



А в RTL кто нибудь имеет DVB-S2 декодер?
Go to the top of the page
 
+Quote Post
Vehfl
сообщение Nov 30 2012, 06:54
Сообщение #19





Группа: Участник
Сообщений: 14
Регистрация: 9-11-12
Пользователь №: 74 305



Цитата(slash_spb @ Nov 29 2012, 17:47) *
Не совсем понял) Вы вроде приводили скрипт в котором можете с легкостью с генерировать нужные кодовые блоки.


Спасибо

Думал что может в кодере из matlab тоже ошибка. У вас нету сведений о его правильности?
Go to the top of the page
 
+Quote Post
slash_spb
сообщение Nov 30 2012, 07:42
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 20-03-06
Пользователь №: 15 425



Цитата(Vehfl @ Nov 30 2012, 09:54) *
Спасибо

Думал что может в кодере из matlab тоже ошибка. У вас нету сведений о его правильности?


Думаю в matlab'е с кодированием все правильно, такую бы ошибку быстро нашли бы. Но можно проверить. А по поводу ваших скоростей, кодирование не работает на скоростях где число проверочных бит больше чем число данных. Наверное да, кодер. Хотя алгоритм кодирования в dvb-s2 относительно просто.
Go to the top of the page
 
+Quote Post
Vehfl
сообщение Nov 30 2012, 11:05
Сообщение #21





Группа: Участник
Сообщений: 14
Регистрация: 9-11-12
Пользователь №: 74 305



Цитата(slash_spb @ Nov 30 2012, 10:42) *
Думаю в matlab'е с кодированием все правильно, такую бы ошибку быстро нашли бы. Но можно проверить. А по поводу ваших скоростей, кодирование не работает на скоростях где число проверочных бит больше чем число данных. Наверное да, кодер. Хотя алгоритм кодирования в dvb-s2 относительно просто.

Тогда был бы признателен если вы как-нибудь передали мне блоки закодированные, например на почту. Вы могли бы послать мне их?
Go to the top of the page
 
+Quote Post
slash_spb
сообщение Dec 5 2012, 09:50
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 20-03-06
Пользователь №: 15 425



Цитата(Vehfl @ Nov 30 2012, 14:05) *
Тогда был бы признателен если вы как-нибудь передали мне блоки закодированные, например на почту. Вы могли бы послать мне их?


Хотя я ошибся, кодирование там не простое, т.к. используется ступенчатая матрица. Кодированные блоки вы с легкостью получите в матлабе и они будут правильные, я бы вам их и послал) Скорее всего тот кодек LDPC который вы используете был написан для стандартов WiMAX, WiFi в которых минимальная скорость кодирования 1/2. В стандарте WiMAX описано три алгоритма кодирования, какой-то из них реализован в вашем кодеке. Ну может не в чистом виде, а в адаптированном для DVB-S2. Для меньших скоростей, которые используются в DVB-S2, нужно использовать алгоритм описанный в этом стандарте. Как-то так)

Сообщение отредактировал slash_spb - Dec 5 2012, 09:53
Go to the top of the page
 
+Quote Post
Neznaika
сообщение Jan 20 2014, 09:14
Сообщение #23


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 4-04-07
Пользователь №: 26 768



Не стал открывать новую ветку. Встала задача по реализации LDPC-кодера по стандарту DVB-S2 на ПЛИС. Разобравшись с алгоритмом формирования проверочных битов (как мне показалось), взялся за реализацию. Взял длину блока 64800 и скорость 1/2. Практически тут же уткнулся в проблему - "как это можно сделать"? Из таблицы стандарта получается так, что каждый информационный бит участвует в формировании минимум 8 проверочных бит. В итоге каждому проверочному биту с учетом цикличности соответствует около 5 информационных бит. Так вот, как можно приняв один информационный бит, добавить его одновременно к 8 проверочным битам (это 1 шаг расчета проверочных бит)? Если использовать блоки памяти, то можно ли одновременно записывать в 1 блок по нескольким адресам? Если например взять несколько блоков, то наверно это возможно, но таких блоков на мой взгляд нужно в данном примере 360.. это какую же ПЛИС надо использовать? Если делать все на регистрах, то у меня Quartus II не смог откомпилировать такой объем адресации. Из возможных вариантов - это использование опорной частоты минимум в 5 раз выше информационной скорости, чтобы последовательно записывать результаты в память. Может кто сталкивался с этой проблемой?
Go to the top of the page
 
+Quote Post
Serg76
сообщение Jan 20 2014, 11:19
Сообщение #24


Профессионал
*****

Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775



Придется Вам еще почитать, потому как для этих кодов принято оперировать понятиями кодовых и проверочных узлов, кодовые - соответсвуют битам всего принятого кодового слова, включая информационные и проверочные биты, а проверочные - соответствуют ортогональным проверочным уравнениям.
Go to the top of the page
 
+Quote Post
Neznaika
сообщение Jan 21 2014, 06:58
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 4-04-07
Пользователь №: 26 768



Я не против почитать, но было бы чего... Оперировать можно чем угодно, лишь бы только понимать о чем речь. Основная информация на мою тематику на буржуйском языке, а там кто как переведет. В ИНЕТе наткнулся на пару статей по реализации LDPC-кодера. Обе недоступны бесплатно. Вот одна из них... http://link.springer.com/chapter/10.1007%2...-642-35603-2_34 К моей радости они дают 2 первые страницы статьи, на одной из которой приведена искомая архитектура, но не все в ней понятно... Например, почему выполняются 360-битные операции... для чего нужен цикличный сдвиг в регистрах... и по структуре получается, что не Р(i)=Р(i) xor P(i-1), a сложение через 360 бит.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Serg76
сообщение Jan 21 2014, 07:31
Сообщение #26


Профессионал
*****

Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775



Не надо, как говорится, рассказывать сказки, литературы по LDPC полно разной. Да, большинство на английском, но тут уж извините. попадаются статьи и на русском, как говорится, ищите и обрящите )))) для начала откройте стандарт по DVB-S2 ETSI EN302307, где расписано как формируются строки проверочной матрицы

Кстати, там же вкратце приведен алгоритм декодирования на примере расширенного кода Хемминга
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Jan 21 2014, 08:45
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Цитата(Neznaika @ Jan 20 2014, 13:14) *
Не стал открывать новую ветку.


Ну во-первых для кода 1/2 кол-во рёбер графа ("эджей") равно (226800 - 1), то есть всего 3.5 штуки на один выходной бит.
Один эдж это один ксор, одно чтение и одна запись. Так как у вас память двупортовая в плисине, то значит частота повысится всего в 3.5 раза, а для самого злостного кода 3/5 - в 4.4 раза.

Распараллеливание в любое кол-во раз до 360 тоже легко делается, вечером объясню, если ещё нужно будет, а щас времени совсем нет..
Go to the top of the page
 
+Quote Post
Neznaika
сообщение Jan 21 2014, 11:56
Сообщение #28


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 4-04-07
Пользователь №: 26 768



Спасибо за ответы) Со стандарта я конечно же и начинал... в нем указано как формируется кодовое слово (считаются проверочные биты), про матрицу не помню. Что касается разных переводов, то в одной литературе variable node и information node, как я понял одно и тоже... смысл один и тот же. Ну да бог ним) Почесал в очередной раз репу... пригляделся к способу формирования проверочных битов в памяти приведенной выше архитектуры. В первой строке похоже стоят проверочные биты... P0, P90, P180... и т.д... а в первом столбце P0, P1, Р2 и т.д.... Тогда действительно можно первую строку посчитать за один такт, зная правильные индексы информационных бит и применяя сдвиг в 360-битных регистрах, так чтобы, например, P0 соответствовали биты в регистрах его формирующих. Информационные биты идут в последовательном порядке... и правильно сдвинув регистры, а потом сложив мы получив верные Рi во всей 360-битной строке. Эти самые индексы можно, как мне кажется легко вычислить используя таблицы из Appendix A прикрепленной статьи. Но вот дальше интересно... пусть сохраним первую строку в буфере... вычисляем 2-ую строку... складываем ее с первой... вычисляем третью.. складываем со второй... вроде все получается... Р1=Р1 xor P0, P2=P2 xor P1... это что касается первого столбца... Р91=Р91 xor P90, P92=P92 xor P91... что касается второго... Но! Нет связи между Р89 и Р90... в стандарте вроде процесс идет непрерывно... и мы должны проделать операцию P90=P90 xor P89.... здесь же она выпадает... Почему? Или я опять не правильно где то понял?


Цитата(Dr.Alex @ Jan 21 2014, 12:45) *
Ну во-первых для кода 1/2 кол-во рёбер графа ("эджей") равно (226800 - 1), то есть всего 3.5 штуки на один выходной бит.
Один эдж это один ксор, одно чтение и одна запись. Так как у вас память двупортовая в плисине, то значит частота повысится всего в 3.5 раза, а для самого злостного кода 3/5 - в 4.4 раза.

Распараллеливание в любое кол-во раз до 360 тоже легко делается, вечером объясню, если ещё нужно будет, а щас времени совсем нет..

Спасибо) Да, было бы интересно... я не считал вашим способом, немного не понятно. Мне казалось, что частота для 1/2 может повыситься только в 2 раза, ведь на 1 информационный приходится 2 бита кода. В предложенной архитектуре пока не понятно что там происходит с частотами. Допустим есть 2 входных буфера (по 90 регистров в 360 бит), пока вычисляем проверочные биты, входные записываем во второй входной буфер... а дальше нужно как то считать с удвоенной скоростью и входные биты и проверочные... но пока подвис вопрос с потерей одного вычисления...

Сообщение отредактировал Neznaika - Jan 21 2014, 11:57
Прикрепленные файлы
Прикрепленный файл  Investigation_of_LDPC_code_in_DVB_S2.pdf ( 1.49 мегабайт ) Кол-во скачиваний: 228
 
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Jan 21 2014, 22:00
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Цитата(Neznaika @ Jan 21 2014, 15:56) *
Мне казалось, что частота для 1/2 может повыситься только в 2 раза, ведь на 1 информационный приходится 2 бита кода.


Ну вы же сами писали про "использование опорной частоты минимум в 5 раз выше информационной скорости", только посчитали неверно.
На каждый парити-нод в коде 1/2 влияют 7 инфо-нодов (это называется "градус" нода). Кроме нулевого парити-нода - у него градус всегда на 1 меньше. Всего парити-нодов 32400, а всего бит на выходе 64800. Поэтому на каждый выходной бит по 3.5 операций.

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

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

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

2) Написать кодер, использующий "инверсную" таблицу из вашей доки, опять же безо всякого параллелизма. Сравнить с образцовым.

3) Если правильно, добавить параллелизм (раз 4-8, больше не нужно).

С проблемой из первой половины поста вы разберётесь ещё когда будете делать первый пункт.
Go to the top of the page
 
+Quote Post
Neznaika
сообщение Jan 22 2014, 05:53
Сообщение #30


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 4-04-07
Пользователь №: 26 768



Спасибо) В целом стратегия понятна. Любопытно все-таки разобраться с "непоняткой" в архитектуре. Как говорится мы не ищем легких путей, и не из тех, кто "умный" и"нормальный герой") Так что барабан мне в руки...
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th June 2025 - 05:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01517 секунд с 7
ELECTRONIX ©2004-2016