|
4FSK, C4FM в частности |
|
|
|
Nov 23 2014, 09:27
|

Местный
  
Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021

|
Приветствую. Интересует алгоритм приема 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)
|
|
|
|
|
 |
Ответов
|
Nov 24 2014, 09:46
|

Местный
  
Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021

|
Цитата(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 когерентно демодулируются как фазовые модуляции. Это все конечно прекрасно, я же не спорю. Задача на уже существующем железе это сделать.
|
|
|
|
|
Nov 24 2014, 09:51
|

Участник

Группа: Участник
Сообщений: 48
Регистрация: 26-08-08
Из: Москва
Пользователь №: 39 824

|
Цитата(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.
Сообщение отредактировал D.I.M.A - Nov 24 2014, 10:13
|
|
|
|
|
Nov 28 2014, 15:19
|

Местный
  
Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021

|
Цитата(petrov @ Nov 28 2014, 17:57)  Вот как это понимать? В приёмнике у вас изначально не было, исправлено было уже после моего поста. Зачем приподнятый косинус приёмнике? Цитата Виноватsm.gif Даже не обратил на это внимание, прошу прощения. Конечно же, не за чем! Я его в своем приемнике использовал как интерполирующий, в приемнике его быть не должно по идее. По фильтрам тогда я не понимаю, почему фильтр в приемнике обзывают Integrate and Dump, хотя по сути получается это обычный Moving Average? Или он должен быть засинхронизирован с символами и сбрасывать свое состояние после того, как все отсчеты принадлежащие текущему символу закончились? http://www.mathworks.com/help/comm/ref/integrateanddump.html
|
|
|
|
|
Jul 27 2015, 15:03
|

Местный
  
Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021

|
Цитата(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 Гц?
|
|
|
|
Сообщений в этой теме
Quasar 4FSK Nov 23 2014, 09:27 petrov simulink в руки и отлаживать тщательно алгоритмы, ... Nov 23 2014, 19:40   petrov Цитата(D.I.M.A @ Nov 24 2014, 12:51) Стру... Nov 24 2014, 10:06    Quasar Цитата(petrov @ Nov 24 2014, 13:06) Первы... Nov 27 2014, 17:34     D.I.M.A Цитата(petrov @ Nov 24 2014, 13:06) Первы... Nov 28 2014, 09:55      petrov Цитата(D.I.M.A @ Nov 28 2014, 12:55) А за... Nov 28 2014, 11:00       D.I.M.A Цитата(petrov @ Nov 28 2014, 14:00) Я так... Nov 28 2014, 13:16        Fat Robot Странно, мне всегда в подобных схемах isinc на при... Nov 28 2014, 14:00         D.I.M.A Цитата(Fat Robot @ Nov 28 2014, 17:00) Ст... Nov 28 2014, 14:07          Fat Robot Я подозреваю, что эта возможность - побочный проду... Nov 28 2014, 14:21    D.I.M.A Цитата(petrov @ Nov 28 2014, 17:57) Вот к... Nov 28 2014, 15:03       petrov Цитата(Quasar @ Jul 27 2015, 18:03) Почем... Jul 27 2015, 18:23
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|