Jump to content
    

Вытащить биты из фазового демодулятора

komah

До железа ещё дожить надо, если алгоритмы ЦОС не отработаны, никчему ещё наваливать лишние сущности, проверили на синтетических сигналах с контролируемыми параметрами, достигаем теоретических пределов, например кривой BER, дальше можно переносить на средство обработки.

Share this post


Link to post
Share on other sites

16 hours ago, repstosw said:

Корона не жмёт? :)))

Нда. Образование неофитов - неблагодарное дело. 

Share this post


Link to post
Share on other sites

20 hours ago, komah said:

2. Ресемплер (интерполятор) - на каждый символ должно приходиться целое число отсчетов, например 2.

Требование к целому числу отсчётов - это для выходных данных, которые подаются на интерполятор? Или это интерполятор выдаёт целое число отсчётов?

В приведённых последних картинках, у меня на 1 символ может приходиться 11...13 отсчётов.  Что делать?

 

Quote

3. Выбрать метод оценивания ошибки синхронизации. Выбор зависит от числа отсчетов на символ и формы символа (ИХ фильтра). Если предполагается передача настроечной последовательности в каждом пакете, то выбор богаче, но я с такими вариантами дела не имел. Из NDA самые популярные алгоритмы -  Early-Late и Гарднер. Если использовать решения о принятых символах (обратную связь)  - Zero-Crossing.

Опять же - какое число отсчётов на символ имеется ввиду?  До- или после- интерполятора?

Прочтитал про TED Гарднера, увидел на картинках, что для его использования - последовательность данных должна иметь 2 отсчета на символ.  Питается он этими отсчётами после интерполятора, исходя из структурной схемы, которая приведена в статье Чхоудхури.

Получается мне нужен ресемплер в режиме дециматора что-ли?  Чтобы свои 11..13 отсчётов превратить в 2 отсчёта для TED?

Чё-то каша в голве у меня, пазл не складывается.

 

И вообще, с какими отсчётами мне работать?  С фазой или с мгновенной частотой?   Если с фазой, то насколько критичны разрывы фазы? Надо ли делать unwrap перед входом на интерполятор.

Проще говоря - у меня есть отсчёты фазы , будем пока считать matched Filter внутри микросхемы трансивера.  Что подавать на интерполятор?

 

Quote

4. В синхронизаторе присутствует интерполятор (например, на основе pfb), который должен выдавать значение в зависимости от полученной оценки ошибки синхронизации (в пределах интервала времени между отсчетами).

Тоже непонятно.  В статье ДВЕ структурные схемы:  с одним интерполятором и с двумя.  Какую надо использовать?

И собственно, что мы этой схемой пытаемся достичь?  Чтобы число отсчётов на каждый символ было одинаковым и постоянным?  Зачем это нужно для 2FSK?  Её можно декодировать даже на глаз, не применяя сложные схемы по стабилизации символьной скорости.  При условии, если число отсчётов на символ достаточно большое - в моём случае 11..13 отсчётов.

 

Такое  даже ребёнок сдекодирует.   Амплитуды там вообще по барабану, это же не КАМ-256 какой-нибудь, а всего лишь 2 FSK.   Там только накапливать отсчёты с одинаковым знаком, резать их на биты, а остаток при смене полярности - решать: преобразовывать ли в бит или пропускать...   Реализацию на Си я давал уже здесь.  Алгоритм работает на моём сигнале.

 

Quote

6. Оценка ошибки фильтруется простейшим БИХ - фильтром. Коэффициенты определяют скорость подстройки синхронизатора. 

Что за БИХ фильтр?  RC-цепочка интегратор?   Какая у него реализация - функция выхода от входа описанная в алгоритмах - какая?  Есть ли окно для эффекта памяти, какие коэффициенты?

 

Quote

9. В итоге, при исходных 8,3 отсчета на символ, синхронизатор будет выдавать 10 выходных отсчетов на 83 входных. То есть, на каждый входной отсчет, будет получаться от 0 до N выходных. N зависит от реализации. 

Откуда взялись 83 вх и 10 вых отсчётов?  Почему именно столько надо?

 

Quote

Вот хорошее начало:

https://wirelesspi.com/phase-locked-loop-pll-for-symbol-timing-recovery/

Без восстановления тактовой все остальное не имеет смысла. А в учебниках про это пишут мало и неправильно.

Опять же - зачем для 2FSK восстанавливать тактовую?  Когда биты хорошо детектятся  визуально перепадами и номинальным числом отсчётов 11..13 ?  Всё что меньше - шум и мусор, всё что больше - режется на последовательности из одинаковых бит.

 

И там он вообще 2 схемы привёл.  И расписал в общих чертах алгоритм.

И самого главного нет - где имплементация на каком-нибудь языке?  На Си предпочтительнее.

Я вот например - не понимаю как должен быть программно описан  matching Filter p(-n*Ts).  предполагаю что это приподнятый косинус с которого квадратный корень...

 

Пока у меня в голове каша, если честно.  И непонятно вообще - нужно ли в моём случае это делать с 2FSK с 10 отсчётами на бит.

Share this post


Link to post
Share on other sites

repstosw

Требование к целому числу отсчётов - это для выходных данных, которые подаются на интерполятор? Или это интерполятор выдаёт целое число отсчётов?

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

_

Получается мне нужен ресемплер в режиме дециматора что-ли?  Чтобы свои 11..13 отсчётов превратить в 2 отсчёта для TED?

Если 11 отсчётов на символ, для FSK2 можно ничего не интерполировать, да для гарднера будете децимировать 11 до двух отсчётов на символ. Но разумеется частота дискретизации не должна резко скакать, на этом символе 11 отсчётов, на следующем 13, должна быть стабильной.

_

Что за БИХ фильтр?  RC-цепочка интегратор?   Какая у него реализация - функция выхода от входа описанная в алгоритмах - какая?  Есть ли окно для эффекта памяти, какие коэффициенты?

БИХ эквивалентная схема замкнутой петли. Может быть достаточно первого порядка, т. е. с одним интегратором, которым является сам NCO, с выхода детектора ошибки через один коэффициент управляем NCO. Коэффициент подбирается как компромисс между фильтрацией шума и временем установления.

_

Такое  даже ребёнок сдекодирует. Такое  даже ребёнок сдекодирует.   Амплитуды там вообще по барабану, это же не КАМ-256 какой-нибудь, а всего лишь 2 FSK.   Там только накапливать отсчёты с одинаковым знаком, резать их на биты, а остаток при смене полярности - решать: преобразовывать ли в бит или пропускать...   Реализацию на Си я давал уже здесь.  Алгоритм работает на моём сигнале.

При наивной реализации будут большие потери в лучшем случае, в сигнале присутствует и МСИ и большой шум, отсутствие символьных переходов, для устойчивого взятия символьного отсчёта в оптимальной точке необходимо усреднение по десяткам-сотням символьных интервалов.

_

И самого главного нет - где имплементация на каком-нибудь языке?  На Си предпочтительнее.

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

 

Share this post


Link to post
Share on other sites

 

Выше petrov уже в основном ответил, добавлю от себя

4 часа назад, repstosw сказал:

Требование к целому числу отсчётов - это для выходных данных, которые подаются на интерполятор? Или это интерполятор выдаёт целое число отсчётов?

Я разделил схему на два интерполятора.  Задача первого - из имеющихся, например, 12,5 отсчета на символ, получить целое число, например, 4. Без привязки к моменту тактирования. Второй интерполятор уже должен вычислить значение между отсчетами в оптимальный момент. Мне так удобнее, но в общем это не лучший вариант и я даже знаю, почему.

5 часов назад, repstosw сказал:

Опять же - какое число отсчётов на символ имеется ввиду?  До- или после- интерполятора?

До первого интерполятора. Если у него на входе 1,2 отсчета на символ, делать из них 10 не имеет смысла.

5 часов назад, repstosw сказал:

И вообще, с какими отсчётами мне работать?  С фазой или с мгновенной частотой?

С мгновенной частотой. Еще точнее, с сигналом PAM с выхода частотного дискриминатора. 

5 часов назад, repstosw сказал:

В статье ДВЕ структурные схемы:  с одним интерполятором и с двумя.  Какую надо использовать?

Там еще несколько статей в продолжение - конкретные варианты TED рассматриваются. С двумя - это алгоритм на основе максимума правдоподобия. Теоретически, наверное, оптимальный. Для определенных условий.

5 часов назад, repstosw сказал:

И собственно, что мы этой схемой пытаемся достичь?  Чтобы число отсчётов на каждый символ было одинаковым и постоянным?  Зачем это нужно для 2FSK?  Её можно декодировать даже на глаз, не применяя сложные схемы по стабилизации символьной скорости.  При условии, если число отсчётов на символ достаточно большое - в моём случае 11..13 отсчётов.

В статье нарисована глазковая диаграмма. Наша задача - взять отсчет в точке максимального раскрытия этого глаза. И это не зависит от вида модуляции. Не применяя схем по стабилизации тактовой, мы к концу пакета (а может и раньше) уползем на границу между символами. Если при оптимальной синхронизации и почти без шумов в вашем сумматоре накапливается значение около 12, то сместившись на  6 отсчетов мы рискуем получить 0. Как насчет помех? Кстати, декодируя на глаз, тактовую тоже приходится восстанавливать. И у вас это делается - по переходам через 0.  

 

5 часов назад, repstosw сказал:

Что за БИХ фильтр? 

out = (1.0-alpha)*out + alpha*current_sample;

alpha обычно 0,0001..0,001

5 часов назад, repstosw сказал:

Откуда взялись 83 вх и 10 вых отсчётов?  Почему именно столько надо?

Ну, коэффициент децимаиции 8,3 : 1. Я хотел обратить внимание, что синхронизатор может  выдавать отсчеты асинхронно, главное, чтобы количество было правильным.

 

5 часов назад, repstosw сказал:

Опять же - зачем для 2FSK восстанавливать тактовую?  Когда биты хорошо детектятся  визуально перепадами и номинальным числом отсчётов 11..13 ?

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

 

5 часов назад, repstosw сказал:

Я вот например - не понимаю как должен быть программно описан  matching Filter p(-n*Ts).  предполагаю что это приподнятый косинус с которого квадратный корень...

Лучше какой-нибудь готовой библиотекой пользоваться. Например, liquid-dsp.

Share this post


Link to post
Share on other sites

Хотел поставить себе MATLAB последней версии(2023) Trial, но к сожаелению под Win7 он не идёт.

А Matlab 6.5 и 2011R - слишком стары, и они не тянут свежие примеры:  отстутствует компонент comm.*.

Попробовал запускать модели от petrov в своих матлабах,   они открываются, но при симуляции валится много ворнингов.  Проблема в кривости моих Matlab'ов или в отсутствии знаний как правильно запускать модели.

Смотрел в сторону Octave.  Разочаровался что под него примеров мало.  Ищу примеры Symbol Clock Recovery.

Принял решение остановиться на GNU Radio.  Он бесплатен и не выёживается на моём ПК.

Для Matlab (крякнутые версии) приходится переводить часы назад, иначе не запускается.  А когда переводишь часы назад - интернет не работает (SSL-сертификаты).

Поэтому остаётся либо GNU Radio, либо через Python фреймворк работать.  Под них куча примеров.

GNU Radio хорош ещё тем, что генерит сорцы на Си и сам открытый - можно на раздербан пустить - в плане вытащить алгоритм/фильтры...

 

petrov, komah спасибо за ответы!

Edited by repstosw

Share this post


Link to post
Share on other sites

4 минуты назад, repstosw сказал:

Хотел поставить себе MATLAB последней версии(2023) Trial, но к сожаелению под Win7 он не идёт.

А Matlab 6.5 и 2011R - слишком стары, и они не тянут свежие примеры:  отстутствует компонент comm.*.

Попробовал запускать модели от petrov в своих матлабах,   они открываются, но при симуляции валится много ворнингов.  Проблема в кривости моих Matlab'ов или в отсутствии знаний как правильно запускать модели.

Смотрел в сторону Octave.  Разочаровался что под него примеров мало.  Ищу примеры Symbol Clock Recovery.

Принял решение остановиться на GNU Radio.  Он бесплатен и не выёживается на моём ПК.

Для Matlab (крякнутые версии) приходится переводить часы назад, иначе не запускается.  А когда переводишь часы назад - интернет не работает (SSL-сертификаты).

Поэтому остаётся либо GNU Radio, либо через Python фреймворк работать.  Под них куча примеров.

GNU Radio хорош ещё тем, что генерит сорцы на Си и сам открытый - можно на раздербан пустить - в плане вытащить алгоритм/фильтры...

 

petrov, komah спасибо за ответы!

 

Можно поставить 2018. Там все есть включая корвалол. Под 7-х64 работает. Советую почитать матлабские доки. Там много чего есть.

Share this post


Link to post
Share on other sites

repstosw

Попробовал запускать модели от petrov в своих матлабах,   они открываются, но при симуляции валится много ворнингов.  Проблема в кривости моих Matlab'ов или в отсутствии знаний как правильно запускать модели.

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

_

Для Matlab (крякнутые версии) приходится переводить часы назад, иначе не запускается.  А когда переводишь часы назад - интернет не работает (SSL-сертификаты).

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

_

Принял решение остановиться на GNU Radio.  Он бесплатен и не выёживается на моём ПК.

Это всё не то. Ставьте подходящую версию матлаб, как thermit выше писал, они точно есть нормально работающие.

_

GNU Radio хорош ещё тем, что генерит сорцы на Си и сам открытый - можно на раздербан пустить - в плане вытащить алгоритм/фильтры...

Матлаб тоже позволяет генерировать C и HDL, но здесь речь о понимании не сильно сложных вещей, если понимание есть, то написать их ничего не стоит.

Share this post


Link to post
Share on other sites

21 час назад, repstosw сказал:

GNU Radio хорош ещё тем, что генерит сорцы на Си

Сомнительная информация. GNU Radio генерит скрипт на питоне на основе блок-схемы. Но сами библиотеки в основном на с++. Код открыт и естественно его можно использовать. Но это не самый простой вариант, особенно для переноса на слабое железо. Зачастую выгоднее просто разобраться с алгоритмом (посмотрев его в том же GNU Radio) и реализовать уже на основе своих базовых элементов. Насчет фильтров - в Матлабе есть инструмент для их расчета. Можно им пользоваться, если характеристика фильтра предполагается неизменной. Просто скопировать оттуда коэффициенты в код на Си.

10 часов назад, petrov сказал:

Матлаб тоже позволяет генерировать C и HDL

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

Share this post


Link to post
Share on other sites

komah

какого качества там HDL

Качество цифровой схемы в руках разработчика.

Share this post


Link to post
Share on other sites

Поигрался в GNU Radio.  Завёл свои отсчёты фазы в программу, привёл к нужному типу данных и нашёл мгновенную частоту как разность фаз.

На этом лыжи дальше не едут: не получается восстановить частоту символов с помощью штатного блока Symbol Sync.  У меня на каждый бит приходится 10...12 отсчётов, это и задаю в программе, но восстановленный поток битов вообще и близко не похож на исходный:

image.thumb.png.feb25ff5d3a84ccd6a0d15b53bda04cf.png

 

Binary Slicer и то правильно работает, в отличие от Symbol Sync.  Пробовал записать выходной поток бит после слайсера в файл: в момент преамбулы, запись бит "1" и "0" содержит по 10..12 отсчётов - по понятным причинам.

 

Собственно 2 вопроса:

1) А точно Symbol Sync может работать именно на моих отсчётах сигнала?  Может требуется какая-та предварительная обработка сигнала?

2) Возможно ли выровнять число отсчётов на бит уже после слайсера? Мне кажется, так даже будет логичнее - выровнять длительность каждого бита.

 

image.thumb.png.34d39c4ea0c59d84b622364cd649c77a.png

Edited by repstosw

Share this post


Link to post
Share on other sites

5 hours ago, repstosw said:

1) А точно Symbol Sync может работать именно на моих отсчётах сигнала?  Может требуется какая-та предварительная обработка сигнала?

Попробовал фильтр корня приподнятого косинуса.

После определённых настроек теперь число горбов с выхода этого фильтра показывает число смежных бит в сигнале.

Красный - выход с фильтра косинуса

Синий - исходные отсчёты, полученные как разность фаз (снятые с Si4463)

Зелёный - слайсер

1.jpg.76f25805d71779919a5a370a1510591e.jpg

 

Надеюсь, оно теперь будет являться хорошей пищей для Symbol Sync.

Share this post


Link to post
Share on other sites

10 часов назад, repstosw сказал:

Возможно ли выровнять число отсчётов на бит уже после слайсера? Мне кажется, так даже будет логичнее - выровнять длительность каждого бита.

1. Амплитуду входного сигнала для синхронизатора к 1 подтяните. Я писал, как правильно нормировать.

2. Попробуйте оценить, сколько в среднем отсчетов на бит приходится. Может, там не целое число. Просто поделите число полученных отсчетов на число бит в пакете.  

3. В настройках синхронизатора loop bandwidth я бы для начала в 0,0001 поставил.

Edited by komah

Share this post


Link to post
Share on other sites

2 hours ago, komah said:

1. Амплитуду входного сигнала для синхронизатора к 1 подтяните. Я писал, как правильно нормировать.

OK, ещё раз перечитаю посты в теме.

 

2 hours ago, komah said:

2. Попробуйте оценить, сколько в среднем отсчетов на бит приходится. Может, там не целое число. Просто поделите число полученных отсчетов на число бит в пакете. 

От 10 до 13 отсчётов на один информационный бит

 

2 hours ago, komah said:

3. В настройках синхронизатора loop bandwidth я бы для начала в 0,0001 поставил.

Да. Заметил.  При больших значениях синхронизатор уходит в расколбас и комп повисает намертво, симуляция  останавливается.

 

Удалось заставить синхронизатор правильно работать. А также сдетектил синхро-слово и сформировал пакеты.

image.thumb.png.53b73d36845d7e4eeeab2411e6052412.png

image.thumb.png.916dfa2be2a6930c264c2ea68e938e77.png

image.thumb.png.622b3bbecc015a6dcadbdc58ab128b8e.png

Edited by repstosw

Share this post


Link to post
Share on other sites

14 hours ago, komah said:

1. Амплитуду входного сигнала для синхронизатора к 1 подтяните. Я писал, как правильно нормировать.

 

Перечитал посты. Не нашёл как нормировать отсчёты мгновенной частоты.   Кроме как что их надо как-то нормировать:

Quote

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

 

Пока сделал Rail-to-Rail Clipper: отсекаю значения всё что выше от 1/4 максимального размаха.  Потому что при отсутсвии полезного сигнала, амплитуды шумов в 4 раза выше, чем полезный сигнал.  Есть ещё возможность установить по-больше усиление в Si4463 - отсчёты фазы будут больше.

Цепочка такая:

Отсчёты фазы => отсчёты частоты => Клипирование => Масштабирование => Корень приподнятого косинуса => Блок синхронизации => Бинарный слайсер

Декодирование пакета работает правильно.

Можно ли улучшить?

 

Второй вопрос: возвращаясь к мягким отсчётам битов. Сейчас слайсер режет сигнал на биты.   Как теперь найти "мягкое значение" для каждого бита?   Вернуться к отсчётам частоты и времени максимума символа, найденного фильтром косинуса?  Или как?

Edited by repstosw

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...