thermit 1 5 сентября, 2018 Опубликовано 5 сентября, 2018 · Жалоба Если я правильно понял, то таким образом можно 12 комплексных отсчетов преобразовать в 24 вещественных для реализации максимального правдоподобия? Да. А можно сразу считать корреляционные метрики для комплексных и выбирать максимальную по модулю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
soldat_shveyk 2 5 сентября, 2018 Опубликовано 5 сентября, 2018 · Жалоба А можно сразу считать корреляционные метрики для комплексных Да я вроде так и делал. Но получилось так же , как и при жестком демодуляторе. А как правильно считать корреляционную метрику? Например для пакета из четырех бит данных [d0 d1 d2 d3] я получил два комплексных символа (a1+jb1) и (a2+jb2). Что дальше? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 5 сентября, 2018 Опубликовано 5 сентября, 2018 · Жалоба Да я вроде так и делал. Но получилось так же , как и при жестком демодуляторе. А как правильно считать корреляционную метрику? Например для пакета из четырех бит данных [d0 d1 d2 d3] я получил два комплексных символа (a1+jb1) и (a2+jb2). Что дальше? сумма произведений комплексных отсчетов одного из возможных кодовых слов и комплексно сопряженного принятого кодового слова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
soldat_shveyk 2 6 сентября, 2018 Опубликовано 6 сентября, 2018 · Жалоба Хм.. Странно. Я так и делал. При совпадающих пакетах метрика будет равна 12 + j0. При не совпадающих +/-4 +/- j*4, так как кодовое расстояние равно 8. В процессе вычисления метрик делал выбор максимума. Но на тестах по BER получил результат, аналогичный жесткому декодированию. В чем подвох? Отдельный расчет корреляционной метрики для комплексных отсчетов при совпадении кодовых слов: % 24-bit Data Packet txb = randi([0 1], 1, 24); % QPSK Modulator tx_signal = zeros(1, 12); for k = 1:12 dibit = [txb(2*k - 1) txb(2*k)]; tx_signal(k) = sqrt(2) / 2 * ((dibit(1) * 2 - 1) + 1j * (dibit(2) * 2 - 1)); end % Rx packet = Tx packet + white noise rx_signal = awgn(tx_signal, 30, 'measured'); % Calculation of the correlation metric for complex samples metric = abs(sum(conj(rx_signal) .* tx_signal)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 6 сентября, 2018 Опубликовано 6 сентября, 2018 (изменено) · Жалоба Хм.. Странно. Я так и делал. При совпадающих пакетах метрика будет равна 12 + j0. При не совпадающих +/-4 +/- j*4, так как кодовое расстояние равно 8. В процессе вычисления метрик делал выбор максимума. Но на тестах по BER получил результат, аналогичный жесткому декодированию. В чем подвох? Отдельный расчет корреляционной метрики для комплексных отсчетов при совпадении кодовых слов: % 24-bit Data Packet txb = randi([0 1], 1, 24); % QPSK Modulator tx_signal = zeros(1, 12); for k = 1:12 dibit = [txb(2*k - 1) txb(2*k)]; tx_signal(k) = sqrt(2) / 2 * ((dibit(1) * 2 - 1) + 1j * (dibit(2) * 2 - 1)); end % Rx packet = Tx packet + white noise rx_signal = awgn(tx_signal, 30, 'measured'); % Calculation of the correlation metric for complex samples metric = abs(sum(conj(rx_signal) .* tx_signal)) Не знаю. Корреляции, и выбор корреляции с максимальной вещественной частью (не модулем. это важно. Про модуль я машинально написал). Изменено 6 сентября, 2018 пользователем thermit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
soldat_shveyk 2 7 сентября, 2018 Опубликовано 7 сентября, 2018 · Жалоба thermit, спасибо, попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 10 сентября, 2018 Опубликовано 10 сентября, 2018 · Жалоба thermit, спасибо, попробую. LLR метрики для битов посчитайте, в вашем случае они равны квадратурам, с соответствующим знаком. Потом просто сложить с учетом знака модулирующей последовательности и выбрать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
soldat_shveyk 2 10 сентября, 2018 Опубликовано 10 сентября, 2018 · Жалоба Сделал мягкий декодер Чейза, BER стал лучше на порядок в диапазоне SNR 3..6 дБ. Всем спасибо за помощь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
soldat_shveyk 2 19 сентября, 2018 Опубликовано 19 сентября, 2018 · Жалоба Продолжу тему. Понаблюдал, как работает Чейз при малом SNR (0..2 дБ). Иногда получается так, что среди 16 гипотез кода есть правильная, но у нее не минимальная метрика, и соответственно она отбрасывается, а выбирается ошибочная. Посему вопрос - всегда ли правильный код будет иметь минимальную метрику? Я использую код Голея 24,12 с кодовым расстоянием 8. На приеме беру 16 мягких решений. Пусть для простоты будет BPSK, мягкие решения = сами символы. Выбираю 4 бита с минимальной достоверностью (abs() от принятых символов) и путем перебора их позиций порождаю 16 гипотез кода, которые декодирую и выбираю код с минимальной метрикой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 19 сентября, 2018 Опубликовано 19 сентября, 2018 · Жалоба А вы попробуйте сравнить процедуру Чейза и прямой перебор. Информационная часть у вас короткая, должно получиться быстро. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 20 сентября, 2018 Опубликовано 20 сентября, 2018 · Жалоба Посему вопрос - всегда ли правильный код будет иметь минимальную метрику? Нет ни всегда. При большом количестве ошибок, евклидово расстояние до правильного слова, может стать большим чем до другого кодового слова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
soldat_shveyk 2 20 сентября, 2018 Опубликовано 20 сентября, 2018 · Жалоба А вы попробуйте сравнить процедуру Чейза и прямой перебор Пробовал, Чейз дает меньший BER. Да и 4096 IF-ов в коде прямого перебора тормозят процесс. Нет ни всегда. При большом количестве ошибок, евклидово расстояние до правильного слова, может стать большим чем до другого кодового слова. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 20 сентября, 2018 Опубликовано 20 сентября, 2018 · Жалоба Это, разумеется, не верно, т.к. прямой перебор выдает максимально правдоподобную оценку, а Чейз - ее аппроксимацию. Разница в пользу мп-оценки будет более заметна при низких отношениях сигнал-шум. Пробовал, Чейз дает меньший BER. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
soldat_shveyk 2 20 сентября, 2018 Опубликовано 20 сентября, 2018 · Жалоба Это, разумеется, не верно, т.к. прямой перебор выдает максимально правдоподобную оценку, а Чейз - ее аппроксимацию Я делал не перебор максимального правдоподобия, а перебор 4096 кодов Голея после жесткого решения. Выбирал результат по минимуму sum(bitxor()). На полноценное максимальное правдоподобие ресурсы решили не тратить, да и задержка приличная получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gegel 0 9 ноября, 2018 Опубликовано 9 ноября, 2018 · Жалоба Здравствуйте! Давно хотел найти С-код "мягкого" Голея, даже как-то спрашивал здесь на форуме, но безрезультатно. Почитав тему, решил, что быстрее будет сделать самому, чем найти готовый. Писал с учетом использования на Cortex M0, поэтому экономил вычислительные ресурсы. Код в аттаче, там же таблица с результатами тестов. Прошу помощи в оценке полученных результатов: приемлемо оно или нет. Вкратце: реализовал 4 режима Golay(24,12): 0-жесткое декодирование; 1-мягкое, до 4 ошибок; 2-мягкое, до 5 ошибок и 3-мягкое до 6 ошибок. Скорость работы сравнивал с жеским декодированием и замедление зависит от входной BER: при 5.9% - x2.25, 10.3% - x5.0, 14.35% - x7.75, 50%(шум) - x 11.25. Сравнимал выходной BER в режимах 0 и 3 при фиксированных значениях входного BER, подробнее см. в таблице. ПС: код готовился для уже функционирующего демодулятора, поэтому на вход подаются 24 "жесткие биты" в виде трехбайтного масива (LSB first) и абсолютные значения LLR в диаппазоне 0-255 в виде 24-байтного массива. Для тестирования генерировал случайные 12 бит, кодировал в 24-битное слово, модулировал как 63/-63, затем суммировал с шумом (rand()%A - A/2). Амплитуду шума A выбирал в диаппазоне 60-89, смотрел исходное к-во ошибок. Декодировал и смотрел результирующее к-во ошибок. Также считал процет ошибочных слов (содержащих хотя-бы одну ошибку). Подскажите, верно ли я тестировал и получил ли приемлемые результаты как компромисс между силой коррекции и производительностью, или же можно было сделать гораздо лучше? soft_golay.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться