PDA

Просмотр полной версии : Формирование микроконтроллером SSB сигнала на частоте DDSa



RZ6AT
12.06.2008, 13:56
Хочу поделиться и обсудить идею, решение которой я нашёл в сентябре 2007 года, но всё нет возможности допаять и отладить программу, поэтому рещил попросить помощь на форуме, может кто поможет проверить работоспособность идеи программно формировать SSB (USB или LSB выбирается программно) речевой сигнал на любой выходной частоте DDSa. Это позволит избежать применение смесителей на передачу, но, возможно, и на приём тоже, но это потом.
Суть идеи заключается в том, что в современных DDSах в их структуру введены дополнительные регистры, которые позволяют управлять программно амплитудой и фазой выходного сигнала DDSa. И, возможно, они сами и придумали такой способ формирования в том числе и SSB сигнала и ввели для этого эти блоки, а мы, не зная этого, изобретаем то, что они придумали до нас... Но как бы то ни было, давайте посмотрим, как можно программно формировать SSB речевой сигнал сразу на выходной частоте DDSa. Допустим, что мы запрограммировали DDS на выдачу выходного сигнала с частотой 10 МГц?, смотри схему ниже. Мы заглянули в описание DDSa и посчитали код, который нужно записать в регистр инкремента сумматора фазы и этот код инкремента стал постоянно, с частотой генератора Gen1 накапливаться (суммироваться) в сумматоре фазы, линейное нарастание которой, с шагом(инкрементом), обратно пропорциональным выходной частоте, производит выборку из зашитой внутри DDSa таблицы синуса и подаёт выбранный код амплитуды синуса на выходной ЦАП DDSa, добавленные в структуру регистр + сумматор кода фазы и регистр + перемножитель кода амплитуды позволяют вариировать в такт со звуковым сигналом мгновенную фазу и амплитуду выходного сигнала. Так как информация о фазе и амплитуде внутри DDS должна быть представлена в цифровом виде, то мы должны перевести аналоговый сигнал с микрофона в цифровой, для чего необходимо его усилить, например, на операционном усилителе ОР1 и подать на вход ADC0 аналогово-цифрового преобразователя, например, встроенного в микроконтроллер МК АТmega8. Частоту выборок нужно сделать по крайней мере не ниже удвоенной верхней частоты звукового диапазона речи, например 8 кГц, но для того, чтобы получить информацию о фазе звукового сигнала, нужно производить выборку квадратурного сигнала, т.е. сдвинутого на 90 градусой сигнала 8 кГц или просто через четверть периода от основной выборки. Тогда быстродействие АЦП должно составлять 32 кГца, но внутри АТmega8 быстродействие составляет 16 Кгц. Для того, чтобы он успевал делать квадратурные выборки, применим схему выборки и хранения на аналоговом ключе SW1, который управляется одним из выходов МК так, что ключ открывается и заряжает конденсатор C1 весь период 8кГц, за исключением времени от четверти до половины периода, как бы перенося во времени иформацию о мгновенной амплитуде речевого сигнала с четверти на половину периода и считывая его вторым входом АЦП ADC1 и тогда быстродействия в 16 кГц хватает, чтобы выбирать и основной и квадратурный сигналы. Информацию о мгновенной амплитуде можем легко вычислить, представив, что наши выборки являются проекциями вектора мгновенной амплитуды на ортогональные оси, так как они сдвинуты по времени на 90 градусов. Тогда амплитуда равна корню квадратному из суммы квадратов двух выборок основной и квадратурной за период, а фаза равна арктангенсу отношения основной выборки к квадратурной. Но вычисление отношения имеет подводные камни, когда знаменатель может быть, а он вполне может быть, равен нулю. Для обхода подводных камней вспомним, что частота является производной от фазы и что вместо изменения регистра фазы мы можем изменять регистр частоты, пропорционально производной от фазы, а производная от фазы это производная от арктангенса отношений основной и квадратурной выборок за период. Смотрим в справочник по производным и находим, что производная от арктангенса отношения А/B равна А делить на сумму квадратов А и В, а так как сумма квадратов всегда больше нуля, хотя бы от шума микрофона, то подводные камни обойдены. И теперь если мы хотим иметь верхнюю боковую на выходе, то вычисляем производную и прибавляем в регистр частоты соответствующий довесок к мгновенной частоте, а если нижнюю боковую, то вычитаем и соответственно вычисляем по описанной ранее методике текущую амплитуду и засылаем её в регистр амплитуды - на выходе должен формироваться соответствующий однополосный сигнал.
Если кто может смакетировать такую схему и написать программу и проверить как это работает, то всем нам откроется путь как формировать SSB сигнал без применения смесителей, сразу на рабочей частоте.

ur8us
13.06.2008, 20:15
Хочу поделиться и обсудить идею, .....

Вот здесь недавно обсуждали: http://forum.qrz.ru/thread18474.html - смотрите другие ссылки в тексте.

В интернете можно найти еще кое-что, например,

http://www.radioscanner.ru/info/article231/

Получил ли кто-то SSB - я не знаю. А мне лень экспериментировать. :-) :-(

Vlad_LA
14.06.2008, 08:05
Владимир, может лучше на FPGA
Статья в последнем QEX-May/June 2008, сайт автора http://james.ahlstrom.name/quisk/
73, удачи! km6z

RZ6AT
14.06.2008, 23:30
Спасибо, ребята за ссылки, но я не спрашиваю КАК это сделать, а предлагаю сделать это ТАК. Просто нужна помощь, кто бы помог это реализовать и проверить, как это работает в натуре. Кстати, с интересом прочитал форум на qrz.ru на эту тему, и похоже то, что я предлагаю - это ответ на вопросы Сергея RX3AKT и ему быстрей всех проверить работу этого метода, так как у него уже распаяны на его платах контроллер и DDS и программа записи в него отлажена, остаётся только собрать схемку для усиления микрофона и добавить в программу вычислления фазы - амплитуды у него уже управляются. Так что предлагаю Сергею RX3AKT cсовместно изобрести метод формирования SSB в DDSe, который похоже, до нас американцы изобрели, а аналоговые девицы для его реализации ввели в своих новых DDSax нужные регистры.

vadim_d
15.06.2008, 00:32
я не спрашиваю КАК это сделать, а предлагаю сделать это ТАК.
Аналоговая разновидность этого метода (если я его правильно понял) давно известна. Там на достаточно низкой частоте формировали (все-таки) однополосный сигнал, затем разделяли его на частотную и амплитудную компоненты. Целью было повышение КПД путем замены линейного выходного каскада на АМ каскад. Реализация правда включала две петли - амплитудную и фазовую, в цифре все это не нужно.

Vlad_LA
15.06.2008, 05:23
Владимир, 5 дней в неделю работаю с платой моего последнего проекта. На плате AD9958, использую один канал, AD9959 четыре канала, четыре LTC2202, микроконтроллер TMS320VC5509a. В процессе разработки плата с AD9910, EP3C40. Поэтому не навязчиво дал Вам ссылку. Дерзайте, желаю удачи.
73!

ur8us
15.06.2008, 16:41
Спасибо, ребята за ссылки, но я не спрашиваю КАК это сделать, а предлагаю сделать это ТАК.

Владимир, я дал ссылку на forum.qrz.ru не зря. Там я писал о том, что:

1) Так можно сделать.
2) Так делать не нужно.

Попробую объяснить, почему:

1) Не вызывает сомнения, что корреспондент с приемником услышит SSB-сигнал, полученный таким способом. Этот способ формирования SSB-сигнала предельно ясен. Остается написать программу для микроконтроллера, вычисляющую значения регистров DDS. Более того, для эксперимена можно не заставлять несчастный контроллер делать это "на лету", а расчитать значения на компьютере и "зашить" готовую таблицу в Flash-память микроконтроллера (или в отдельный чип памяти).

2) В предложенном способе формирования сигнала амплитуда и частота (или амплитуда и фаза) выходного сигнала будут изменяться скачками. Это значит, что "вокруг" полезного сигнала будут присутствовать сигналы помех, в том числе, на расстоянии, равном частоте дискретизации. По моим представлениям, уровни сигналов помех будут никак не ниже -40 дБ (относительно полезного сигнала при частоте подачи управляющих сигналов на DDS в несколько кГц).

Поэтому я не хочу делать такой передатчик.

В схемах с использованием ПЛМ входной звуковой сигнал передискретизируют на частоту работы выходного ЦАП-а (с последующей цифровой фильтрацией). Проще говоря, повышают частоту дискретизации звукового сигнала, чтобы скачки частоты, амплитуды и фазы были минимальными.

Могу предложить две идеи, как уменьшить скачки и их влияние на "чистоту" выходного сигнала.

Например, попытаться "сгладить" их при помощи встроенных в чип DDS функций frequency sweep, phase sweep, amplitude sweep. Однако не все микросхемы DDS имеют подобные функции (дешевые - не имеют). Думаю, что таким образом можно уменьшить уровень помех всего на нескольно дБ - но этого может оказаться достаточно.

Может быть, можно "подмешать" в сигналы управления DDS-ом сгенерированную определенным образом псевдошумовую последовательность (похожим образом удается снизить помехи PLL-синтезаторов с дробным коэффициентом деления). Но это, наверное, тема для диссертации. :-)

Вообще говоря, идея простого SSB-передатчика на микроконтроллере и DDS мне очень нравится, поскольку она изящна и перспективна - в отличие от решений с отдельными DDS, PLD и DSP (эти схемы - чудовищны).

Sergey_gh
16.06.2008, 12:01
В целом идея верна, но


... но для того, чтобы получить информацию о фазе звукового сигнала, нужно производить выборку квадратурного сигнала, т.е. сдвинутого на 90 градусой сигнала 8 кГц или просто через четверть периода от основной выборки.

Нет не так. Для получения мгновенных амплитуды и фазы нужен цифровой широкополосный фазовращатель на весь звуковой диапазон речи для получения аналитического сигнала.


Смотрим в справочник по производным и находим, что производная от арктангенса отношения А/B равна А делить на сумму квадратов А и В,

Что-то не то, производная должна быть по времени. Про производную сложной функции не забыли?


... то вычитаем и соответственно вычисляем по описанной ранее методике текущую амплитуду и засылаем её в регистр амплитуды - на выходе должен формироваться соответствующий однополосный сигнал.

Согласен с uu9jdr, перед выводом в DDS нужна передискретизация амплитуды и производной от фазы на как можно большую частоту с одновременной фильтрацией (обычно это делают CIC фильтром).


Про ATMega можно забыть, быстродействия не хватит.

А чем не устраивает вариант АЦП -> FPGA -> ЦАП? По цене одинаково.

АндрейЦ
17.06.2008, 16:34
В целом идея верна, но

[Нет не так. Для получения мгновенных амплитуды и фазы нужен цифровой широкополосный фазовращатель на весь звуковой диапазон речи для получения аналитического сигнала.


А чем не устраивает вариант АЦП -> FPGA -> ЦАП? По цене одинаково.

Под задачу неплохо идёт AD9957.О нём я недавно спрашивал.
Кристалл сам по себе несколько своебразный, но работать можно.
Подскажите как сформировать квадратурную последовательность, пусть даже для синуса 1 кгц.Пока что в приёмнике шумы, хотя на анализаторе спектра что то есть.если б быть уверенным, что мы формируем правильную последовательность, было бы проще разбираться.

Пы.Сы. процессорных ресурсом много, sin/cos в реальном времени не проблема.

Sergey_gh
17.06.2008, 17:11
Подскажите как сформировать квадратурную последовательность, пусть даже для синуса 1 кгц.

??? Либо я не понял вопроса, либо он тривиален.

Подайте на I косинус, на Q синус частоты 1 КГц. На выходе получите Fnco + 1 КГц. Поменяйте местами синус и косинус, на выходе получите Fnco - 1 КГц.

АндрейЦ
17.06.2008, 18:48
Подскажите как сформировать квадратурную последовательность, пусть даже для синуса 1 кгц.

??? Либо я не понял вопроса, либо он тривиален.

Подайте на I косинус, на Q синус частоты 1 КГц. На выходе получите Fnco + 1 КГц. Поменяйте местами синус и косинус, на выходе получите Fnco - 1 КГц.

В том то и дело, что тривиален.
Там внутри ддса есть ещё и память :)
Грузим туда по 1000 отсчётов sin и cos, включаем циклическое воспроизведение с периодом между отсчётами 1мкс, а в приёмнике тихо, есть только несущая.

EU1ME
17.06.2008, 20:54
а в приёмнике тихо, есть только несущая.
А частота несущей какая?

АндрейЦ
18.06.2008, 14:46
а в приёмнике тихо, есть только несущая.
А частота несущей какая?

Несущая 96 мгц.Эта частота у нас свободна, удобно слушать приёмником.

EU1ME
18.06.2008, 15:03
Я вопрос не просто так задал - измерьте точно частоту несущей при выкл и вкл формирователе. :D

АндрейЦ
03.07.2008, 09:36
Я вопрос не просто так задал - измерьте точно частоту несущей при выкл и вкл формирователе. :D

Я тоже не просто так молчал :D .Переделали интерфейсную часть, ДДС
повесили просто на порт и эмулируем обмен "дёрганьем" ножек процессора.В приёмнике появился тон 1 кгц.(Ура!!!)Очень грязный.
Тут правда и мы SIN и COS гоним только положительные, но всё равно неясно откуда столько гармошек. На анализаторе спектра лес.

Вот, допустим, я беру waw-ку 8бит-8кгц-моно для получения I и Q и её перемножаю на SIN и COS или как?

EU1ME
04.07.2008, 21:43
Андрей, вопрос о частоте я задал не праздный - если все верно сделано, то на выходе ддс долже быть чистый синус с частотой Fdds + или - 1кГц. Никаких тонов, модуляций итп прослушиваться не должно, просто "сдвиг" выходной частоты.

АндрейЦ
06.07.2008, 02:35
Андрей, вопрос о частоте я задал не праздный - если все верно сделано, то на выходе ддс долже быть чистый синус с частотой Fdds + или - 1кГц. Никаких тонов, модуляций итп прослушиваться не должно, просто "сдвиг" выходной частоты.

Ч3-63 в режиме с "широкой" полосой показывает 77с копейками мгц.
В режиме "узкой" полосы не могу померять вообще.
В режиме "сингл тоне" DDS чётко даёт 96мгц.
Прослушивая приёмником модулированный сигнал, на 96мгц слышно тон 1кгц, но грязный. К сожалению анализатор спектра кажет только до 50мгц, посмотреть не могу, но если выставляю на ДДс более низкую частоту чётко видно и несущую в сингл тоне и очень загаженный спектр с включённой модуляцией.При этом несущая никуда не уходит и описанный выше фокус с частотомером я рассматриваю как продлемы с грязным сигналом.

ПыСы сама AD9957 документирована не ахти и многое приходится делать методом тыка.

АндрейЦ
16.07.2008, 18:54
[quote=Alex007]Андрей, вопрос о частоте я задал не праздный - если все верно сделано, то на выходе ддс долже быть чистый синус с частотой Fdds + или - 1кГц. Никаких тонов, модуляций итп прослушиваться не должно, просто "сдвиг" выходной частоты.

Уря :super: заработало. При подаче сдвинутого 1 кгц синуса двигается несущая.Спектр чистый.Как из, допустим, waw-ки получить IQ последовательность?

luser_banker
27.01.2010, 19:26
интересно - на чем закончились эксперименты?

romanetz
08.05.2016, 17:30
Подниму старую тему. Продолжение ее есть тут http://forum.qrz.ru/186-ct-obschie-voprosy/18474-pryamoy-sintez-ssb-na-dds-2.html
С 2008 года железо, способное в реальном времени высчитывать нужные параметры и быстро-быстро отсылать их в DDS стало несравненно доступнее (имею в виду STM32F4). И тут мне пришел такой код на ум:
Для каждого отсчета звука:
{static float Phase_old;
I=sin(1500*2*pi*n/Fs)*sample_value;


Q=cos(1500*2*pi*n/Fs)*sample_value;

A=sqrt(I*I+Q*Q);
Phase_old=Phase;
Phase=atan2(I/Q);
F=(Phase-Phase_old)/(2*pi)*Fs;
Send_AD9951(FTW_REG, F0+F);
Send_AD9951(ASF_REG, A);

}

Осталось его проверить в железе :-)
Мгновенную частоту можно не вычислять, а перейти сразу к мгновенной фазе, и писать ее в другой регистр AD9951.
Phase=atan2(I/Q);
Send_AD9951(POW_REG, Phase);
между выходом алгоритма и регистрами DDS, естественно, значения нужно перенормировать с учетом диапазонов переменных [13:0] у амплитуды и фазы.
Вопрос такого плана: для SSB нужно пропустить входные отсчеты через фильтр? Если специально полосу не ограничивать (например, отсчеты идут с частотой 48 кГц, а полоса SSB сигнала предполагается 24 кГц) - тогда нужно частоту вспомогательного генератора выставить как четверть частоты дискретизации, т.е. 12 кГц?
По поводу побочных излучений. Есть результаты измерения побочных излучений при ЧМ DDS AD9951 в цифре КСС'ом при частоте дискретизации 384 кГц (сейчас добился 768 кГц).
233567

rx9cim
08.05.2016, 19:19
Есть несколько способов получения ssb. Один из простых - входной сигнал фильтруется, с помощью преобразователя Гильберта получается аналитический сигнал который далее переносится на нужную частоту.
Ваш метод пригоден только для формирования SSB на фиксированной частоте, поскольку ВЧ сигнал полученный таким способом будет содержать копии модулированного сигнала. Чтобы убрать копии потребуется фильтрация которую проще всего сделать на одной частоте.
На приведенной картине спектра видны эти самые копии, видимо они подавляются фильтром?

romanetz
08.05.2016, 19:55
Т.к. у них уровень максимальный -60 дБн - просто на них забили...

rx9cim
08.05.2016, 20:35
Я думаю, что сначала фильтранули, а потом забили.

romanetz
08.05.2016, 20:54
Нет, полосового фильтра никакого не было, только ФНЧ до 200 МГц.
Да и потом, 250 кГц на 100 МГц отфильтровать только спиральником можно

UR4UDT
08.05.2016, 21:19
Есть несколько способов получения ssb. Один из простых - входной сигнал фильтруется, с помощью преобразователя Гильберта получается аналитический сигнал который далее...
...используя CORDIC получаем амплитуду огибающей и фазу. Грузим в один канал AD9958 и имеем на выходе SSB до 200 МГц.
Справляется даже простенький PIC18.
Если есть сомнения - попробуйте.

rx9cim
08.05.2016, 21:32
...используя CORDIC получаем амплитуду огибающей и фазу. Грузим в один канал AD9958 и имеем на выходе SSB до 200 МГц.
Справляется даже простенький PIC18.
Если есть сомнения - попробуйте.
Сомнений нет. Только для фазы надо опять таки делать преобразователь Гильберта.
У меня сомнения в том, что почему копии так давятся? В моем представлении т.к. в тракте проц-ддс и в самой ддс нет фильтрации копий, то копии должны быть с одинаковым уровнем равным уровню основного сигнала. Кто может пояснить?

UR4UDT
08.05.2016, 21:49
Только для фазы надо опять таки делать преобразователь Гильберта.
Я этого не делал.
Фактически CORDIC (в моем варианте) выдавал не фазу, а мгновенное значение частоты. Вернее её отклонение от виртуальной несущей. FTW грузил сразу в DDS.
Результат удовлетворил.

Леонид3
08.05.2016, 22:58
rx9cim, получить каналы I и Q со сдвигом 90о заданной точности и полосе пропускания можно с помощью фильтра на рисунке. Не требует больших ресурсов, задержка сигнала всего 1 такт дискретизации на ячейку. Экспериментальная частотная характеристика показывает совпадение практики с расчётом.