Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LDPC+QAM256
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Страницы: 1, 2
brig01
Добрый день коллеги!

Возможно учесть вид модуляции(QAM256) при создании матриц LDPC? Сейчас использую алгоритм PEG.

P.S. Сорри за тупой вопрос, кодированием занимаюсь недавно.
Serg76
Цитата(brig01 @ Dec 7 2010, 15:55) *
Добрый день коллеги!

Возможно учесть вид модуляции(QAM256) при создании матриц LDPC? Сейчас использую алгоритм PEG.

P.S. Сорри за тупой вопрос, кодированием занимаюсь недавно.

Если я правильно понимаю Вам необходимо преобразовать мягкие решения сигнала 256-КАМ в последовательность мягких оценок, т.е. реализовать квадратурный расщепитель. Другими словами, на входе некоего блока I/Q составляющие сигнала 256-КАМ с выхода демодулятора, на выходе блока последовательность из 8-ми мягких оценок на каждую I/Q пару. Эту последовательность затем можно преобразовать в жесткие решения, т.е. битовый поток и уже по нему рассчитать проверочную матрицу. От типа применяемой конструкции эти действия зависеть не будут. Или я что-то не так понял из Вашего вопроса?
brig01
Цитата(Serg76 @ Dec 7 2010, 21:53) *
Если я правильно понимаю Вам необходимо преобразовать мягкие решения сигнала 256-КАМ в последовательность мягких оценок, т.е. реализовать квадратурный расщепитель. Другими словами, на входе некоего блока I/Q составляющие сигнала 256-КАМ с выхода демодулятора, на выходе блока последовательность из 8-ми мягких оценок на каждую I/Q пару. Эту последовательность затем можно преобразовать в жесткие решения, т.е. битовый поток и уже по нему рассчитать проверочную матрицу. От типа применяемой конструкции эти действия зависеть не будут. Или я что-то не так понял из Вашего вопроса?


Добрый день!

1. Расщепитель квадратур с которого я получаю метрику для каждого бита у меня есть.

2. "... Эту последовательность затем можно преобразовать в жесткие решения, т.е. битовый поток и уже по нему рассчитать проверочную матрицу... " - если не сложно поясните?

3. В КАМ256 энергетика у бит разная, а значит и ВЕR у каждого бита свой, у младшего бита он больше, возможно ли какнибудь это учесть при построении схемы FEC, идеально конечно чтобы это можно было учесть в пров.мат. LDPC.

4. Для получения наибольшего выигрыша от кодирования для КАМ256 применяют каскадные схемы FEC. Например R=5/6, сначал поток накрывается кодом R=20/21, затем младший бит накрывается R=1/2(для потока это будет 7/8). Я оч. сильно ограничен в ресурсе, для меня это не вариант.

P.S. Возможны разночтения в терминах, если что не понятно, спрашивайте.



SKov
Цитата(brig01 @ Dec 8 2010, 09:12) *
3. В КАМ256 энергетика у бит разная, а значит и ВЕR у каждого бита свой, у младшего бита он больше, возможно ли какнибудь это учесть при построении схемы FEC, идеально конечно чтобы это можно было учесть в пров.мат. LDPC.

Вм надо порыться в стандартах DVB-xx. Там точно есть сочетания КАМ-LDPC. Но выражение "расчитать проверочную матрицу" немного ставит в тупик. Проверочная матрица строится заранее и потом уже ни от чего не зависит. Декодер работает с отношениями правдоподобия или (как правило) с их логарифмами (что в MIN-SUM, что в BP- декодерах), что автоматически учитывает разные вероятности ошибки в битах. А вообще - почитайте упомянутые выше стандарты, может там как-то особенности КАМ и учитываются.
Modest
Цитата(SKov @ Dec 8 2010, 11:45) *
Но выражение "расчитать проверочную матрицу" немного ставит в тупик. Проверочная матрица строится заранее и потом уже ни от чего не зависит.
Мне кажется имелось ввиду : "Как заранее построить матрицу с учетом того что будет использоваться КАМ256?"
brig01
Цитата(SKov @ Dec 8 2010, 14:45) *
Вм надо порыться в стандартах DVB-xx. Там точно есть сочетания КАМ-LDPC. Но выражение "расчитать проверочную матрицу" немного ставит в тупик. Проверочная матрица строится заранее и потом уже ни от чего не зависит. Декодер работает с отношениями правдоподобия или (как правило) с их логарифмами (что в MIN-SUM, что в BP- декодерах), что автоматически учитывает разные вероятности ошибки в битах. А вообще - почитайте упомянутые выше стандарты, может там как-то особенности КАМ и учитываются.


Хоть примерно какой DVB-xx рыть?, их там много и в них много букфф и страничек и всё на буржуинском)
Serg76
Цитата(brig01 @ Dec 8 2010, 10:12) *
Добрый день!

1. Расщепитель квадратур с которого я получаю метрику для каждого бита у меня есть.

2. "... Эту последовательность затем можно преобразовать в жесткие решения, т.е. битовый поток и уже по нему рассчитать проверочную матрицу... " - если не сложно поясните?

3. В КАМ256 энергетика у бит разная, а значит и ВЕR у каждого бита свой, у младшего бита он больше, возможно ли какнибудь это учесть при построении схемы FEC, идеально конечно чтобы это можно было учесть в пров.мат. LDPC.

4. Для получения наибольшего выигрыша от кодирования для КАМ256 применяют каскадные схемы FEC. Например R=5/6, сначал поток накрывается кодом R=20/21, затем младший бит накрывается R=1/2(для потока это будет 7/8). Я оч. сильно ограничен в ресурсе, для меня это не вариант.

P.S. Возможны разночтения в терминах, если что не понятно, спрашивайте.

2. Если значения метрики положительное число, то значит единичный бит, в противном случае - нулевой, либо же наоборот.
3. Если правильно подобран манипуляционный код, то BER для каждого бита должен быть одинаков, иначе вы получите пачечную структуру ошибок. Хотя для КАМ-256 это условие выполнить будет трудновато.

Цитата(brig01 @ Dec 8 2010, 10:12) *
Но выражение "расчитать проверочную матрицу" немного ставит в тупик. Проверочная матрица строится заранее и потом уже ни от чего не зависит.

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

Цитата(brig01 @ Dec 8 2010, 10:12) *
Хоть примерно какой DVB-xx рыть?, их там много и в них много букфф и страничек и всё на буржуинском)


DVB-S2. там применяется, по-моему, LDPC+BCH совместно с APSK32
brig01
Цитата(Serg76 @ Dec 8 2010, 17:34) *
2. Если значения метрики положительное число, то значит единичный бит, в противном случае - нулевой, либо же наоборот.
3. Если правильно подобран манипуляционный код, то BER для каждого бита должен быть одинаков, иначе вы получите пачечную структуру ошибок. Хотя для КАМ-256 это условие выполнить будет трудновато.


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



DVB-S2. там применяется, по-моему, LDPC+BCH совместно с APSK32


Re.2. Как из мягкого решения вытянуть жёсткое понятно, не ясно из фразы как по принятым данным посчитать проверочную матрицу по принятым данным, может вы имели ввиду, по принятым данным и с пров.матрицей посчитать синдром?

Re.3.Проблема в том что как только появляеться амлитудная модуляция в сложных сигналах так BER становиться разный, но если мы знаем что вот эти биты более подверженные ошибкам а эти нет, то можно ли это какнить использовать на системном уровне?

P.S. Как-то всё с ног на голову перевернуто, как раз приходит входной поток с ошибкой, матрицу расчитывать не надо, она уже есть)))

P.P.S. На IEEE нашёл статью про m-QAM+LDPC.

P.P.P.S Ктонибудь реализовывал CTC? и сколько весит, может у кого есть модель в matlab-е?




SKov
Может, здесь что полезное найдете.
Modest
Цитата(Serg76 @ Dec 8 2010, 14:34) *
3. Если правильно подобран манипуляционный код, то BER для каждого бита должен быть одинаков, иначе вы получите пачечную структуру ошибок.
Дык, а если перемежение использовать?
Serg76
Цитата(Modest @ Dec 8 2010, 16:53) *
Дык, а если перемежение использовать?

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

Цитата(brig01 @ Dec 8 2010, 16:07) *
Re.2. Как из мягкого решения вытянуть жёсткое понятно, не ясно из фразы как по принятым данным посчитать проверочную матрицу по принятым данным, может вы имели ввиду, по принятым данным и с пров.матрицей посчитать синдром?


Я имел ввиду как раз, что по принятым безошибочным данным можно посчитать проверочную (или порождающую) матрицу составив и решив СЛАУ. Если Вас интересуют подробности, то мне надо вспомнить как это делается.

Цитата(brig01 @ Dec 8 2010, 16:07) *
P.P.P.S Ктонибудь реализовывал CTC? и сколько весит, может у кого есть модель в matlab-е?

CTC - это Convolution Turbo Codes?
SKov
Цитата(brig01 @ Dec 8 2010, 15:07) *
Re.3.Проблема в том что как только появляеться амлитудная модуляция в сложных сигналах так BER становиться разный, но если мы знаем что вот эти биты более подверженные ошибкам а эти нет, то можно ли это какнить использовать на системном уровне?

Надо почитать про код Грея, конструкцию Унгербоека и про сигнально-кодовые конструкции.
brig01
Цитата(Serg76 @ Dec 8 2010, 21:57) *
CTC - это Convolution Turbo Codes?


Ага они самые.



Цитата(SKov @ Dec 8 2010, 18:50) *
Может, здесь что полезное найдете.


Cпсб.

Цитата(SKov @ Dec 8 2010, 23:49) *
Надо почитать про код Грея, конструкцию Унгербоека и про сигнально-кодовые конструкции.


1. Коды грея я использую. Это улучшает ВER всего потока в два раза. Но не решает проблему разного BER в битах.

2. Как можно использовать конструкцию Унгербоека + QAM256?
petrov
Цитата(brig01 @ Dec 9 2010, 09:58) *
2. Как можно использовать конструкцию Унгербоека + QAM256?


I и Q кодируются независимо, каждая из них 4 бита передаёт, т е 16 точек, разбиваем их на 4 подобраза, 2 бита адресующие подобразы кодируем LDPC, 2 из подобраза не кодируем вовсе, в зависимости от модели канала может потребоваться внешний БЧХ код чтобы некодированные биты исправлять при замираниях.
brig01
Цитата(petrov @ Dec 9 2010, 14:11) *
I и Q кодируются независимо, каждая из них 4 бита передаёт, т е 16 точек, разбиваем их на 4 подобраза, 2 бита адресующие подобразы кодируем LDPC, 2 из подобраза не кодируем вовсе, в зависимости от модели канала может потребоваться внешний БЧХ код чтобы некодированные биты исправлять при замираниях.


Мои знания в TCM не оч., поэтому буду задавать тупые вопросы....

1. На сколько я знаю кодирование в схемах TCM происходит на символьном уровне, как туда пристятгнуть блоковый LDPC работающий с битами не понятно, поясните оч. интересно?

2. Вроде для схем ТСМ используют свёртоный код?

3. С учётом всего сказанного возможно ли использовать для схемы TCM LDPC R=5/6?

P.S. Если сложно отвечать, буду рад ссылкам на литературу где можно почитать по конструкции QAM256+TCM+LDPC.

P.S.S. Сейчас читаю Скляра, оч. тяжОлое чтиво, есть что нить по достпупнее, в плане подачи матерьяла?)

Заранее спасибо!






petrov
В гугле достаточно статей можно найти, вот на вскидку

http://www.csie.ntu.edu.tw/~mku/research/L...PC_for_ADSL.pdf

Смотрите не TCM а pragmatic approach double Gray binary coding BICM QAM soft demapping LLR и т. п.
SKov
Цитата(brig01 @ Dec 9 2010, 17:27) *
P.S.S. Сейчас читаю Скляра, оч. тяжОлое чтиво, есть что нить по достпупнее, в плане подачи матерьяла?)

Вообще, туго вам придется, если нет опыта в этой области. Там одних только методов постоения LDPC - добрый десяток, да и модификаций декодеров не меньше. И, кстати, QC-LDPC - это разве только сначала кажется приличным классом кодов. Единственное их достоинство - легкость построения. И кодирования. А вообще, если сложность кодера не очень критична, а главное - качество кода, то советую глянуть PG-LDPC. Но еще раз скажу, если это вам курсовик надо написать или диплом - то сойдет и так. А если серьезную разработку надо сделать, то с полгодика надо статьи почитать и "землю порыть". Одной местной конференцией вам не обойтись.
Потому как это тема - "цельная наука" wink.gif))
brig01
Цитата(SKov @ Dec 10 2010, 03:23) *
Вообще, туго вам придется, если нет опыта в этой области. Там одних только методов постоения LDPC - добрый десяток, да и модификаций декодеров не меньше. И, кстати, QC-LDPC - это разве только сначала кажется приличным классом кодов. Единственное их достоинство - легкость построения. И кодирования. А вообще, если сложность кодера не очень критична, а главное - качество кода, то советую глянуть PG-LDPC. Но еще раз скажу, если это вам курсовик надо написать или диплом - то сойдет и так. А если серьезную разработку надо сделать, то с полгодика надо статьи почитать и "землю порыть". Одной местной конференцией вам не обойтись.
Потому как это тема - "цельная наука" wink.gif))


Опыт дело наживное было бы желание. QC-LDPC-BC используеться в WiMax и GhM сетях, янки плохое не будут закладывать, есть другие альтернативы когда размер фрейма на десятки тысяч бит? Кстате их я реализовал/отладил в железе sm.gif. Сложность критична, нужно упихать в ограниченный ресурс(EP1C12) на скорости до 180Мбит. Так то хотел кандидатскую написать sm.gif)). А какие ещё есть конференции на эту тему?

P.S. В QC-LDPC-BC сильно не понравилось что для эффективного декодирования требуеться от 10 итераций и выше.

Цитата(petrov @ Dec 9 2010, 22:41) *
В гугле достаточно статей можно найти, вот на вскидку

http://www.csie.ntu.edu.tw/~mku/research/L...PC_for_ADSL.pdf

Смотрите не TCM а pragmatic approach double Gray binary coding BICM QAM soft demapping LLR и т. п.


Огромное спсб.
SKov
Цитата(brig01 @ Dec 10 2010, 09:05) *
QC-LDPC-BC используеться в WiMax и GhM сетях,
янки плохое не будут закладывать


Ну, с таким подходом мы из состояния банановой республики уже никогда не вылезем. wink.gif
Кстати, те же янки используют PG-коды в 10-гигабитном эзернете. Там , правда,
длина небольшая - 2048. И во флеш-памяти (там длина около 10000).
Если критична сложность кодера, то янки просто приписываеют к проверочной матрице двойную единичную матрицу wink.gif)
Тоже нормальное дело, если хочется подпортить качество кода ради упрощения кодирования.wink.gif

Цитата
А какие ещё есть конференции на эту тему?

Я не знаю. Вообще, конференция полезна, если вы совсем "чайник" и вам надо получить начальную "ориентацию в пространстве"
и легкий дружеский пинок в нужном напрвлении. Либо, если вы уже гуру, но какой-то очень частный вопрос не можете
раскусить - тогда тоже могут помочь. А использовать конференцию для решения задачи обучения - это последнее дело.
Тут вам быстро расскажут про "модификацию проверочной матрицы" в процессе декодирования.
Вы потом долго переучиваться будете wink.gif

Цитата
P.S. В QC-LDPC-BC сильно не понравилось что для эффективного декодирования требуеться от 10 итераций и выше.

Это вообще какая-то ерунда, которую я не понимаю. Количество итераций зависит в первую очередь от уровня шума.
Даже плохой код будет быстро декодироваться при малом уровне шумов. И даже хороший код требует многих итераций
при большом шуме. Все очень относительно. Вы можете силовым приемом ограничить число итераций на приемлемом
уровне - и смотреть, что получается.
brig01
Цитата(SKov @ Dec 10 2010, 14:51) *
Ну, с таким подходом мы из состояния банановой республики уже никогда не вылезем. wink.gif
Кстати, те же янки используют PG-коды в 10-гигабитном эзернете. Там , правда,
длина небольшая - 2048. И во флеш-памяти (там длина около 10000).
Если критична сложность кодера, то янки просто приписываеют к проверочной матрице двойную единичную матрицу wink.gif)
Тоже нормальное дело, если хочется подпортить качество кода ради упрощения кодирования.wink.gif


Я не знаю. Вообще, конференция полезна, если вы совсем "чайник" и вам надо получить начальную "ориентацию в пространстве"
и легкий дружеский пинок в нужном напрвлении. Либо, если вы уже гуру, но какой-то очень частный вопрос не можете
раскусить - тогда тоже могут помочь. А использовать конференцию для решения задачи обучения - это последнее дело.
Тут вам быстро расскажут про "модификацию проверочной матрицы" в процессе декодирования.
Вы потом долго переучиваться будете wink.gif


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


1. На начальном этапе мне и моему начальству нужен был результат, результат проще добиться когда задача не сложная, тем более когда кодированием не знанимался, поэтому QC-LDPC-BC без вариантов.

2.Конференции всегда важны хоть чайник ты, хоть утюг, хоть гуру из тебета sm.gif

3.Количество итераций зависит от ресурса, чем его больше тем больше итераций, у меня без всяких "силовых", тупо в EP1C12 не лезет больше 3итераций. В моём случае на R=5/6 QAM256 я получил выигрышь 6дБ (замеренно в железе), этого мало, нужно ещё 1дБ. Если б у меня была возможность добавить ещё итераций 7 было бы лучшe причём сильно, кстате после 16итераций выигрыша практически нет. Поэтому я и говорю что для эффективного ДЕкодирования (масимального выигрыша в дБ) нужно 10итераций.


P.S. Переделаю схему FEC на выходных как посоветовал камрад petrov, отпишусь что получилось sm.gif


petrov
Цитата(brig01 @ Dec 10 2010, 12:51) *
P.S. Переделаю схему FEC на выходных как посоветовал камрад petrov, отпишусь что получилось sm.gif


Не торопитесь ничего переделывать, может и не нужно вам это.

А как у вас сейчас сделано извлечение мягкой информации из 256QAM?
brig01
Цитата(petrov @ Dec 10 2010, 16:35) *
Не торопитесь ничего переделывать, может и не нужно вам это.

А как у вас сейчас сделано извлечение мягкой информации из 256QAM?



1. На передющей стороне биты кодирую в грей:

Код
always_ff@(posedge clk)begin
        gray[3]  <= #Tp acc[3];
        gray[2]  <= #Tp acc[2]^acc[3];
        gray[1]  <= #Tp acc[1]^acc[2]^acc[3];
        gray[0]  <= #Tp acc[0]^acc[1]^acc[2]^acc[3];
    end


Данные скармливаю модему. Получаю фазовый портрет рис. в одном из моих ответов.

2. На приёмной стороне с эквалайзера приходит 7бит(старшие биты ) для одной квадратуры.

3. Расщепление квадратуры в метрики:

Код
function bit signed [6:0] prod_minus(input bit signed [6:0] in);
integer i;    
bit     sign;
begin
    prod_minus  =   0;    
    for(i=0;i<7;i++)begin
            prod_minus[i]  =   ~in[i];            
        end
end    
endfunction    

function bit signed [6:0] abs(input bit [6:0] in);
integer i;
begin
    abs  =   0;
    for(i=0;i<7;i++)begin
            abs[i]  =   in[i]^(in[6]);
        end
end
endfunction

task automatic calc_metric(bit signed [6:0] in, ref bit signed [6:0] met [3:0]);    
begin    
    //
    met[3]   =   prod_minus(in);
    met[2]   =   abs(in)-32;
    met[1]   =   abs(met[2])-16;
    met[0]   =   abs(met[1])-8;        
    //
    for(int i=0;i<4;i++)begin
            if(met[i]>7)
                met[i]  =   7;
            else if(met[i]<-8)
                met[i]  =  -8;
        end
end    
endtask
Serg76
2 brig01

А можно для лучшего восприятия привести словесный алгоритм расщепителя или математические выражения?
brig01
Цитата(Serg76 @ Dec 10 2010, 17:28) *
2 brig01

А можно для лучшего восприятия привести словесный алгоритм расщепителя или математические выражения?


Честно говоря не знаю что сдесь не ясно, код вроде элементарный.

Логи выполнения:

Код
# In    = 0000 InM   =   -16 OutM  = -64 M[3] =  7 M[2] =  7 M[1] =  7 M[0] =  7  
# In    = 0000 InM   = -15 OutM  = -63 M[3] =  7 M[2] =  7 M[1] =  7 M[0] =  6  
# In    = 0000 InM   = -15 OutM  = -62 M[3] =  7 M[2] =  7 M[1] =  7 M[0] =  5  
# In    = 0000 InM   = -15 OutM  = -61 M[3] =  7 M[2] =  7 M[1] =  7 M[0] =  4  
# In    = 0000 InM   =   -15 OutM  = -60 M[3] =  7 M[2] =  7 M[1] =  7 M[0] =  3  
# In    = 0000 InM   = -14 OutM  = -59 M[3] =  7 M[2] =  7 M[1] =  7 M[0] =  2  
# In    = 0000 InM   = -14 OutM  = -58 M[3] =  7 M[2] =  7 M[1] =  7 M[0] =  1  
# In    = 0000 InM   = -14 OutM  = -57 M[3] =  7 M[2] =  7 M[1] =  7 M[0] =  0  
# In    = 0001 InM   =   -14 OutM  = -56 M[3] =  7 M[2] =  7 M[1] =  7 M[0] = -1  
# In    = 0001 InM   = -13 OutM  = -55 M[3] =  7 M[2] =  7 M[1] =  6 M[0] = -2  
# In    = 0001 InM   = -13 OutM  = -54 M[3] =  7 M[2] =  7 M[1] =  5 M[0] = -3  
# In    = 0001 InM   = -13 OutM  = -53 M[3] =  7 M[2] =  7 M[1] =  4 M[0] = -4  
# In    = 0001 InM   =   -13 OutM  = -52 M[3] =  7 M[2] =  7 M[1] =  3 M[0] = -5  
# In    = 0001 InM   = -12 OutM  = -51 M[3] =  7 M[2] =  7 M[1] =  2 M[0] = -6  
# In    = 0001 InM   = -12 OutM  = -50 M[3] =  7 M[2] =  7 M[1] =  1 M[0] = -7  
# In    = 0001 InM   = -12 OutM  = -49 M[3] =  7 M[2] =  7 M[1] =  0 M[0] = -8  
# In    = 0011 InM   =   -12 OutM  = -48 M[3] =  7 M[2] =  7 M[1] = -1 M[0] = -8  
# In    = 0011 InM   = -11 OutM  = -47 M[3] =  7 M[2] =  7 M[1] = -2 M[0] = -7  
# In    = 0011 InM   = -11 OutM  = -46 M[3] =  7 M[2] =  7 M[1] = -3 M[0] = -6  
# In    = 0011 InM   = -11 OutM  = -45 M[3] =  7 M[2] =  7 M[1] = -4 M[0] = -5  
# In    = 0011 InM   =   -11 OutM  = -44 M[3] =  7 M[2] =  7 M[1] = -5 M[0] = -4  
# In    = 0011 InM   = -10 OutM  = -43 M[3] =  7 M[2] =  7 M[1] = -6 M[0] = -3  
# In    = 0011 InM   = -10 OutM  = -42 M[3] =  7 M[2] =  7 M[1] = -7 M[0] = -2  
# In    = 0011 InM   = -10 OutM  = -41 M[3] =  7 M[2] =  7 M[1] = -8 M[0] = -1  
# In    = 0010 InM   =   -10 OutM  = -40 M[3] =  7 M[2] =  7 M[1] = -8 M[0] =  0  
# In    = 0010 InM   =  -9 OutM  = -39 M[3] =  7 M[2] =  6 M[1] = -8 M[0] =  1  
# In    = 0010 InM   =  -9 OutM  = -38 M[3] =  7 M[2] =  5 M[1] = -8 M[0] =  2  
# In    = 0010 InM   =  -9 OutM  = -37 M[3] =  7 M[2] =  4 M[1] = -8 M[0] =  3  
# In    = 0010 InM   =    -9 OutM  = -36 M[3] =  7 M[2] =  3 M[1] = -8 M[0] =  4  
# In    = 0010 InM   =  -8 OutM  = -35 M[3] =  7 M[2] =  2 M[1] = -8 M[0] =  5  
# In    = 0010 InM   =  -8 OutM  = -34 M[3] =  7 M[2] =  1 M[1] = -8 M[0] =  6  
# In    = 0010 InM   =  -8 OutM  = -33 M[3] =  7 M[2] =  0 M[1] = -8 M[0] =  7  
# In    = 0110 InM   =    -8 OutM  = -32 M[3] =  7 M[2] = -1 M[1] = -8 M[0] =  7  
# In    = 0110 InM   =  -7 OutM  = -31 M[3] =  7 M[2] = -2 M[1] = -8 M[0] =  6  
# In    = 0110 InM   =  -7 OutM  = -30 M[3] =  7 M[2] = -3 M[1] = -8 M[0] =  5  
# In    = 0110 InM   =  -7 OutM  = -29 M[3] =  7 M[2] = -4 M[1] = -8 M[0] =  4  
# In    = 0110 InM   =    -7 OutM  = -28 M[3] =  7 M[2] = -5 M[1] = -8 M[0] =  3  
# In    = 0110 InM   =  -6 OutM  = -27 M[3] =  7 M[2] = -6 M[1] = -8 M[0] =  2  
# In    = 0110 InM   =  -6 OutM  = -26 M[3] =  7 M[2] = -7 M[1] = -8 M[0] =  1  
# In    = 0110 InM   =  -6 OutM  = -25 M[3] =  7 M[2] = -8 M[1] = -8 M[0] =  0  
# In    = 0111 InM   =    -6 OutM  = -24 M[3] =  7 M[2] = -8 M[1] = -8 M[0] = -1  
# In    = 0111 InM   =  -5 OutM  = -23 M[3] =  7 M[2] = -8 M[1] = -7 M[0] = -2  
# In    = 0111 InM   =  -5 OutM  = -22 M[3] =  7 M[2] = -8 M[1] = -6 M[0] = -3  
# In    = 0111 InM   =  -5 OutM  = -21 M[3] =  7 M[2] = -8 M[1] = -5 M[0] = -4  
# In    = 0111 InM   =    -5 OutM  = -20 M[3] =  7 M[2] = -8 M[1] = -4 M[0] = -5  
# In    = 0111 InM   =  -4 OutM  = -19 M[3] =  7 M[2] = -8 M[1] = -3 M[0] = -6  
# In    = 0111 InM   =  -4 OutM  = -18 M[3] =  7 M[2] = -8 M[1] = -2 M[0] = -7  
# In    = 0111 InM   =  -4 OutM  = -17 M[3] =  7 M[2] = -8 M[1] = -1 M[0] = -8  
# In    = 0101 InM   =    -4 OutM  = -16 M[3] =  7 M[2] = -8 M[1] =  0 M[0] = -8  
# In    = 0101 InM   =  -3 OutM  = -15 M[3] =  7 M[2] = -8 M[1] =  1 M[0] = -7  
# In    = 0101 InM   =  -3 OutM  = -14 M[3] =  7 M[2] = -8 M[1] =  2 M[0] = -6  
# In    = 0101 InM   =  -3 OutM  = -13 M[3] =  7 M[2] = -8 M[1] =  3 M[0] = -5  
# In    = 0101 InM   =    -3 OutM  = -12 M[3] =  7 M[2] = -8 M[1] =  4 M[0] = -4  
# In    = 0101 InM   =  -2 OutM  = -11 M[3] =  7 M[2] = -8 M[1] =  5 M[0] = -3  
# In    = 0101 InM   =  -2 OutM  = -10 M[3] =  7 M[2] = -8 M[1] =  6 M[0] = -2  
# In    = 0101 InM   =  -2 OutM  =  -9 M[3] =  7 M[2] = -8 M[1] =  7 M[0] = -1  
# In    = 0100 InM   =    -2 OutM  =  -8 M[3] =  7 M[2] = -8 M[1] =  7 M[0] =  0  
# In    = 0100 InM   =  -1 OutM  =  -7 M[3] =  6 M[2] = -8 M[1] =  7 M[0] =  1  
# In    = 0100 InM   =  -1 OutM  =  -6 M[3] =  5 M[2] = -8 M[1] =  7 M[0] =  2  
# In    = 0100 InM   =  -1 OutM  =  -5 M[3] =  4 M[2] = -8 M[1] =  7 M[0] =  3  
# In    = 0100 InM   =    -1 OutM  =  -4 M[3] =  3 M[2] = -8 M[1] =  7 M[0] =  4  
# In    = 0100 InM   =   0 OutM  =  -3 M[3] =  2 M[2] = -8 M[1] =  7 M[0] =  5  
# In    = 0100 InM   =   0 OutM  =  -2 M[3] =  1 M[2] = -8 M[1] =  7 M[0] =  6  
# In    = 0100 InM   =   0 OutM  =  -1 M[3] =  0 M[2] = -8 M[1] =  7 M[0] =  7  
# In    = 1100 InM   =     0 OutM  =   0 M[3] = -1 M[2] = -8 M[1] =  7 M[0] =  7  
# In    = 1100 InM   =   0 OutM  =   1 M[3] = -2 M[2] = -8 M[1] =  7 M[0] =  6  
# In    = 1100 InM   =   0 OutM  =   2 M[3] = -3 M[2] = -8 M[1] =  7 M[0] =  5  
# In    = 1100 InM   =   0 OutM  =   3 M[3] = -4 M[2] = -8 M[1] =  7 M[0] =  4  
# In    = 1100 InM   =     1 OutM  =   4 M[3] = -5 M[2] = -8 M[1] =  7 M[0] =  3  
# In    = 1100 InM   =   1 OutM  =   5 M[3] = -6 M[2] = -8 M[1] =  7 M[0] =  2  
# In    = 1100 InM   =   1 OutM  =   6 M[3] = -7 M[2] = -8 M[1] =  7 M[0] =  1  
# In    = 1100 InM   =   1 OutM  =   7 M[3] = -8 M[2] = -8 M[1] =  7 M[0] =  0  
# In    = 1101 InM   =     2 OutM  =   8 M[3] = -8 M[2] = -8 M[1] =  7 M[0] = -1  
# In    = 1101 InM   =   2 OutM  =   9 M[3] = -8 M[2] = -8 M[1] =  6 M[0] = -2  
# In    = 1101 InM   =   2 OutM  =  10 M[3] = -8 M[2] = -8 M[1] =  5 M[0] = -3  
# In    = 1101 InM   =   2 OutM  =  11 M[3] = -8 M[2] = -8 M[1] =  4 M[0] = -4  
# In    = 1101 InM   =     3 OutM  =  12 M[3] = -8 M[2] = -8 M[1] =  3 M[0] = -5  
# In    = 1101 InM   =   3 OutM  =  13 M[3] = -8 M[2] = -8 M[1] =  2 M[0] = -6  
# In    = 1101 InM   =   3 OutM  =  14 M[3] = -8 M[2] = -8 M[1] =  1 M[0] = -7  
# In    = 1101 InM   =   3 OutM  =  15 M[3] = -8 M[2] = -8 M[1] =  0 M[0] = -8  
# In    = 1111 InM   =     4 OutM  =  16 M[3] = -8 M[2] = -8 M[1] = -1 M[0] = -8  
# In    = 1111 InM   =   4 OutM  =  17 M[3] = -8 M[2] = -8 M[1] = -2 M[0] = -7  
# In    = 1111 InM   =   4 OutM  =  18 M[3] = -8 M[2] = -8 M[1] = -3 M[0] = -6  
# In    = 1111 InM   =   4 OutM  =  19 M[3] = -8 M[2] = -8 M[1] = -4 M[0] = -5  
# In    = 1111 InM   =     5 OutM  =  20 M[3] = -8 M[2] = -8 M[1] = -5 M[0] = -4  
# In    = 1111 InM   =   5 OutM  =  21 M[3] = -8 M[2] = -8 M[1] = -6 M[0] = -3  
# In    = 1111 InM   =   5 OutM  =  22 M[3] = -8 M[2] = -8 M[1] = -7 M[0] = -2  
# In    = 1111 InM   =   5 OutM  =  23 M[3] = -8 M[2] = -8 M[1] = -8 M[0] = -1  
# In    = 1110 InM   =     6 OutM  =  24 M[3] = -8 M[2] = -8 M[1] = -8 M[0] =  0  
# In    = 1110 InM   =   6 OutM  =  25 M[3] = -8 M[2] = -7 M[1] = -8 M[0] =  1  
# In    = 1110 InM   =   6 OutM  =  26 M[3] = -8 M[2] = -6 M[1] = -8 M[0] =  2  
# In    = 1110 InM   =   6 OutM  =  27 M[3] = -8 M[2] = -5 M[1] = -8 M[0] =  3  
# In    = 1110 InM   =     7 OutM  =  28 M[3] = -8 M[2] = -4 M[1] = -8 M[0] =  4  
# In    = 1110 InM   =   7 OutM  =  29 M[3] = -8 M[2] = -3 M[1] = -8 M[0] =  5  
# In    = 1110 InM   =   7 OutM  =  30 M[3] = -8 M[2] = -2 M[1] = -8 M[0] =  6  
# In    = 1110 InM   =   7 OutM  =  31 M[3] = -8 M[2] = -1 M[1] = -8 M[0] =  7  
# In    = 1010 InM   =     8 OutM  =  32 M[3] = -8 M[2] =  0 M[1] = -8 M[0] =  7  
# In    = 1010 InM   =   8 OutM  =  33 M[3] = -8 M[2] =  1 M[1] = -8 M[0] =  6  
# In    = 1010 InM   =   8 OutM  =  34 M[3] = -8 M[2] =  2 M[1] = -8 M[0] =  5  
# In    = 1010 InM   =   8 OutM  =  35 M[3] = -8 M[2] =  3 M[1] = -8 M[0] =  4  
# In    = 1010 InM   =     9 OutM  =  36 M[3] = -8 M[2] =  4 M[1] = -8 M[0] =  3  
# In    = 1010 InM   =   9 OutM  =  37 M[3] = -8 M[2] =  5 M[1] = -8 M[0] =  2  
# In    = 1010 InM   =   9 OutM  =  38 M[3] = -8 M[2] =  6 M[1] = -8 M[0] =  1  
# In    = 1010 InM   =   9 OutM  =  39 M[3] = -8 M[2] =  7 M[1] = -8 M[0] =  0  
# In    = 1011 InM   =    10 OutM  =  40 M[3] = -8 M[2] =  7 M[1] = -8 M[0] = -1  
# In    = 1011 InM   =  10 OutM  =  41 M[3] = -8 M[2] =  7 M[1] = -7 M[0] = -2  
# In    = 1011 InM   =  10 OutM  =  42 M[3] = -8 M[2] =  7 M[1] = -6 M[0] = -3  
# In    = 1011 InM   =  10 OutM  =  43 M[3] = -8 M[2] =  7 M[1] = -5 M[0] = -4  
# In    = 1011 InM   =    11 OutM  =  44 M[3] = -8 M[2] =  7 M[1] = -4 M[0] = -5  
# In    = 1011 InM   =  11 OutM  =  45 M[3] = -8 M[2] =  7 M[1] = -3 M[0] = -6  
# In    = 1011 InM   =  11 OutM  =  46 M[3] = -8 M[2] =  7 M[1] = -2 M[0] = -7  
# In    = 1011 InM   =  11 OutM  =  47 M[3] = -8 M[2] =  7 M[1] = -1 M[0] = -8  
# In    = 1001 InM   =    12 OutM  =  48 M[3] = -8 M[2] =  7 M[1] =  0 M[0] = -8  
# In    = 1001 InM   =  12 OutM  =  49 M[3] = -8 M[2] =  7 M[1] =  1 M[0] = -7  
# In    = 1001 InM   =  12 OutM  =  50 M[3] = -8 M[2] =  7 M[1] =  2 M[0] = -6  
# In    = 1001 InM   =  12 OutM  =  51 M[3] = -8 M[2] =  7 M[1] =  3 M[0] = -5  
# In    = 1001 InM   =    13 OutM  =  52 M[3] = -8 M[2] =  7 M[1] =  4 M[0] = -4  
# In    = 1001 InM   =  13 OutM  =  53 M[3] = -8 M[2] =  7 M[1] =  5 M[0] = -3  
# In    = 1001 InM   =  13 OutM  =  54 M[3] = -8 M[2] =  7 M[1] =  6 M[0] = -2  
# In    = 1001 InM   =  13 OutM  =  55 M[3] = -8 M[2] =  7 M[1] =  7 M[0] = -1  
# In    = 1000 InM   =    14 OutM  =  56 M[3] = -8 M[2] =  7 M[1] =  7 M[0] =  0  
# In    = 1000 InM   =  14 OutM  =  57 M[3] = -8 M[2] =  7 M[1] =  7 M[0] =  1  
# In    = 1000 InM   =  14 OutM  =  58 M[3] = -8 M[2] =  7 M[1] =  7 M[0] =  2  
# In    = 1000 InM   =  14 OutM  =  59 M[3] = -8 M[2] =  7 M[1] =  7 M[0] =  3  
# In    = 1000 InM   =    15 OutM  =  60 M[3] = -8 M[2] =  7 M[1] =  7 M[0] =  4  
# In    = 1000 InM   =  15 OutM  =  61 M[3] = -8 M[2] =  7 M[1] =  7 M[0] =  5  
# In    = 1000 InM   =  15 OutM  =  62 M[3] = -8 M[2] =  7 M[1] =  7 M[0] =  6  
# In    = 1000 InM   =  15 OutM  =  63 M[3] = -8 M[2] =  7 M[1] =  7 M[0] =  7


In - входые биты до грея
InM - это Жёсткое решение 4 бита OutM
OutM - на выходе модема
M[3..0] - метрики
petrov
Цитата(Serg76 @ Dec 10 2010, 14:28) *
2 brig01

А можно для лучшего восприятия привести словесный алгоритм расщепителя или математические выражения?


Да тяжеловато так сообразить.


brig01 или источник приведите по которому делали.
brig01
Цитата(petrov @ Dec 10 2010, 17:39) *
Да тяжеловато так сообразить.


brig01 или источник приведите по которому делали.


Делал сам, изходя из позиции здравого смысла.

Алгоритм MIN-SUM для LDPC, договариваемся, одна метрика 4бита.

-8 - самая достоверная 1
....
-1 - самая недостоверная 1
0 - самый недостоверный 0
....
7 - самый достоверный 0

Далее одна квадратура это число от -64 до 63. Смотрим, как распределяються и биты и какие растояния до точек перехода из 0 в 1 для каждого бита на фазовом портрете и выходим не оч. сложные соотношения

Чтобы получить метрики:

met[3] = prod_minus(I)
met[2] = abs(I) - 32
met[1] = abs(met[2]) - 16
met[0] = abs(met[1]) - 8

abs - абсюлютное значение
prod_minus - умножение на минус, функции описанны выше.

Нечто подобное, только для QAM64, можно почитать тут.
petrov
Смотрите чтобы не получалось неправильных метрик, может нормально у вас сделано, а может и лучше можно, не берусь судить.
brig01
Цитата(petrov @ Dec 10 2010, 19:09) *
Смотрите чтобы не получалось неправильных метрик, может нормально у вас сделано, а может и лучше можно, не берусь судить.



А как можно проверить на появление неправельных метрик? Если метрик неправельных нет, это лучший вариант?
petrov
Цитата(brig01 @ Dec 10 2010, 16:18) *
А как можно проверить на появление неправельных метрик? Если метрик неправельных нет, это лучший вариант?


Это уже на исследование целое тянет, лучше поискать статьи по оптимальному маппингу-демаппингу 256QAM.
brig01
Цитата(petrov @ Dec 10 2010, 19:34) *
Это уже на исследование целое тянет, лучше поискать статьи по оптимальному маппингу-демаппингу 256QAM.


Лана, в метриках я уверен, у меня были моменты когда я метрики считал не правельно, это сильно влияет на выходной BER, статьи поищу, всё равно их нужно по другому пересчитать для double Gray-code labeling.

В середине недели отпишусь как получилось с кодированием только младших бит.
Serg76
Цитата(brig01 @ Dec 10 2010, 17:45) *
Честно говоря не знаю что сдесь не ясно, код вроде элементарный.

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

Цитата(brig01 @ Dec 10 2010, 17:45) *
Лана, в метриках я уверен, у меня были моменты когда я метрики считал не правельно, это сильно влияет на выходной BER, статьи поищу, всё равно их нужно по другому пересчитать для double Gray-code labeling.

В середине недели отпишусь как получилось с кодированием только младших бит.

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

Цитата(brig01 @ Dec 10 2010, 17:18) *
А как можно проверить на появление неправельных метрик? Если метрик неправельных нет, это лучший вариант?

проверить можно только посчитав BER или же визуально на какой-нибудь заранее известной ПСП
brig01
Цитата(Serg76 @ Dec 10 2010, 21:44) *
вам может понятно, другим не очень, зачем мне разбираться в чужом коде, если для объяснения достаточно написать два предложения или привести одно выражение. ну да ладно, ваши проблемы в конце концов.


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


проверить можно только посчитав BER или же визуально на какой-нибудь заранее известной ПСП


Двумя предложениями не получится. Код он не врёт, в отличии от коментариев.

Диффкодирование отсутствует, но если фаз необдносзачность это когда квадрат созвездия может встать в одну из 4 фаз (0, 90, 180, 270)? то для устранения этого эффекта я модему сигнализирую есть или нет фреймовая синхронизация. Если не сложно выложите ссылку на алгоритмы устранение фазовую неоднозначность в метриках?

По BER проверял, сошлось, визуально это как?, ну до этого я просто перебирал всё возможные значения, и смотрел на соответствие.

Serg76
Цитата(brig01 @ Dec 13 2010, 08:18) *
Двумя предложениями не получится. Код он не врёт, в отличии от коментариев.

Диффкодирование отсутствует, но если фаз необдносзачность это когда квадрат созвездия может встать в одну из 4 фаз (0, 90, 180, 270)? то для устранения этого эффекта я модему сигнализирую есть или нет фреймовая синхронизация. Если не сложно выложите ссылку на алгоритмы устранение фазовую неоднозначность в метриках?

По BER проверял, сошлось, визуально это как?, ну до этого я просто перебирал всё возможные значения, и смотрел на соответствие.

Как раз код то и может врать sm.gif, а вот математика вряд-ли.

По поводу фазовой неоднозначности вы все правильно делаете, так в реальной жизни и поступают.
des00
Цитата(Serg76 @ Dec 8 2010, 09:57) *
Имеется ввиду, что главное правило при построении манипуляционного кода заключается в том, что бинарные значения соседних отсчетов в сигнальном созвездии не должны отличаться более, чем на один бит, иначе при возникновении ошибки в принятом символе Вы сразу можете получить несколько ошибочных бит, которые декодеру будет сложнее исправить.

немного офттопик. Мучает меня один вопрос про использование кодов Грея ("созвездия по грею", как например в атаче). С одной стороны понятно, что использование этого кода имеет определенные перспективы, но с другой стороны рассмотрим модем. Можем взять один из модемов уважаемого petrov. В модуляторе, перед мапером ставят кодер грея, затем в демодуляторе, после жесткого решения, ставят декодер грея. Этим на корню убивая эффект от применения этого кода, т.к. берется функция от битов жесткого решения. И пусть ошибка в символе будет только в одном бите, после прохождения декодера грея она может преобразоваться в многобитную ошибку. Вот пример на созвездии в атаче : пусть передавалась точка 1111 (до кодера грея это было числом 1010), а принята точка 0111 (после декодера это будет число 0110). Вместо ошибки в одном бите, мы получили ошибку в двух битах. Так какой тогда смысл в таком кодировании созвездия?

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

Спасибо.

ЗЫ. вижу единственный вариант когда такое кодирование имеет смысл. Это поставить кодирование грея не на входе мапера, а на входе кодера. Тогда декодирование грея можно осуществлять после основного декодера. Но как тогда использовать например, байтовый кодер рида соломона для QPSK или QAM32 остается не понятным.
thermit
Цитата
des00:
Так какой тогда смысл в таком кодировании созвездия?


Каждой точке ставится в соответствие n-разрядный код. Причем так, чтобы чтобы расстояние хэмминга до кодов ближайших точек было равно 1. Имея мягкие решения после демодуляции и демаппинга точки в код получим ошибку в одном бите кодового слова в случае попадания на ближайшую к правильной точку. Чего тут еще декодировать?
vadimuzzz
Цитата(des00 @ Jan 25 2011, 20:56) *
Так какой тогда смысл в таком кодировании созвездия?

смысл в том, что малая ошибка в канале приводит к малой ошибке в решении, большая - к большой. исправление ошибок, конечно, никто не отменял
Serg76
Цитата(des00 @ Jan 25 2011, 17:56) *
В модуляторе, перед мапером ставят кодер грея, затем в демодуляторе, после жесткого решения, ставят декодер грея. Этим на корню убивая эффект от применения этого кода, т.к. берется функция от битов жесткого решения. И пусть ошибка в символе будет только в одном бите, после прохождения декодера грея она может преобразоваться в многобитную ошибку.

Не может преобразоваться. Похоже здесь какое-то недопонимание. Что такое маппинг? Это отображение Ваших квадбитов на сигнальном созвездии в соответствии с манипуляционным кодом, который Вы хотите применить. Теперь посмотрим со стороны демодулятора, а точнее на его решающее устройство. Как это должно делаться. В решающем устройстве демодулятора хранится таблица с эталонной конструкцией сигнального созвездия, такая же как и в модуляторе. РУ демодулятора принимает решение о переданном символе исходя из правила минимума Эвклидова расстояния (или для простоты его квадрата) между принятым вектором сигнального отсчета (символа) и ближайшего из эталонной кодовой конструкции и ставит в соответствие этому (эталонному) значению жесткое решение в соответствии с манипуляционным кодом. Правда в случае когерентного приема может возникнуть проблема с неоднозначностью фазы, но она устраняется на этапе помехоустойчивого декодера либо диффкодированием. Можно сделать еще и по-другому, когда РУ демодулятора работает в последовательном коде, тогда после получения жесткого решения, битовый поток необходимо будет перекодировать в соответствии с тем же самым мапипуляционным кодом (но при этом надо будет иметь представление как построен последовательный код, чтобы правильно выполнить соответствующую перекодировку). Это что касается принятия жесткого решения. При получении мягкого решения необходимо просто квадратуры с выхода РУ пропустить через квантователь и вообще не заморачиваться каой там манипуляционный код применялся. Эту проблему уже надо будет решать на этапе декодирования.

Кстати, в приведенном Вами сигнальном созвездии правило Грея выполняется.
des00
Цитата(thermit @ Jan 25 2011, 09:34) *
Каждой точке ставится в соответствие n-разрядный код.

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

Цитата(vadimuzzz @ Jan 25 2011, 09:38) *
смысл в том, что малая ошибка в канале приводит к малой ошибке в решении, большая - к большой. исправление ошибок, конечно, никто не отменял

это то понятно, вопрос стоит в другом.

Цитата(Serg76 @ Jan 25 2011, 10:31) *
Не может преобразоваться.

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

Цитата
Кстати, в приведенном Вами сигнальном созвездии правило Грея выполняется.

да, выполняется, это взято из даташита на чипы AHA. Если не сложно, дайте комментарии к приведенному мной численному примеру.
vadimuzzz
по-моему вы путаете алгоритм с конкретной реализацией. в вашей же картинке кубиты - исходные данные - преобразуются маппером в отсчеты квадратур. как раз по правилу Грея - соседние точки в созвездии отличаются в одном бите исходных данных.
Serg76
2 des00 поддерживаю vadimuzzz

Цитата(des00 @ Jan 25 2011, 19:42) *
если мы говорим о символах в радиоканале, то не спорю. Все так как вы говорите. Но мой вопрос касался не символов в радиоканале, а исходном битовом потоке (сырых данных). Как мне видиться функция преобразования данных в символы(кодировние и декодирование грея, перед мапером) приводит к тому, что количество битовых ошибок в исходных данных увеличиться.

Че-то я не совсем Вас понимаю. Зачем делать еще какие-нибудь промежуточные операции перекодировки, если Вы сразу Ваш исходный поток преобразовываете в отсчеты квадратур по правилу Грея, которое Вы привели на рисунке. Таким же образом делаете и на приемном конце. Можно использовать промежуточную перекодировку, но в случае если у Вас в решающем устройстве прописан какой-нибудь последовательный манипуляционный код, который не соответствует кодировке Грея. А вот потом уже этот битовый поток надо пропустить через декодер, который преобразует Ваш последовательный код в код Грея

2 des00 По-моему сейчас я начинаю понимать, что Вы хотите сказать. Подобная проблема у меня возникла, когда я делал TDMA демодулятор. Так там действительно при обнаружении преамбулы коррелятором необходимо было символы синхропоследовательности перекодировать из кода Грея в последовательный код, т.е. так как они идут в радиоканале, иначе коррелятор не отрабатывает. Может Вы это имеете ввиду?
thermit
Цитата
des00:
в приведенном мной численном примере, логика такого соответствия дает размножение битовой ошибки по сырым данным


Ваш численный пример содержит 2 бестолковые операции: 1 - кодер грея (чего там кодировать, если решетка уже составлена согласно c кодом грея) 2 - декодер грея. Дальнейшие рассуждения о размножении ошибок смысл теряют.
des00
Цитата(vadimuzzz @ Jan 25 2011, 10:48) *
по-моему вы путаете алгоритм с конкретной реализацией............

Цитата(thermit @ Jan 25 2011, 14:53) *
Ваш численный пример содержит 2 бестолковые операции:...........

Чтобы внести ясность, давайте рассмотрим модель модема от petrov qam_fb_gardner_symbol_farrow_sync_fb_phase_sync_agc_2007_06_18.mdl, внизу скрины модулятора и демодулятора, а именно как исходный битовый поток переводится в символы радиоканала. Как мы видим, в этом модеме исходный битовый поток (нас же интересует передача именно данных), обрабатывается по грею и только потом поступает в маппер. На приемном конце происходит тоже самое. Т.е. свойством отображения созвездия по грею обладает не сборка маппер-демаппер, а сборка кодер грея - мапер - демапер - декодер грея. Вот именно от такой сборки я выигрыша и не вижу. Потому что ошибка в один бит в символе, в демапере, после декодера грея может привести к ошибке в двух битах в исходных данных.

Таким образом, я считаю, для того, что бы от созвездия по грею получить выигрыш, нужно либо ставить его до основного кодера (LDPC например) либо интегрировать это свойство в маппер демапер. Рассмотрим маппер. Для начала возьмем нативное созвездие, для реализации которого требуется минимум логики(созвездие в атаче). Функция отображения для этого созвездия примитивнейшая(язык псевдо си)
Код
bit [3 : 0] data;
bit [1 : 0] dat_re, dat_im;
dat_re = data[1 : 0];
dat_im = data[3 : 2];
re = (dat_re[1] ? 2 : -2) + (dat_re[0] ? 1 : -1);
im = (dat_im[1] ? 2 : -2) + (dat_im[0] ? 1 : -1);

демапер для такого созвездия тоже примитивнейший
Код
bit [7 : 0] vector_re, vector_im; // let it be 8 bit signed vectors, and decision levels is maximum
bit [3 : 0] data;
bit [1 : 0] dat_re, dat_im;

dat_re[1] = !vector_re[7]; // take signum bit
dat_re[0] =  vector_re[6];

dat_im[1] = !vector_im[7]; // take signum bit
dat_im[0] =  vector_im[6];

data[1 : 0] = dat_re;
data[3 : 2] = dat_im;


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

Цитата(Serg76 @ Jan 25 2011, 11:23) *
Че-то я не совсем Вас понимаю.

я пытаюсь посмотреть на связку модем + кодер, с точки зрения их оптимальной работы друг с другом и при этом оценить ресурсы которые требуются для реализации этой оптимальности. Помимо этого я не вижу логических обоснований вот этого
Цитата
1. Коды грея я использую. Это улучшает ВER всего потока в два раза.

при том что автор, как я понял, поставил кодер грея перед мапером и декодер грея после демапера.
vadimuzzz
нативное созвездие явно не оптимально. например, см. внутренние точки (а для них С/Ш самый хреновый, да) - ошибка в одну позицию в созвездии приведет к 2 битовым ошибкам. и демаппером не понимаю, в чем вопрос. берем квадратуру, пусть re. [-3, -1, 1, 3] <-> [00, 01, 11, 10], для мнимой - аналогично. в чем проблема? если мягкое решение надо, см. , например, аттач
des00
Цитата(vadimuzzz @ Jan 25 2011, 23:57) *
нативное созвездие явно не оптимально. например, см. внутренние точки (а для них С/Ш самый хреновый, да) - ошибка в одну позицию в созвездии приведет к 2 битовым ошибкам.

все так, но к таким же ошибкам приведет наличие кодера грея перед нативным созвездием.
Цитата
берем квадратуру, пусть re. [-3, -1, 1, 3] <-> [00, 01, 11, 10], для мнимой - аналогично. в чем проблема?

проблема в алгоритме построения демапера. если мы берем биты [7:6] выходных векторов и ставим функцию преобразования бит(чтобы вектор 1 конвертировать в точку 11), то фактически мы накладываем на эти биты декодер грея. Что thermit назвал бестолковой операцией. Или я не прав?
vadimuzzz
Цитата(des00 @ Jan 26 2011, 12:05) *
все так, но к таким же ошибкам приведет наличие кодера грея перед нативным созвездием.

так это врожденный дефект нативного созвездия. код грея делает ровно одну вещь - увязывает хеммингово расстояние с евклидовым. в ваших обозначениях выше (кстати, с какого перепугу re и im - 2-битовые?)
CODE

re "нативный код" грей
3(3'b011) 11 10
1(3'b001) 10 11
-1(3'b111) 01 01
-3(3'b101) 00 00

я не вижу, чем здесь нативный код проще

Цитата(des00 @ Jan 26 2011, 12:05) *
проблема в алгоритме построения демапера.

демаппер использует симметрии - относительно 0 и относительно +/-2
des00
либо я объяснять не умею, либо туплю. Зайду с другой стороны. Выше мне ответили что дополнительные преобразования данных перед мапером/демапером не нужны и это бестолковые операции. Тогда рассмотрим следующее (в псевдокоде похожий на нативный верилог) :

нативный маппер/демапер для половинки КАМ16
Код
bit [1 : 0] dat2map
signed bit [2 : 0] vector;
bit [1 : 0] dat4demap;

case (dat2map) // native mapper
  2'b00 : vector = -3;  // 101
  2'b01 : vector = -1;  // 111
  2'b10 : vector =  1;  // 001
  2'b11 : vector =  3;  // 011
endcase

case (vector[2:1]) // native demapper :: dat4demap = {~vector[2], vector[1]}
  2'b11 : dat4demap = 2'b01;
  2'b10 : dat4demap = 2'b00;
  2'b00 : dat4demap = 2'b10;
  2'b01 : dat4demap = 2'b11;
endcase


греевский мапер демапер для половинки КАМ16
Код
case (dat2map_gray) // gray mapper
  2'b00 : vector = -3;  // 101
  2'b01 : vector = -1;  // 111
  2'b10 : vector =  3;  // 011
  2'b11 : vector =  1;  // 001
endcase

case (vector[2:1]) // gray demapper :: dat4demap = {~vector[2], ~vector[2] ^ vector[1]}
  2'b11 : dat4demap_gray = 2'b01;
  2'b10 : dat4demap_gray = 2'b00;
  2'b00 : dat4demap_gray = 2'b11;
  2'b01 : dat4demap_gray = 2'b10;
endcase

Сделав так (добавив функции преобразования на входе/выходе)
Код
dat2map_gray   = bin2gray(dat2map);
......native mapper/demapper
dat4demap_gray = gray2bin(dat4demap);

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

Теперь предметные вопросы которые меня интересуют :
1. Так являются ли мапер с преобразованием и греевский мапер эквивалентными?
2. Есть ли разница в BER у них?
3. Если результаты эквивалентны, почему thermit назвал кодер и декодер грея бестолковыми операциями?

Наверное надо было сразу задать вопрос именно так.
petrov
Цитата(des00 @ Jan 26 2011, 14:10) *
3. Если результаты эквивалентны, почему thermit назвал кодер и декодер грея бестолковыми операциями?


Эквивалентно это всё, можно сразу входные биты маппить в нужные точки созвездия кодированного по грею, можно отдельно кодировать по грею и маппить в созвездие пронумерованное по порядку. В модельках делал так чтоб видно было вот он код грея.
Serg76
Ну вот теперь вроде как все окончательно прояснилось sm.gif
des00
Цитата(petrov @ Jan 26 2011, 05:35) *
Эквивалентно это всё, можно сразу входные биты маппить в нужные точки созвездия кодированного по грею, можно отдельно кодировать по грею и маппить в созвездие пронумерованное по порядку. В модельках делал так чтоб видно было вот он код грея.

теперь понял, в голове отложил. воспринимать кодер грея + маппер и декодер + демапер надо как одно целое. спасибо.
thermit
Цитата
des00:
Если результаты эквивалентны, почему thermit назвал кодер и декодер грея бестолковыми операциями?


Потому, что маппер в том посте уже с греем.
В остальном - операции конечно, эквивалентны.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.