Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FSK модулятор
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
rimidalv
Добрый день! Нужно сделать FSK модулятор

Есть 2 таблицы IQ составляющих для синуса, соответственно для частоты Fmark(для единичного бита) и Fspace(для 0-го бита)
Частота приема входных данных Fin и частота оцифровки Fd
Правильно ли я понимаю, что в выходной буфер, размер которого в N=(Fd/Fin) больше входного, кладем N отсчетов из соответствующей
таблицы синусов для каждого входного символа?

Если да, то как быть с разрывом фазы модулирующего синуса при смене частоты с Fmark на Fspace и ноборот?
Fat Robot
Если у вас нет какого-то сглаживания модулирующих символов (типа gfsk), и девиация кратна частоте следования символов, то разрыва фазы не будет т.е. при целом индексе модуляции в символе всегда будет целое число периодов.
Если девиация кратна половине частоты символов, как в msk, то необходимо учитывать предыдущий символ и его нач. фазу для установки начальной фазы текущего. Итого формально будет 4 таблицы, но можно обойтись и двумя, если, например, читать с декрементом указателя. Надеюсь, вы понимаете, о чем я, Владимир.

Количество таблиц при заданном индексе можно определить, нарисовав фазовую диаграмму.

Но лучше вместо прямого табличного метода для формирования чм использовать NCO. Возможностей у такого метода гораздо больше при незначительном усложнении логики.

Цитата(rimidalv @ Feb 27 2016, 14:34) *
Если да, то как быть с разрывом фазы модулирующего синуса при смене частоты с Fmark на Fspace и ноборот?
rimidalv
Да, понятно, Большое спасибо, к концу дня приходит понимание понемножку...
Corner
Если частоты ортогональны, то нужна одна таблица и счетчик с переключением шага. Две таблицы это какое-то извращение.
blackfin
Цитата(Corner @ Feb 29 2016, 19:46) *
Если частоты ортогональны, то нужна одна таблица и счетчик с переключением шага.

А что это такое - "частоты ортогональны"???
Corner
Цитата(blackfin @ Feb 29 2016, 18:52) *
А что это такое - "частоты ортогональны"???

В данном случае выполняется условие, что частоты равны целым коэффициентам дробного деления по степени числа 2. Например 2/64 и 3/64 - хватит таблички в 64 точки и 6 битного счетчика с шагом 2 и 3.
blackfin
Цитата(Corner @ Mar 1 2016, 12:31) *
В данном случае выполняется условие, что частоты равны целым коэффициентам дробного деления по степени числа 2.

Весьма странное определение ортогональности. Полагаю, опять что-то проприетарное.. biggrin.gif

В ортогональность векторов в Гильбертовом пространстве я еще готов поверить, но чтобы два действительных числа 29 Гц и 31 Гц были ортогональны, это что-то уму нерастяжимое.. rolleyes.gif
Fat Robot
Для каждого символа memcpy или dma могут быть проще, чем операции с указателями при копировании каждого отсчета.

Цитата(Corner @ Feb 29 2016, 19:46) *
Если частоты ортогональны, то нужна одна таблица и счетчик с переключением шага. Две таблицы это какое-то извращение.
Corner
Цитата(blackfin @ Mar 1 2016, 12:49) *
Весьма странное определение ортогональности. Полагаю, опять что-то проприетарное.. biggrin.gif
В ортогональность векторов в Гильбертовом пространстве я еще готов поверить, но чтобы два действительных числа 29 Гц и 31 Гц были ортогональны, это что-то уму нерастяжимое.. rolleyes.gif


Опять по словарю буквы сверяете? Орфография, запятые)))
Указанный метод - прямое формирование с амплитудой и фазой равными константе. Меняется только частота. Чем меньше шаг частот, тем длиннее выборка и/или чаще передискретизация требуется.

Цитата(Fat Robot @ Mar 1 2016, 12:49) *
Для каждого символа memcpy или dma могут быть проще, чем операции с указателями при копировании каждого отсчета.

Если это МП или МК, то, возможно. Хотя, сомнительно, что можно переключать контроллер ПДП быстрее, чем менять шаг в регистре. Для этого он должен поддерживать блочную выборку переменного размера аппаратно. И указатель, все равно, переключать придется. Хотя и реже.
Также, у ТI процессоры поддерживают автоматическое кольцевание указателей внутри инструкции. В результате, все упирается в шину, а не архитектуру, а память и код экономятся, хорошо ложаться в КЭШ, если он есть.
А вот на ПЛИС лучше счетчиком играться. Без вариантов.
blackfin
Цитата(Corner @ Mar 2 2016, 12:10) *
Для этого он должен поддерживать блочную выборку переменного размера аппаратно.

Рекомендую ознакомиться: Scatter/gather through linked list operation.

Цитата(Corner @ Mar 2 2016, 12:10) *
А вот на ПЛИС лучше счетчиком играться. Без вариантов.

Есть, есть варианты! Просто они вам не известны.. biggrin.gif
_4afc_
Баловался несколько лет назад частотной манипуляцией через таблицы.

Для ЧМ2 с разницей между частотами в 0.5 символьной скорости фаза предыдущего символа может принимать 2 значения. Для передачи без разрыва фазы - требуется 4 варианта символа. При 29 отсчётах на символ простейший вариант таблицы будет иметь размер 4*29=116 слов, а спектр сигнала теоретически выглядеть так:

Нажмите для просмотра прикрепленного файла

При реализации на BF561 не было времени разбираться как работает ПДП по указателям - поэтому просто копировал нужные символы в выходной буфер. На выходе ЦАП спектр выглядел так:

Нажмите для просмотра прикрепленного файла

Для ЧМ4 с разницей между частотами в 0.25 символьной скорости фаза предыдущего символа может принимать 4 значения. Для передачи без разрыва фазы - требуется 16 вариантов символа. При 128 отсчётах на символ простейший вариант таблицы будет иметь размер 16*128=2048 слов, а спектр сигнала теоретически выглядеть так:

Нажмите для просмотра прикрепленного файла
blackfin
Цитата(_4afc_ @ Mar 2 2016, 18:37) *
Баловался несколько лет назад частотной манипуляцией через таблицы.

Для ПЛИС можно вообще обойтись без таблиц, если есть лишний умножитель и есть запас по частоте клока.

Для этого можно воспользоваться формулами рекурсивного вычисления sin/cos:

sin0 = 0;
sin1 = amp*sin(dt);
...
sinn+2 = 2*cos(w*dt)*sinn+1 - sinn.

Точно также:

cos0 = amp;
cos1 = amp*cos(dt);
...
cosn+2 = 2*cos(w*dt)*cosn+1 - cosn.

Где:

amp - амплитуда sin/cos;

w - частота sin/cos;

dt - величина, обратная частоте дискретизации: dt = 1/Fd;

amp*sin(dt) и amp*cos(dt) - две константы, задающие начальные условия рекурсии и

cos(w*dt) - константа, задающая частоту sin/cos.

Ошибка вычисления синуса/косинуса для больших "n" зависит от разрядности умножителя и в процессе рекурсии, ессно, накапливается,

но для FSK это обычно не проблема, так как отношение частоты дискретизации Fd к символьной частоте Fs обычно невелико (то есть, Fd/Fs < 1000) ..
Fat Robot
Уточнение:
Накапливание ошибки sin/cos будет соответствовать накапливанию ошибки фазы из-за конечной разрядности вычислительных узлов. Т.е. генератор никогда не развалится, но в конце каждого символа будет фазовая ошибка, которую надо учитывать при установке параметров для генерации следующего символа.

Здесь подробнее и с вариантами
Нажмите для просмотра прикрепленного файла

Цитата(blackfin @ Mar 2 2016, 19:25) *
Для ПЛИС можно вообще обойтись без таблиц, если есть лишний умножитель и есть запас по частоте клока.

Для этого можно воспользоваться формулами рекурсивного вычисления sin/cos:

Ошибка вычисления синуса/косинуса для больших "n" зависит от разрядности умножителя и в процессе рекурсии, ессно, накапливается,
Corner
Цитата(blackfin)
Есть, есть варианты! Просто они вам не известны.. biggrin.gif

Знаю. Плавал. Для одной несущей они еще прокатывают, но уже при 16 начинаются проблемы с взаимным загаживанием полос. Табличное ОПФ надежнее.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.