Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 4FSK
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Вопросы системного уровня проектирования
Quasar
Приветствую.

Интересует алгоритм приема C4FM и вообще 4FSK модуляции. Конкретно интересует APCO P25. Собственно схема, по ТЗ должна быть такой:

В сети есть варианты демодуляции, один вариант в GNU Radio, он работает, но дает некоторый BER, даже в ближней зоне. Обязательным условием в ТЗ является частота дискретизации АЦП после FM демодулятора – 8 КГц. Демодулятор из GNU Radio, мне так кажется, именно из-за этого (частоты дискретизации) имеет проблемы с символьной синхронизацией, давая иногда не нулевой BER даже в ближней зоне. Этот демодулятор состоит из полифазного ресемплера, и делает ресемпл из входной частоты дискретизации до частоты дискретизации 4800, и по идее, в каждом отчете уже должен быть символ, ждущий принятия решения, что это за символ (-3, -1, +1, +3). Но видимо из-за того, что входная частота 8КГц некратна 4800 Гц, в ходе передискретизации не всегда символы оказываются ровно внутри семпла. (Хотя может быть я чего-то здесь недопонимаю) Реализация 4FSK из GNU Radio тут

Попробовал написать свой, схема ниже:

Синхронизация производится по поиску максимальной корреляции в FIFO, по преамбуле APCO-P25. В FIFO кладу семплы повышая частоту семплирования с 8КГц до 24КГц, интерполируя Raised Cosine фильтром, представленном в стандарте, для модулятора. Засинхронизироваться вроде удается, так как значение корреляции получается 216, это значит совпали все символы, но остальная часть сообщения принимается с диким, BER порядка 20%.

Вопрос, на сколько вообще реализуем мой метод демодуляция, с настройкой тайминга в начала пакета или обязательно надо подстраивать положение символов в ходе приема остального пакета? (Как это например сделано в GNU Radio)
petrov
simulink в руки и отлаживать тщательно алгоритмы, да и вообще стыдно уже через аналоговый частотный дискримнатор делать с потерями, CPFSK когерентно демодулируются как фазовые модуляции.
D.I.M.A
1. По стандарту в передатчике C4FM два фильтра: Raised Cosine и isinc. Соответственно, приемную сторону нужно проектировать с учетом данного факта.
2. Вроде бы apco25 C4FM передается в полосе 12.5 кГц, не мало ли будет полосы в 8 кГц на входе?
Quasar
Цитата(D.I.M.A @ Nov 24 2014, 11:41) *
1. По стандарту в передатчике C4FM два фильтра: Raised Cosine и isinc. Соответственно, приемную сторону нужно проектировать с учетом данного факта.
2. Вроде бы apco25 C4FM передается в полосе 12.5 кГц, не мало ли будет полосы в 8 кГц на входе?


В стандарте схема демодулятора приведена такая:


То есть используется Integrate and Dump фильтр, но честно говоря, я не совсем понимаю, как принимать с его помощью.
По поводу полосы, да, полоса в эфире 12.5 КГц. По стандарту, при формировании модулирующего сигнала, его пропускают через Raised Cosine и isinc фильтры, ограничивая полосу частотой 2880.

Цитата
The response of the filter above 2880 Hz is not specified because the filter H(f) should cut off above 2880 Hz.




Цитата(petrov @ Nov 23 2014, 22:40) *
да и вообще стыдно уже через аналоговый частотный дискримнатор делать с потерями, CPFSK когерентно демодулируются как фазовые модуляции.


Это все конечно прекрасно, я же не спорю. Задача на уже существующем железе это сделать.
D.I.M.A
Цитата(Quasar @ Nov 24 2014, 12:39) *
То есть используется Integrate and Dump фильтр, но честно говоря, я не совсем понимаю, как принимать с его помощью.


Integrate and Dump фильтр можно реализовать в виде КИХ-фильтра (обычный sinc фильтр), это будет фильтр со всеми коэффициентами, равными 1 и длинной, равной длительности одного символа. Например, если у вас 4 отсчета на символ, то I&D фильтр будет КИХ фильтр с коэф. {1,1,1,1}. Не помню, нужно ли нормировать выход фильтра. Структурно, в приемнике, I&D нужно ставить после Raised Cosine.
petrov
Цитата(D.I.M.A @ Nov 24 2014, 12:51) *
Структурно I&D нужно ставить после Raised Cosine.


Первый в приёмнике, второй в передатчике.
Quasar
Цитата(petrov @ Nov 24 2014, 13:06) *
Первый в приёмнике, второй в передатчике.


Тогда еще вопрос, в догонку, а я правильно понимаю, что частота среза у RC фильтра 2400 (то есть половина символ рейта) и параметр beta=0.2? В приложениях для синтеза подобного фильтра спрашивают частоту среза (ну её-то по АЧХ понять можно) и бету, вот насчет беты сомнения у меня.
D.I.M.A
Цитата(petrov @ Nov 24 2014, 13:06) *
Первый в приёмнике, второй в передатчике.


А зачем I&D в передатчике? В передатчике нужен inverse sinc.

Цитата(Quasar @ Nov 27 2014, 20:34) *
Тогда еще вопрос, в догонку, а я правильно понимаю, что частота среза у RC фильтра 2400 (то есть половина символ рейта) и параметр beta=0.2? В приложениях для синтеза подобного фильтра спрашивают частоту среза (ну её-то по АЧХ понять можно) и бету, вот насчет беты сомнения у меня.


Да, все верно.

petrov
Цитата(D.I.M.A @ Nov 28 2014, 12:55) *
А зачем I&D в передатчике? В передатчике нужен inverse sinc.


Я такого не писал. Приподнятый косинус в передатчике, скользящее среднее в приёмнике, наоборот структурно можно сделать?
D.I.M.A
Цитата(petrov @ Nov 28 2014, 14:00) *
Я такого не писал. Приподнятый косинус в передатчике, скользящее среднее в приёмнике, наоборот структурно можно сделать?

Как тогда понимать фразу?

Цитата(petrov @ Nov 24 2014, 13:06) *
Первый в приёмнике, второй в передатчике.


Скользящее среднее должно быть реализовано в приемнике, что бы скомпенсировать Inverse Sinc передатчика. Т.е. в передатчике RC+InverseSinc, в приемнике - скользящее среднее. Мы говорим об одном и том же?
Fat Robot
Странно, мне всегда в подобных схемах isinc на приемном конце встречался.

Но видимо в моих случаях была задача обузить полосу.
А в вашем isinc на передающем конце выполняет ту же роль, что и Pre-emphasis filter при чм передаче.

Цитата(D.I.M.A @ Nov 28 2014, 14:16) *
Скользящее среднее должно быть реализовано в приемнике, что бы скомпенсировать Inverse Sinc передатчика. Т.е. в передатчике RC+InverseSinc, в приемнике - скользящее среднее.
D.I.M.A
Цитата(Fat Robot @ Nov 28 2014, 17:00) *
Странно, мне всегда в подобных схемах isinc на приемном конце встречался.

Но видимо в моих случаях была задача обузить полосу.
А в вашем isinc на передающем конце выполняет ту же роль, что и Pre-emphasis filter при чм передаче.


В apco это сделано для того, что бы сделать общий демодулятор для двух фаз apco25: C4FSK и pi/4-DQPSK. Нажмите для просмотра прикрепленного файла
Fat Robot
Я подозреваю, что эта возможность - побочный продукт. По современным меркам расширение полосы лишь в угоду удобства обработки - дикость. Хотя и такие варианты мне встречались.

Цитата(D.I.M.A @ Nov 28 2014, 15:07) *
В apco это сделано для того, что бы сделать общий демодулятор для двух фаз apco25: C4FSK и pi/4-DQPSK.

petrov
Цитата(D.I.M.A @ Nov 24 2014, 12:51) *
Структурно, в приемнике, I&D нужно ставить после Raised Cosine.


Вот как это понимать? В приёмнике у вас изначально не было, исправлено было уже после моего поста. Зачем приподнятый косинус приёмнике?
D.I.M.A
Цитата(petrov @ Nov 28 2014, 17:57) *
Вот как это понимать? В приёмнике у вас изначально не было, исправлено было уже после моего поста. Зачем приподнятый косинус приёмнике?


Виноватsm.gif Даже не обратил на это внимание, прошу прощения. Конечно же, не за чем!
Quasar
Цитата(petrov @ Nov 28 2014, 17:57) *
Вот как это понимать? В приёмнике у вас изначально не было, исправлено было уже после моего поста. Зачем приподнятый косинус приёмнике?


Цитата
Виноватsm.gif Даже не обратил на это внимание, прошу прощения. Конечно же, не за чем!


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

По фильтрам тогда я не понимаю, почему фильтр в приемнике обзывают Integrate and Dump, хотя по сути получается это обычный Moving Average? Или он должен быть засинхронизирован с символами и сбрасывать свое состояние после того, как все отсчеты принадлежащие текущему символу закончились?

http://www.mathworks.com/help/comm/ref/integrateanddump.html
petrov
Цитата(Quasar @ Nov 28 2014, 18:19) *
Я его в своем приемнике использовал как интерполирующий, в приемнике его быть не должно по идее.

По фильтрам тогда я не понимаю, почему фильтр в приемнике обзывают Integrate and Dump, хотя по сути получается это обычный Moving Average? Или он должен быть засинхронизирован с символами и сбрасывать свое состояние после того, как все отсчеты принадлежащие текущему символу закончились?

http://www.mathworks.com/help/comm/ref/integrateanddump.html


Да. Стоит ли слепо всё это повторять? Может лучше подобрать ФНЧ по минимуму межсимвольной интерференции и максимуму сигнал/шум.
Quasar
Цитата(petrov @ Nov 28 2014, 18:35) *
Да. Стоит ли слепо всё это повторять? Может лучше подобрать ФНЧ по минимуму межсимвольной интерференции и максимуму сигнал/шум.


В общем, алгоритм который я задумал, с поиском максимальной корреляции данных в FIFO с синхро-последовательностью, при поступлении каждого нового семпла, у меня так и не заработал как надо. Не понимаю в чем проблема. При потоковой передаче псевдослучайной-последовательности с целью замера BER, все получается, вплоть до уровня -115 ...-116 дБ (в качестве приемника/передатчика использую обычный аналоговый репитер). Но при реальной работе в эфире иногда (1 из 50 пакетов) проскакивают ошибки даже в ближней зоне.

Решил пока забить на этот алгоритм и начал изучать демодулятор из GNU Radio, с целью понять причину периодических ошибок во время его работы:

https://github.com/luizrenault/op25/blob/ma...emod_ff_impl.cc

В нем, для получения отсчетов во время каждого символа используют MMSE интерполяцию, но мне не ясно, как построили таблицу taps'ов для интерполяции и почему время подстраивают вот таким образов?

Код
// symbol clock tracking loop gain
      const double K_SYMBOL_TIMING = 0.025;
      if(interp_p1 < interp) {
         d_symbol_clock += symbol_error * K_SYMBOL_TIMING;  
      } else {
         d_symbol_clock -= symbol_error * K_SYMBOL_TIMING;
      }


Плюс, может кто подскажет, почему используют такой непонятный способ борьбы с постоянной составляющей?

Код
// our output symbol will be interpolated value corrected for symbol_spread and frequency offset
      interp -= fine_frequency_correction;
      interp_p1 -= fine_frequency_correction;
...
// coarse tracking loop: for eventually frequency shift request generation
      static const double K_COARSE_FREQUENCY = 0.00125;    // time constant for coarse tracking loop
      coarse_frequency_correction += ((fine_frequency_correction - coarse_frequency_correction) * K_COARSE_FREQUENCY);

      // fine loop
      static const double K_FINE_FREQUENCY = 0.125;        // internal fast loop (must be this high to acquire symbol sync)
      fine_frequency_correction += (symbol_error * K_FINE_FREQUENCY);


То есть, высчитывают постоянную составляющую исходя из текущей ошибки в отсчете символа.
Почему бы просто не пропустить через фильтр ВЧ с частотой среза 1-2 Гц?

petrov
Цитата(Quasar @ Jul 27 2015, 18:03) *
Почему бы просто не пропустить через фильтр ВЧ с частотой среза 1-2 Гц?


Потому что полезный сигнал имеет низкочастотные составляющие, на выходе DC wander начнётся, слишком узкополосный фильтр ВЧ будет долго устанавливаться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.