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

repstosw

Участник
  • Постов

    2 582
  • Зарегистрирован

  • Победитель дней

    2

Весь контент repstosw


  1. Есть отсчёты мгновенных фаз: Ф1(t) и Ф2(t). Из которых можно получить квадратуры I1(t)=cos(Ф1(t)) Q1(t)=sin(Ф1(t)) I2(t)=cos(Ф2(t)) Q2(t)=sin(Ф2(t)). Или отсчёты частоты F1(t) F2(t). С них можно сделать EGC? О каком ограничении идёт речь? Если нельзя, тогда вторая часть вопроса: допустим есть две пары квадратур I1,I2, Q1, Q2. Для простоты считаем их комплексными отсчётами во времени. Что дальше с ними делать для EGC?
  2. Итак... Настало время вернуться к вопросу о манипуляции с данными с двух приёмников, чтобы спастись от плоских замираний. Есть 2 приёмника с антеннами, которые разнесены на лямбда пополам или с взаимно-ортогональной ориентацией. Есть доступ к мгновенным фазам с фазового детектора: atan2 и знак +/-. Вопрос, как правильно "складывать" мощность сигналов чтобы убрать вредительство от замирания? Допустим, с одной антенны сигнал хороший, с другой плохой. Нужно постоянно с каждым отсчётом манипулировать данными отсчётов фазы. petrov что-то говорил пр EGC. Но точно не уверен. Интересует - какие операции нужно проделать над сигналами?
  3. Проверил: выставлял разный Gain для PGA, DAC - результат одинаковый. Ибо AРУ ещё есть потому что. Ну если так, тогда вот мягкие отсчёты - на выходе синхронизатора (умноженные на 0.5, для приведения к [-1..+1] ) - слева преамбула, потом синхрослово 0x5A0FBE66 и потом данные: байты от 0 до 255 : Это 50 кбит/c, девиация +/- 25 кГц. 12 отсчётов на бит(среднее). Запустил на несколько минут симуляцию в GNU Radio (циклически одни и те же анные с файла сигнала). В итоге, протестил все пакеты - все без ошибки. И что самое интересное, мой "детский" алгоритм тоже декодирует пакеты правильно. Но там, где начинает падать отношение сигнал-шум, вариант с синхронизатором работает лучше (больше пакетов даёт валидных, чем "детский" способ). Для 2FSK индекс модуляции понятно как считается. А как он считается для 4FSK? берется inner или outer девиация? P.S. Усовершенствовал забор данных отсчётов фазы с Si4463: теперь данные можно забирать со скоростью 1.615 млн. отсчётов в секунду. Это соответствует заполнению одной половины кольцевого буфера 128 отсчётов за 0.079 мс. По-хорошему надо интерполировать, так как некоторые смежные отсчёты фазы одинаковые.
  4. Такая возможность есть. Но частота опроса регистра должна быть высокой, боюсь что вход и выход из обработчика прерывания по таймеру снизят частоту опроса. Спасибо, помогло. Всё-же у Si4463 время выполнения команд ядра 8051 отличается от дефолтного i8051. Первоначально я брал данные о растактовках здесь: https://mp8051.narod.ru/commands.html Подытоживая: mov A,SFR ;2 movx @DPTR,A ;3 inc DPTR ;1 nop ;1 djnz R2,Label ;2/3 mov A,#0x15 ;2 movx @R1,A ;3 clr A ;1 mov R2,#0x18 ;2 sjmp Label ;3
  5. Здесь пишу на ассемблере sdas8051. Си не использую.
  6. Меня это не интересует. Меня интересует число машинных циклов для каждой инструкции. Проще говоря, во сколько раз одна инструкция быстрее-медленее другой. Нет такой возможности. Точнее - есть, но только в виде "память - SPI". А DMA типа "SFR - память" - нет. Да, он самый! Нужно выставлять ножку в 0 или 1 после заполнения буфера для SPI через DMA. Половина - буфер 128 байт. В буфер кладутся значения SFR-регистра фазы. Требуется очень равными интервалами читать регистр фазы и без джиттера дёргать ножку в 0 и 1 (для IRQ мастер-контроллера). То, что я сделал - работает, фаза дампится в кольцевой буфер для мастер-контроллера, но просмотр отсчётов показал, что есть небольшой джиттер в отсчётах фазы 1-2%. Я помню, умельцы делали на AVR-ках VGA-контроллеры и всякие ГИТС для ТВ с шахматными клетками и полосками - у них всё было ровно: по тактам расчитано. В 8051 такое возможно?
  7. Добавил аттенюатор приёмнику -30 дБ. Мощность передатчика -10 дБм. Передатчик отдалялся от приёмника в пределах 3 комнат. Зафиксированы отсчёты бит с помехами. На рисунке ниже показан бит, начиная с которого пакет терпит неудачу при проверке (длина пакета 6080 байт): Мгновенная частота и фаза (отсчёты) в момент, когда данные не восстанавливаются: Чистый сигнал (для сравнения): Как я понял, что нельзя считать "плoщадь отсчётов" на 1 бит для получения мягкого решения. Есть ли способ восстановить эти биты?
  8. Нужно прецезионно(равными интервалами) организовать считывание из SFR регистра и вывести сигнал на ножку. Не могу найти достоверные растактовки для инструкций ядра 8051. Встречаются разночтения: в одних источниках пишут, что инструкция DJNZ занимает 2/4 цикла в зависимости от результата, а других - в обоих случаях 2 цикла. Интересуют именно число циклов, без привязки к конкретной частоте. У меня недоверие и вопросы: как может инструкция с условным переходом выполняться одинаковое число тактов? Там всегда будет 2 значения циклов - в случае если переход выполнен, и в случае если перехода не будет. В частности меня интересует число циклов выполнения следующих инструкций: mov A,SFR movx @DPTR,A inc DPTR nop ;1 цикл djnz R2,Label mov A,#0x15 movx @R1,A clr A ;1 цикл ? mov R2,#0x18 sjmp Label
  9. Перечитал посты. Не нашёл как нормировать отсчёты мгновенной частоты. Кроме как что их надо как-то нормировать: Пока сделал Rail-to-Rail Clipper: отсекаю значения всё что выше от 1/4 максимального размаха. Потому что при отсутсвии полезного сигнала, амплитуды шумов в 4 раза выше, чем полезный сигнал. Есть ещё возможность установить по-больше усиление в Si4463 - отсчёты фазы будут больше. Цепочка такая: Отсчёты фазы => отсчёты частоты => Клипирование => Масштабирование => Корень приподнятого косинуса => Блок синхронизации => Бинарный слайсер Декодирование пакета работает правильно. Можно ли улучшить? Второй вопрос: возвращаясь к мягким отсчётам битов. Сейчас слайсер режет сигнал на биты. Как теперь найти "мягкое значение" для каждого бита? Вернуться к отсчётам частоты и времени максимума символа, найденного фильтром косинуса? Или как?
  10. OK, ещё раз перечитаю посты в теме. От 10 до 13 отсчётов на один информационный бит Да. Заметил. При больших значениях синхронизатор уходит в расколбас и комп повисает намертво, симуляция останавливается. Удалось заставить синхронизатор правильно работать. А также сдетектил синхро-слово и сформировал пакеты.
  11. Попробовал фильтр корня приподнятого косинуса. После определённых настроек теперь число горбов с выхода этого фильтра показывает число смежных бит в сигнале. Красный - выход с фильтра косинуса Синий - исходные отсчёты, полученные как разность фаз (снятые с Si4463) Зелёный - слайсер Надеюсь, оно теперь будет являться хорошей пищей для Symbol Sync.
  12. Поигрался в GNU Radio. Завёл свои отсчёты фазы в программу, привёл к нужному типу данных и нашёл мгновенную частоту как разность фаз. На этом лыжи дальше не едут: не получается восстановить частоту символов с помощью штатного блока Symbol Sync. У меня на каждый бит приходится 10...12 отсчётов, это и задаю в программе, но восстановленный поток битов вообще и близко не похож на исходный: Binary Slicer и то правильно работает, в отличие от Symbol Sync. Пробовал записать выходной поток бит после слайсера в файл: в момент преамбулы, запись бит "1" и "0" содержит по 10..12 отсчётов - по понятным причинам. Собственно 2 вопроса: 1) А точно Symbol Sync может работать именно на моих отсчётах сигнала? Может требуется какая-та предварительная обработка сигнала? 2) Возможно ли выровнять число отсчётов на бит уже после слайсера? Мне кажется, так даже будет логичнее - выровнять длительность каждого бита.
  13. Хотел поставить себе 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 спасибо за ответы!
  14. Требование к целому числу отсчётов - это для выходных данных, которые подаются на интерполятор? Или это интерполятор выдаёт целое число отсчётов? В приведённых последних картинках, у меня на 1 символ может приходиться 11...13 отсчётов. Что делать? Опять же - какое число отсчётов на символ имеется ввиду? До- или после- интерполятора? Прочтитал про TED Гарднера, увидел на картинках, что для его использования - последовательность данных должна иметь 2 отсчета на символ. Питается он этими отсчётами после интерполятора, исходя из структурной схемы, которая приведена в статье Чхоудхури. Получается мне нужен ресемплер в режиме дециматора что-ли? Чтобы свои 11..13 отсчётов превратить в 2 отсчёта для TED? Чё-то каша в голве у меня, пазл не складывается. И вообще, с какими отсчётами мне работать? С фазой или с мгновенной частотой? Если с фазой, то насколько критичны разрывы фазы? Надо ли делать unwrap перед входом на интерполятор. Проще говоря - у меня есть отсчёты фазы , будем пока считать matched Filter внутри микросхемы трансивера. Что подавать на интерполятор? Тоже непонятно. В статье ДВЕ структурные схемы: с одним интерполятором и с двумя. Какую надо использовать? И собственно, что мы этой схемой пытаемся достичь? Чтобы число отсчётов на каждый символ было одинаковым и постоянным? Зачем это нужно для 2FSK? Её можно декодировать даже на глаз, не применяя сложные схемы по стабилизации символьной скорости. При условии, если число отсчётов на символ достаточно большое - в моём случае 11..13 отсчётов. Такое даже ребёнок сдекодирует. Амплитуды там вообще по барабану, это же не КАМ-256 какой-нибудь, а всего лишь 2 FSK. Там только накапливать отсчёты с одинаковым знаком, резать их на биты, а остаток при смене полярности - решать: преобразовывать ли в бит или пропускать... Реализацию на Си я давал уже здесь. Алгоритм работает на моём сигнале. Что за БИХ фильтр? RC-цепочка интегратор? Какая у него реализация - функция выхода от входа описанная в алгоритмах - какая? Есть ли окно для эффекта памяти, какие коэффициенты? Откуда взялись 83 вх и 10 вых отсчётов? Почему именно столько надо? Опять же - зачем для 2FSK восстанавливать тактовую? Когда биты хорошо детектятся визуально перепадами и номинальным числом отсчётов 11..13 ? Всё что меньше - шум и мусор, всё что больше - режется на последовательности из одинаковых бит. И там он вообще 2 схемы привёл. И расписал в общих чертах алгоритм. И самого главного нет - где имплементация на каком-нибудь языке? На Си предпочтительнее. Я вот например - не понимаю как должен быть программно описан matching Filter p(-n*Ts). предполагаю что это приподнятый косинус с которого квадратный корень... Пока у меня в голове каша, если честно. И непонятно вообще - нужно ли в моём случае это делать с 2FSK с 10 отсчётами на бит.
  15. 1. Документации нет и не будет 2. В качестве донора - сорцы Линукса, у-бута и прочие вещи. 3. Мозговой штурм. Эксперименты. 4. Кое-что даже удаётся сделать по куцему даташиту (GPIO, PWM, I2S, LRADC) Но в основном - жёсткий секс с Линуксом 🐥
  16. Всё ещё впереди! ))) Сделал детектор паттерна преамбулы и нахождение синхрослова. И выпарсил данные наконец-то и проверил их. Все три пакета правильные. Корона не жмёт? :)))
  17. Пока не смотрел ИХ фильтра на GFSK и FSK. Сделал свой битовый синхронизатор, по крайней мере преамбулу и синхрослово ищет без ошибок : //BitStream Engine u32 b=0; u32 counter0=0; u32 counter1=0; #define THR 12 #define DEL 2 for(u32 i=0;i<SIZE;i++) { if(BufferOut[i]>0) //'1' { if(counter0) { if(counter0>=THR-DEL)bitstream[b++]='0'; counter0=0; } counter1++; if(counter1==THR) { bitstream[b++]='1'; counter1=0; } } else if(BufferOut[i]<0) //'0' { if(counter1) { if(counter1>=THR-DEL)bitstream[b++]='1'; counter1=0; } counter0++; if(counter0==THR) { bitstream[b++]='0'; counter0=0; } } } ... Preamble (64 bytes "0101..."): 0101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101 Sync: 0101 => 5 1010 => A 0000 => 0 1111 => F 1011 => B 1110 => E 0110 => 6 0110 => 6 Data (0,1,2,3,...,255): 00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 00001001 00001010 00001011 00001100 00001101 00001110 00001111 ...
  18. Удалил повторяющиеся отсчёты из raw-файла. Теперь соседние отсчёты фазы различны, и мгновенная частота не возвращается к нулю несколько раз. Очевидно, для скорости 50 кбит/с было пересемплирование. И теперь на 1 бит приходится 12-13 отсчётов всегда: Насколько высок потенциал для нахождения мягких решений?
  19. Скорость взятия отсчётов зависит программы, насколько быстро она может читать регистр. С учётом кольцевой буферизации, DMA и одинакового интервала взятия отсчётов - 20 машинных циклов 8051, больше, чем 1 300 000 отсчётов за 1 секунду - не получить.
  20. Да. Возвраты к нулю происходят от того что иногда соседние отсчёты фазы одинаковы (на скорости 50 кбит/с): Пофиксил отсчёты: +0+, -0-, +00+, -00-. Значения в нулях - нашёл интерполяцией. Вот так вышло (рисунок внизу): Для +0+ и -0-: //Step 1: Kill -0- for(u32 t=0;t<SIZE;t++)if((s[t]<0)&&(s[t-1]==0)&&(s[t-2]<0)) { y[t-1]=(s[t]+s[t-2])/2; //-2147483648.0/2; } for(u32 t=0;t<SIZE;t++)if((s[t]>0)&&(s[t-1]==0)&&(s[t-2]>0)) { y[t-1]=(s[t]+s[t-2])/2; //2147483647.0/2; } Для +00+ и -00-: //Step 2: Kill -00- for(u32 t=0;t<SIZE;t++)if((s[t]<0)&&(s[t-1]==0)&&(s[t-2]==0)&&(s[t-3]<0)) { float k=(s[t]-s[t-3])/3; y[t-2]=s[t-3]+k*1; y[t-1]=s[t-3]+k*2; } for(u32 t=0;t<SIZE;t++)if((s[t]>0)&&(s[t-1]==0)&&(s[t-2]==0)&&(s[t-3]>0)) { float k=(s[t]-s[t-3])/3; y[t-2]=s[t-3]+k*1; y[t-1]=s[t-3]+k*2; } Каким фильтром это можно сделать? ФНЧ боюсь срежет скаты, будет плохо. А если ноль между минусами превратить в минимум, а ноль между плюсами - в максимум, то получается прямо закраски битов данных дискретно. В логарифмической шкале ещё лучше: Мусор слева: Уже можно детектор преамбулы писать! :))) Кстати, что есть мягкое решение для одного бита? Нормированная площадь отсчётов на 1 бит?
  21. Прочитайте название темы. Причём тут замирания? Нужно получить битовый поток из сигнала модулятора. Про замирания - в других темах. Пока мне нужно оценить, насколько полезно может быть применение отсчётов мгновенной фазы для моих целей. Мои цели - отказаться от встроенного модема Si4463 и научиться находить битовый поток с отсчётов фазы демодулятора. Задача как я понял, не тривиальная. При этом мне нужны не просто биты в виде 0 и 1, а результат в виде мягких решений: [0.0...1.0], для того, чтобы загнать это на LDPC или Турбо-код. Хочу поиграться с мягким выходом демодулятора и оценить насколько FEC на мягких решениях более эффективна, чем FEC на жёстких решениях, которая уже работает. Тоесть, если разбить на под-этапы: 1) Получение сигнала мгновенной частоты с отсчётов фаз 2) Обработка сигнала (фильтрация, клиппинг, интерполяция,...) 3) Обнаружение преамбулы, нахождение тактовой частоты потока бит (сколько отсчётов на бит - среднее, и плюс-минус) 4) Нахождение синхрослова 5) Получение мягких решений для каждого бита, коррекция тактовой частоты битового потока (на базе алгоритмов корелляции, предсказания, ...) Нужна конкретика, а не общие слова... Тот же эквалайзер Витерби. Я ничего по нему не нашёл, кроме как хвалебные оды о том, какой он хорош. А где микросхема этого эквалайзера? А программная реализация? Или может мне сразу выломать кусок с сотовой БС и использовать готовую плату? К тому же, ЕМНИП эквалайзер Витерби борется с частотно-селективными замираниями. А у меня плоские замирания. Так что нужен он мне или нет - ещё большой вопрос. И MIMO - это тоже мимо для моих целей. Ставить 4 антенны на передачу (привет, матрица Аламоути!) или на приём - как-то не хочется. У трубки телефона - 1 сотовая антенна. И отсылка к книгам Скляра - это тоже ни о чём. Нужен - номер раздела, параграф, название. Конкретика. Какой фильтр посмотреть, как подчистить шумы, как получить мгновенную частоту битовых отсчётов и тому подобное. Формализую задачу. raw-файл отсчётов фазы (не обработан - прямой забор с демодулятора): https://dropmefiles.com/aNLMd Дано: raw-файл с отсчётами фазы, снятыми с демодулятора Si4463. Каждый отсчёт хранится в байте. Каждый отсчёт 7-битный знаковый: -64...+63. Причём знаковый бит - 6-й, а не 7-й (7-й бит пустой и всегда равен 0) В файле есть участки с принятым пакетом, который содержит: преамбулу 64 байта, синхрослово 32 байта (значение 0x5A0FBE66 ) и 6080 байт PayLoad (байты от 0 до 255, по возрастанию, повторяются). Параметры модема: модуляция 2FSK, скорость 50 кбит/c, девиация частоты +/-25 кГц, полоса пропускания приемника: 150 кГц. Надо: получить буфер бит данных (6080*8) мягких решений в диапазоне от 0.0 до 1.0. Допускается использовать мгновенные отсчёты и окна фиксированного размера (для оконных функций, фреймов). Тоесть - обработка данных в оффлайне. на 50 кбит/c обработанные отсчёты фазы (мгновенная частота) смотрятся веселее: снизу - отсчёты фазы:
  22. 🤣🤣🤣 Ну не успевает он отрисовать за время VBLANK, поэтому и видите полоску сверху (или снизу, если полярность синхронизации проинвертирована). Попробуйте в настройках TCON пересчитать времянки так, чтобы увеличить ширину VSYNC-пульса. Или грубо FPS в 2 раза меньше сделайте. 20 мс >> T vblank И да: сделайте двойную буферизацию и переключайте адрес отображения видеопамяти (переключать адрес надо по VSYNC или вообще в прерывании от TCON): пока вы будете смотреть на одну страницу, во второй процессор будет рисовать. И времени будет всяко-больше, до следующего обновления дисплея. P.S. У меня во всех приложениях работа с отображением графики строго синхронна с обновлением дисплея
  23. Почитал ваши сообщения на другом форуме: https://www.radioscanner.ru/forum/topic42854.html Вы постоянно занимаетесь тем, что из мухи раздуваете слона. Одни заумные рассуждения и только. Практического толку от таких рассуждений - ноль. Как говорится, у одного хобби пытаться что-то делать. А у другого - гнуть пальцы и демонстрировать свою крутость.
  24. Какие следующие шаги должны быть? Нужно засинхронизироваться и начать по выборкам определять биты. Сделал полифазный фильтр, работающий в сторону апсемплинга. Код брал на гитхабе. Вышла лажа: отсчёты делает некорректно. Попробовал ресемплинг в Audacity - довольно неплохо 4:1. Как теперь найти интервал взятия отсчётов и нужна ли энергия битов? Пробовал вручную найти интервал выборки - получается уход постоянно:
×
×
  • Создать...