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

repstosw

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

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

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

    2

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


  1. Проверил. Эта сумма квадратов всегда равна единице. Выкинул её. График без изменений. Облегчило конвеер вычислений. Почему-то сразу вспомнил основное тригонометрическое тождество...
  2. Сделал замеры. На битовой скорости 625 кБит/c получается 2,19 отсчётов. Грубо - 2 отсчёта на символ. Ни о каких мягких решениях нельзя говорить при таком битрейте. Но для скоростей десятки килобит в секунду сгодится. Всё из-за ограниченной пропускной способности SPI: максимально работает на половине тактовой частоты кварца: 37.5/2 = 18.75 МГц. Дальше только усекать разрядность выборок и толкать в байт. ЕМНИП для мягких решений достаточно трёх бит, остальное лишнее. Попробовал ещё включить логарифмическую визуализацию - с ней красивше смотрится: Вверху - через квадратуры, внизу - через разность. И что там в первом GSM смотреть? Слишком много всего написано, и не факт что найду нужное. К тому же я не припомню, чтобы первый GSM решал вопросы скоростей выше 0,5 МБит/c
  3. Соединил ВЧ входы двух устройств через аттенюатор -30 дБ. Мощность -10 дБм. Снял фазу сигнала. Результат ничем не отличается от сигнала, принятого с эфира. Потому что оба устройства находятся рядом. И всё-же КМК форма сигнала, найденная через квадратуры и раскрытую производную арктангенса лучше смотрится, чем производная с раскрытого арктангенса. Проще говоря, рисунок ниже - лучше (нет АМ и меньше заусенцев): И кстати, почему когда передаётся преамбула, видно на графике, что частота слегка подплющивается периодически? Ну тоесть она как бы слегка частотно-модулированная визуально. Выровнял чтения регистра фазы. Теперь отсчёты фазы бирутся через одинаковый временной интервал. Стало лучше. Но выбросы всёравно остались.
  4. Сигнал принимаю по эфиру со второго трансивера Si4463. Модемы настроены одинаково. Модуляция, как я уже писал - пока выбрана 2FSK, битрейт 625 кбит/c. Si4463 разогнана немного: припаял кварц 37.5 МГц вместо шатного кварца30 МГц. Это позволило на 25% увеличить битрейт и увеличить скорость SPI до 15 МГц. До этого сделал стандартно обработку пакетов в дуплексном режиме. На два MJPEG кадра 160x240 + два потока сжатого звука хватает. Прикрутил коррекцию ошибок - длинный RS-кодек, исправляющий до 10...12.5% ошибок в пакете . Коррекция ошибок помогает когда сигнал сильно слабый (проверял). Чем слабже сигнал, тем больший % пакетов исправляется коррекцией. Вот статистика для выходной мощности 0,1 мВт (-10 дБм): из принятых 2160 пакетов - 602 пакета пришли битыми - они успешно исправлены, и 54 битых пакета с невозможностью исправить. ! - пакет пришёл без ошибок * - пакет с ошибками, успешно восстановлен ? - пакет исправить не удалось. перемещение по комнатам с приёмопередатчиком в руках.
  5. Заработал нормально diff (unwrap ( ) ) Нужно было диапазон -64...+63 привести к 8 битному. Иначе скругление разницы не работало. Пока просто умножил на 2: диапазон -128... +126. Правильнее надо -128...+127 s8 BufferIn[SIZE]; s8 BufferOut[SIZE]; BufferOut[0]=0; for(int i=1;i<SIZE;i++) { BufferOut[i]=2*(BufferIn[i]-BufferIn[i-1]); } Выбросы как я понимаю из-за погрешностий интервала взятия отсчётов. При нахождении разницы unwrap не нужен. Так как происходит переполнение 8-бит с скругление с + на -.
  6. Unwrap не получается сделать так, чтобы он правильно работал: он ползёт куда-то вверх, и не всегда срабатывает - оставляются переполнения. Может в MATLAB оно и работает превосходно, но Си-шный алгоритм даёт фигню мягко говоря... К тому же, если размотанная фаза будет постоянно ползти, то и 32 бит скоро может не хватить.
  7. Задача решена. Нашёл синхро-слово после преамбулы, которое передаю (преамбула 010101...0101, синхрослово: 0x5A0FBE66 - в эфире: 01011010 00001111 10111110 01100110). Скорость 0.5 МБит/c, модуляция 2FSK: Очень помогла вот эта статья: https://ru.dsplib.org/content/signal_fm_demod/signal_fm_demod.html В ней написано, как получить мгновенную частоту FM-сигнала и как избавиться от разрывов арктангенса. По мгновенным отсчётам фазы, вначеле построил I- и Q- сигналы. Их магнитуда условно принята M=1, так как амплитудная составляющая предполагается постоянной при угловой модуляции (ЧМ, ФМ) а также включено АРУ в приёмнике. Затем нашёл мгновенные значения модулирующей частоты по формуле из статьи: Весь конвеер: Packet - исходные отсчёты фазы (полученные из Si4463 с помощью программы-эксплоита, и переданные на хост-контроллер для записи данных). OutI - синфазная составляющая, найденная по отсчётам фазы: I(o)=M*cos(o) OutQ - квадратурная составляющая, найденная по отсчётам фазы: Q(o)=M*sin(o) OutF - итоговая модулирующая частота, по которой ищется синхро-слово и пакет за ним. Программа на Сях (накидал на скорую руку): #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "Type.h" #define SIZE 32538 s8 BufferIn[SIZE]; float BufferOutI[SIZE]; float BufferOutQ[SIZE]; float BufferOutF[SIZE]; int main(void) { FILE *f=fopen("Packet.raw","rb"); fread(BufferIn,SIZE,1,f); fclose(f); for(int i=0;i<SIZE;i++) { s8 o=BufferIn[i]; float fi=((float)o)*M_PI/64; if(fi<-M_PI)fi=-M_PI; else if(fi>+M_PI)fi=+M_PI; float I=cosf(fi); float Q=sinf(fi); BufferOutI[i]=I; BufferOutQ[i]=Q; } BufferOutF[0]=0.0F; for(int i=1;i<SIZE;i++) { float dI=BufferOutI[i]-BufferOutI[i-1]; float dQ=BufferOutQ[i]-BufferOutQ[i-1]; BufferOutF[i]=((dQ*BufferOutI[i])-(dI*BufferOutQ[i]))/((BufferOutI[i]*BufferOutI[i])+(BufferOutQ[i]*BufferOutQ[i])); } f=fopen("outI.raw","wb"); fwrite(BufferOutI,SIZE,sizeof(float),f); fclose(f); f=fopen("outQ.raw","wb"); fwrite(BufferOutQ,SIZE,sizeof(float),f); fclose(f); f=fopen("outF.raw","wb"); fwrite(BufferOutF,SIZE,sizeof(float),f); fclose(f); } Пока есть небольшой джиттер. Я могу позволить себе до 8 отсчётов на символ максимум при символьной скорости до 625 кбит/с. Так что-ли? Мне пока интересно софтово это сделать. Уже вычислил. Нормированные, правда. Но в моём случае амплитуда не нужна.
  8. Нет доступа к квадратурам. Есть только фаза со знаком в виде дискретных значений [-64.. + 63].
  9. Да. Всё верно. Есть регистр PHASE_OUT, который хранит отсчёты фазы в знаковом 7-битном формате. Причём регистр доступен только асинхронно - я не нашёл никаких дополнительных сведений о синхронизации для забора данных с него. Возможно, это даже не демодулятор, а АЦП после смесителя. Серия инструкций MOV для чтения этого регистра ядром 8051 даёт до 4-х одинаковых подряд значений. На практике всё грустно: удалось передавать непрерывным потоком эти данные управляющему процессору со скоростью до 128 отсчётов за 0.11 мс. Я уже мозг взорвал этими разрывами фазы, но так ничего толкового не увидел. Проще говоря, как из асинхронно взятых отсчётов мгновенных значений фазы вытащить биты? Для упрощения перешёл пока на 2FSK. Пока делал так: отсчёты от 0 до +63 - это мягкие решения от 0 до 1. Тоже и отрицательный диапазон: от 0 до -64 - это мягкие 0..1. Но на графике лажа получается: я не вижу преамбулы и синхрослова. Причём отбеливания всякие пока выключил.
  10. Вот с этим пока полная задница. Для того, чтобы читать эти отсчёты, мне пришлось писать эксплоит для Si4463, который читает его SFR-регистр(ядро 8051) и отправляет по SPI его значение уже чипу хоста(ARM T113-s3). Но это оказалось медленно. Тогда я задействовал SPI DMA в Si4463 - сделал кольцевой буфер на 256 байт, Si4463 посылает прерывания (через GPIO) когда заполнены половины буферов. Стало намного лучше - отсчётов больше и намного чаще, но SPI хоста не успевает эти данные забирать. Потому что эксплоит Si4463 работает быстрее. Дальнейшие изыскания сводятся к выбору жесткого интервала между опросами SFR-регистра фазы: по таймеру или привязка к растактовкам ядра 8051.. Как это не нужны? Каким образом без ЦОС вы получите битовый поток с отсчётов ЧФД, который ещё и подвергается коррекции ошибок LDPC? Я не знаю внутренней структуры демодулятора Si4463. Но предполагаю, что он квадратурный. И я уже писал что модуляция 4GFSK. И мне нужен выходной поток бит, вытащенных из отсчётов квадратурного демодулятора. Что не ясно? Как я говорил уже в другой своей теме про 7-бит, в настоящее время прорабатывается алгоритм чтения отсчётов с жеско фиксированным временным интервалом. Про железо говорить пока рано: дальнейшая обработка данных пока идёт на ПК.
  11. Правы и blackfin и jcxz. Вариант от blackfin - если требуется результат в 8-битных ячейках памяти. Вариант от jcxz - более универсальный: результат можно хранить в 8/16/24/32 битных ячейках памяти. Основная идея понятна: растиражировать знаковый бит на все старшие биты. Или сдвинуть влево, чтобы знаковый бит оказался старшим. Что касается реализации, то в настоящее время, я делаю обработку данных на ПК. И если идея с выделением битового потока с частотно-фазового демодулятора принесёт свои плоды (а именно в сочетании с коррекцией ошибок на мягких решениях), то есть смысл рассмотреть вопрос переноса алгоритма на ARM, ПЛИС, DSP,..
  12. Использую ваш способ. И на счёт скачков фазы тоже разобрался: ключевое слово - unwrap.
  13. Это отсчёты, снятые с АЦП реального устройства. Поэтому там будут разрывы фазы. Чтобы уместить её в 7 бит. Однако, покурив смежные темы, я уже понял, что нужен unwrap, чтобы убрать скачки фазы и сделать её непрерывно меняющейся - без разрывов: И аналог unwrap на Си: https://stackoverflow.com/questions/15634400/continous-angles-in-c-eq-unwrap-function-in-matlab P.S. Надо будет перелезать на MATLAB. А то по старинке, пока на Си пишу 🤣
  14. Так просто? Не верю! Вот здесь написано, что надо брать производную фазы: https://www.allaboutcircuits.com/textbook/radio-frequency-analysis-design/radio-frequency-demodulation/quadrature-frequency-and-phase-demodulation/ И на выходе будут синусоиды со значением частоты, соответствующей определённому дибиту (в случае с 4FSK). Одно непонятно - как взять производную.. По идее - это разница между соседними отсчётами. Но не сшивается в точках переполнения. Интересно, как они выполнили условие непрерывности?
  15. Есть возможность получить данные фазы с демодулятора - в диапазоне от -64 до +63. Ниже представлена картинка фрагмента пакета из эфира, взятая с демодулятора: Как я понимаю - это арктангенс отношения Q/I. Модуляция 4GFSK. Вопрос: как используя эти отсчёты, получить поток битов/дибитов ?
  16. На верхней картинке предыдущего поста - шум из эфира. Вот так выглядит выход с демодулятора во время приёма пакета: Что с этим делать дальше, чтобы получить биты?
  17. Следить за областью допустимых значений аргументов G2D - задача программиста. От себя добавлю: прямоугольник размером 1x1 пиксель тоже приводит к зависанию намертво. Ничто не мешает поставить G2D раком, передав некорректные параметры. Тут и вылет за пределы памяти, и бесконечный цикл. Инкременторы всякие, операторы ... Надо будет попробовать. Занинтересовало
  18. Получил сырые данные с демодулятора Si4463. Пока есть проблемы с интерпретацией и визуализацией данных: демодулятор даёт отсчёты в формате 7 бит со знаком. Тоесть -64...+63. Как оно выглядит, если файл отсчётов открыть в Audacity - как 8 бит со знаком (сделал перед этим конверсию 7-bit signed в 8-bit signed): Также остаётся открытым вопрос, как синхронизировать забор данных с регистра. Пока делаю чтения регистра ASAP. Если забирать как можно скорее, на ассемблере 8051, то это будет так: mov R0,REG mov R1,REG mov R2,REG mov R3,REG mov R4,REG mov R5,REG mov R6,REG mov R7,REG mov A,R0 movx @DPTR,A inc DPTR mov A,R1 movx @DPTR,A inc DPTR ... mov A,R7 movx @DPTR,A ret Получается до 4-х чтений регистра REG дают одинаковое значение. Значит, можно читать в 4 раза медленее. Если же читать 1 раз, затем раскидывать в память, то олучается уже долго - уже неодинаковые значения. Прерывания 8051 на момент чтения запрещаются. С конверсией данных выход с демодулятора такой: Знающие, подскажите - как выглядит сигнал с фазового/частотного демодулятора в цифровых трансиверах?
  19. Это мягкие решения с фазового демодулятора Si4463. Отсчёты нужно будет подвергать ЦОС - правильно просемплировать, обезглитчить и получить отсчёты в диапазоне [0..1], которые пойдут на мягкую коррекцию ошибок. В итоге всё должно свестить к битовой последовательности. Честно говоря, я не знаю, как правильно должен выглядеть выход с демодулятора. Он внутри Si4463. Сейчас главное правильно сконвертить 7-bit signed в 8/16/32- bit signed.
  20. Это тоже самое, что и: 6-й бит ставим на место 7-го. Попробовал. Уже по-лучше: положительные и отрицательные полу-волны сравнялись и стали по 0.5. Но переход с минуса в плюс по-прежнему резкий: Ещё попробовал сделать так: if (t>63) t|=0x80; Суть в том, что битовая идентичность должна быть как 8-бит знаковое. Тогда, подглядывая в виндовый калькулятор в режиме "программист", получим: 63: 00111111 t 64: 01000000 - оно же: -64 t |= 0x80 - 11000000 65: 01000001 - оно же: -63 t |= 0x80 - 11000001 ... 126: 01111110 - оно же: -2 t |= 0x80 - 11111110 127: 01111111 - оно же: -1 t |= 0x80 - 11111111 Ну тоесть - делаю вывод что нужно прилепить старший 7-й бит =1, когда t>63. Результат аналогичен вашему преобразованию: int result = (int)inData << 25 >> 25; Но что-то всё-равно выглядит не так...
  21. Получаю массив данных с демодулятора цифрового трансивера. Написано, что данные в формате signed 7-bit integer. Нужно просмотреть отсчёты в Audacity. Пробовал преобразовать в знаковое 8 бит двумя способами: 1) t = (t&0x3F)|((t>>6)<<7); 2) t = t<<1; В обоих случаях выходит фигня - нарушается плавность переходов через 0 (с + на - и наоборот): как правильно преобразовать?
  22. Подразумевается, что регистры интересны хардварщикам, которых не запугаешь порчей оборудования. С таким же успехом можно подпалить GPIO, настроенный на выход, если его соединить с GND, в момент когда на него придёт логическая "1" 🤣 Я не из тех, кто предъявляет претензии к работе чипа, если было принято решение лезть в дебри. Ясно дело, что любая эволюция подразумевает прогресс работы с чипом: от пакетного хэндлера - до мягких решений с ЦОС и СДР 😅
  23. Сколько не пытался понять ваше заявление с мышеловкой, так и ничего не понял. Есть недокументированные регистры, и есть недокументированные биты в регистрах. Это также одинаково, как и утверждать, что "в небе светит Солнце, а дождь капает водой. Вода кипит при 100 градусах Цельсия при нормальном давлении"... И тому подобное. Я не видел официальзых заявлений от Силабс, купить у них софт-конфигуратор, позволяющий получить I/Q с пинов или заставить модем выдавать оцифрованные мягкие решения с демодулятора в FIFO. Вижу масонскую политику зачем-то скрывать регистры, которых масса. Тем более Si4463 - уже относительно старый... Могли бы и открыть доки на регистры. А так получается - "ни себе, ни людям". P.S. Регистры с разбитовкой есть. Но отстутствует их внятное описание. Но те, кто писал WDS и фирмварь для Si4463 под ядро 8051, этой документацией обладают. Хочется отказаться от их пакетного хэндлера и попробовать получить мягкие решения с демодулятора(в оцифрованном виде). Такой регистр найден. Но непонятно, как его тактировать (с каким интервалом забирать с него данные).
  24. При условии, если он либо зашифрован или содержит EXE,DLL, BAT. А также RAR или другой архив - с вышеупомянутым содержимым. Не бяки. Просто предотвращают пересылку потенциально вредоносного кода, который может быть запущен получателем.
  25. Гугл-почта блокирует пересылку писем с вложениями, которые содержат EXE, DLL, BAT. Сейчас в ЛС что-то есть.
×
×
  • Создать...