repstosw 18 8 марта Опубликовано 8 марта · Жалоба Есть возможность получить данные фазы с демодулятора - в диапазоне от -64 до +63. Ниже представлена картинка фрагмента пакета из эфира, взятая с демодулятора: Как я понимаю - это арктангенс отношения Q/I. Модуляция 4GFSK. Вопрос: как используя эти отсчёты, получить поток битов/дибитов ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
komah 4 8 марта Опубликовано 8 марта · Жалоба Задать пороги и сравнивать. Если попадает в диапазон 0..31 => "10", 32..64 => "11". Аналогично с минусом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 8 марта Опубликовано 8 марта · Жалоба 11 minutes ago, komah said: Задать пороги и сравнивать. Если попадает в диапазон 0..31 => "10", 32..64 => "11". Аналогично с минусом. Так просто? Не верю! Вот здесь написано, что надо брать производную фазы: https://www.allaboutcircuits.com/textbook/radio-frequency-analysis-design/radio-frequency-demodulation/quadrature-frequency-and-phase-demodulation/ И на выходе будут синусоиды со значением частоты, соответствующей определённому дибиту (в случае с 4FSK). Одно непонятно - как взять производную.. По идее - это разница между соседними отсчётами. Но не сшивается в точках переполнения. Интересно, как они выполнили условие непрерывности? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
komah 4 8 марта Опубликовано 8 марта · Жалоба 1. На картинке немножко ерунда. У 4GFSK разрывов фазы быть не должно. 2. Чтобы получить оценку мгновенной частоты нужно вычислять разность фаз между соседними отсчетами. Вот так: float phi_hat = cargf(conjf(_q->z_prime) * z) / _q->scale; z - текущий комплексный отсчет, _q->z_prime - предыдущий, _q->scale - индекс модуляции. Если мгновенная фаза уже вычислена - брать разность между соседними отсчетами. Только нужно следить, чтобы за 2Pi не вылазили значения. На выходе будет сигнал, амплитуда которого пропорциональна отклонению мгновенной частоты от 0. Ну и само собой, нужно тактовую синхронизацию сделать, чтобы решение о значении символа принимать на "пике" импульса. Для GFSK нужен согласованный фильтр до или после частотного детектора. И подстройка частоты, особенно если есть допплер. Насчет 2Pi - я неправильно выразился. Обычно при вычислении мгновенной фазы результат "заворачивают" в 2Pi, поэтому его нужно обратно "развернуть" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 8 марта Опубликовано 8 марта · Жалоба 28 minutes ago, komah said: 1. На картинке немножко ерунда. У 4GFSK разрывов фазы быть не должно Это отсчёты, снятые с АЦП реального устройства. Поэтому там будут разрывы фазы. Чтобы уместить её в 7 бит. Однако, покурив смежные темы, я уже понял, что нужен unwrap, чтобы убрать скачки фазы и сделать её непрерывно меняющейся - без разрывов: И аналог unwrap на Си: https://stackoverflow.com/questions/15634400/continous-angles-in-c-eq-unwrap-function-in-matlab P.S. Надо будет перелезать на MATLAB. А то по старинке, пока на Си пишу 🤣 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 8 марта Опубликовано 8 марта · Жалоба 55 минут назад, komah сказал: 1. На картинке немножко ерунда. У 4GFSK разрывов фазы быть не должно. Там и нет разрывов. Просто ТС так нарисовал. Некорректно. Там где на картинке "разрывы" должен быть просто переход в соседний период. 1 час назад, repstosw сказал: По идее - это разница между соседними отсчётами. Но не сшивается в точках переполнения. Вы просто обрабатываете их неправильно. -64 и +63 - это соседние значения, отличающиеся на 1 значение. И разница должна быть == -1 при переходе с -64 на +63. А у вас видимо не так. При вычислении разницы между +63 и -64 нужно каждый раз делать распространение знакового бита. Как я ранее в другой теме показывал: x0 = -64; x1 = +63; diff = (int)(x1 - x0) << 25 >> 25; Вы это делаете? Если да - всё должно быть нормально. Или просто сдвинуть все значения в старшие 7 бит 32-битного слова CPU и работать с такими данными. Чтобы не делать расширение знака после каждой операции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
komah 4 8 марта Опубликовано 8 марта · Жалоба Посмотрите на первые два разрыва. Второй - это wrap. А первый? И он такой не один. Частотный дискриминатор - это достаточно простой алгоритм, но если непонятно, что на входе, можно много времени потратить. По моему, в примере unwrap не вполне корректный. Нужно учитывать, что после wrap разность между значениями может быть меньше Pi. Поэтому нужно еще дельту добавлять/вычитать, сопоставимую со средним значением разности фаз между отсчетами. Чем больше шумов в сигнале, тем эта конструкция нестабильнее. 4 минуты назад, jcxz сказал: diff = (int)(x1 - x0) << 25 >> 25; А почему 25? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 8 марта Опубликовано 8 марта · Жалоба 10 минут назад, komah сказал: Посмотрите на первые два разрыва. Второй - это wrap. А первый? И он такой не один. Скорее всего - это производные от предыдущих ранее не верно выполненных операций над 7-битными данными в младших битах 32-битного слова CPU. Если ТС везде криво выполняет операции над 7-битными right-aligned-данными, то таких скачков будет много и в разных местах. Сначала нужно арифметику правильно реализовать. Если идёт работа с right-aligned-данными, то нужно делать расширение знака после каждой операции. Или работать с left-aligned-данными. Чтобы не делать каждый раз расширение. 10 минут назад, komah сказал: 11 минут назад, jcxz сказал: diff = (int)(x1 - x0) << 25 >> 25; А почему 25? Потому что ТС работает с 7-битными данными. У которых знаковый бит находится в 6-м бите слова. Для корректной арифметики с такими данными в 32-битных регистрах. нужно этот 6-й знаковый бит распространить на все старшие биты слова вплоть до 31-го. И делать это нужно после каждой арифметической операции. Так как пространство значений у него == -64...+63 (что соответствует -180...+180 градусов). Но имхо: оптимальнее работать с left-aligned данными. Изначально сдвинув все входные аргументы на 25 влево. Так и точность можно повысить (будут использоваться младшие 25 разрядов). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
komah 4 8 марта Опубликовано 8 марта · Жалоба 7 минут назад, jcxz сказал: Если идёт работа с right-aligned-данными, то нужно делать расширение знака после каждой операции. Если здесь 7 бит со знаком, то наверное достаточно в начале на 1 бит влево сдвинуть. Остальное компилятор должен учесть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 8 марта Опубликовано 8 марта · Жалоба 2 минуты назад, komah сказал: Если здесь 7 бит со знаком, то наверное достаточно в начале на 1 бит влево сдвинуть. Остальное компилятор должен учесть. Не достаточно. Возьмите калькулятор и посчитайте: +63-(-64) PS: Т.е. - если ТС все данные сдвинет на 1 бит (и аргументы), то будет достаточно. Но не эффективно. Так как как после каждой арифметической команды компилятор должен вставлять команду расширения знака (SXTB для ARM). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrov 7 8 марта Опубликовано 8 марта · Жалоба repstosw У вас уже почти получилась каша из топора, пора топор вынимать. Надо будет перелезать на MATLAB. А то по старинке, пока на Си пишу Важно уйти от программизма, часто так перелезают, что никакой разницы нет. Поэтому крайне рекомендуется часть матлаба под названием симулинк. Да и вообще для настоящего решения этой задачи, вплоть до воплощения в железе, не нужны никакие программирование и процессоры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 11 8 марта Опубликовано 8 марта · Жалоба Какое-то несоответствие названия и содержания темы. Если имеется в виду фазовый демодулятор, то на входе должна быть фазовая модуляция (манипуляция). Тогда тема была бы интересной: прием ЧМ микросхемой ФМ сигнала. Но обсуждают почему-то модуляцию частотную Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
komah 4 8 марта Опубликовано 8 марта · Жалоба 21 минуту назад, petrov сказал: Важно уйти от программизма, часто так перелезают, что никакой разницы нет. Поэтому крайне рекомендуется часть матлаба под названием симулинк. Да и вообще для настоящего решения этой задачи, вплоть до воплощения в железе, не нужны никакие программирование и процессоры. Симулинк здесь сильно поможет 🙂 Но не скоро. Не ранее, чем ТС научится данные читать как 'bit7'. И почему Вы решили, что ТС решение в каком-то железе кроме процессора будет воплощать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 10 марта Опубликовано 10 марта (изменено) · Жалоба On 3/8/2024 at 7:13 PM, komah said: Ну и само собой, нужно тактовую синхронизацию сделать, чтобы решение о значении символа принимать на "пике" импульса. Для GFSK нужен согласованный фильтр до или после частотного детектора. И подстройка частоты, особенно если есть допплер. Вот с этим пока полная задница. Для того, чтобы читать эти отсчёты, мне пришлось писать эксплоит для Si4463, который читает его SFR-регистр(ядро 8051) и отправляет по SPI его значение уже чипу хоста(ARM T113-s3). Но это оказалось медленно. Тогда я задействовал SPI DMA в Si4463 - сделал кольцевой буфер на 256 байт, Si4463 посылает прерывания (через GPIO) когда заполнены половины буферов. Стало намного лучше - отсчётов больше и намного чаще, но SPI хоста не успевает эти данные забирать. Потому что эксплоит Si4463 работает быстрее. Дальнейшие изыскания сводятся к выбору жесткого интервала между опросами SFR-регистра фазы: по таймеру или привязка к растактовкам ядра 8051.. On 3/8/2024 at 9:42 PM, petrov said: Важно уйти от программизма, часто так перелезают, что никакой разницы нет. Поэтому крайне рекомендуется часть матлаба под названием симулинк. Да и вообще для настоящего решения этой задачи, вплоть до воплощения в железе, не нужны никакие программирование и процессоры. Как это не нужны? Каким образом без ЦОС вы получите битовый поток с отсчётов ЧФД, который ещё и подвергается коррекции ошибок LDPC? On 3/8/2024 at 9:55 PM, V_G said: Какое-то несоответствие названия и содержания темы. Если имеется в виду фазовый демодулятор, то на входе должна быть фазовая модуляция (манипуляция). Тогда тема была бы интересной: прием ЧМ микросхемой ФМ сигнала. Но обсуждают почему-то модуляцию частотную Я не знаю внутренней структуры демодулятора Si4463. Но предполагаю, что он квадратурный. И я уже писал что модуляция 4GFSK. И мне нужен выходной поток бит, вытащенных из отсчётов квадратурного демодулятора. Что не ясно? On 3/8/2024 at 10:11 PM, komah said: Симулинк здесь сильно поможет 🙂 Но не скоро. Не ранее, чем ТС научится данные читать как 'bit7'. И почему Вы решили, что ТС решение в каком-то железе кроме процессора будет воплощать? Как я говорил уже в другой своей теме про 7-бит, в настоящее время прорабатывается алгоритм чтения отсчётов с жеско фиксированным временным интервалом. Про железо говорить пока рано: дальнейшая обработка данных пока идёт на ПК. Изменено 10 марта пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 11 10 марта Опубликовано 10 марта · Жалоба 5 часов назад, repstosw сказал: И мне нужен выходной поток бит, вытащенных из отсчётов квадратурного демодулятора. Что не ясно? Некорректен заголовок темы. В нем указан фазовый демодулятор. Он нужен для демодуляции ФМ - сигналов. Для демодуляции FSK сигналов нужен частотный демодулятор - немного другое. Возможно, под квадратурным демодулятором вы имеете в виду квадратурный смеситель, присутствующий на стр.2 даташита, и хотите самостоятельно анализировать сигналы I Q до АЦП, но это выходы квадратурного УПЧ, а не выходы квадратурного демодулятора. И это другое. ЧАСТОТНАЯ демодуляция в этой ИС проходит уже в цифровой части после АЦП. И скорее всего, арктангенс там не используется из-за больших вычислительных затрат. Как известно, частота - производная фазы, фаза - это арктангенс, а производная арктангенса - ни разу не трансцедентная функция. Я делал ЧД в цифровом приемнике без арктангенса, там большой уровень гармоник (-30 дБ для второй гармоники), но для частотной манипуляции вполне годится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться