Необходимый пример программного кода с фазовой автоподстройкой
-
09-06-2019 - |
Вопрос
Кто-нибудь знает где-нибудь, где я могу найти реальные примеры кода программных циклов с фазовой синхронизацией (SPLLS)?
Мне нужен SPLL, который может отслеживать PSK-модулированный сигнал, который находится где-то между 1,1 кГц и 1,3 кГц.Поиск в Google выдает множество научных работ и патентов, но ничего полезного.Даже во время похода в университетскую библиотеку, где на полке полно книг по аппаратным ФАПЧ, в одной книге по ФАПЧ была только одна глава, и она была скорее теоретической, чем практической.
Спасибо, что уделили мне время.
Йен
Решение
Это пакет интерактивного дизайна для проектирования цифровых (т. е.программное обеспечение) контуры фазовой автоподстройки частоты (PLL).Заполните форму и нажмите кнопку `Отправить", и для вас будет разработано PLL.
Это поможет вам начать, но вы в самом деле вам необходимо достаточно хорошо понимать основы проектирования PLL, чтобы создать его самостоятельно, чтобы позже устранить неполадки - это область цифровой обработки сигналов, и, хотя это не черная магия, она, безусловно, позволит вам сэкономить свои деньги во время отладки.
-Адам
Другие советы
Я полагаю, что, вероятно, уже слишком поздно помогать вам (что вы в итоге сделали?) но это может помочь следующему парню.
Вот пример программного цикла с фазовой синхронизацией, который я только что написал в одной строке языка Си, который будет подпевать вам:
main(a,b){for(;;)a+=((b+=16+a/1024)&256?1:-1)*getchar()-a/512,putchar(b);}
Сначала я представляю эту миниатюрную версию для игры в гольф, чтобы убедить вас в том, что программные циклы фазовой автоподстройки на самом деле довольно просты, хотя они могут быть сложными.
Если вы передадите ему 8-битные линейные сэмплы на stdin, он выдаст 8-битные сэмплы пилообразной волны, пытающейся отследить на одну октаву выше на stdout.Со скоростью 8000 выборок в секунду он отслеживает частоты в районе 250 Гц, чуть выше B ниже середины C.В Linux вы можете сделать это, набрав arecord | ./pll | aplay
.Младшие 9 бит b
являются генератором (что может быть VCO в аппаратной реализации), который генерирует прямоугольную волну (1 или -1), которая умножается на форму входного сигнала (getchar()
) для получения выходного сигнала фазового детектора.Затем этот выходной сигнал фильтруется по нижним частотам в a
для получения сглаженного сигнала ошибки фазы, который используется для регулировки частоты колебаний b
чтобы подтолкнуть a
приближается к 0.Собственная частота прямоугольной волны, когда a == 0
, предназначен для b
увеличивать на 16 каждую выборку, что увеличивает ее на 512 (полный цикл) каждые 32 выборки.32 выборки со скоростью 8000 выборок в секунду составляют 1/250 секунды, именно поэтому собственная частота составляет 250 Гц.
Затем putchar()
принимает младшие 8 бит b
, которые образуют пилообразные волны частотой 500 Гц или около того, и извергают их в виде выходного аудиопотока.
В этом простом примере не хватает нескольких вещей:
В этом нет ничего хорошего способ обнаружения блокировки.Если у вас тишина, шум или сильный чистый входной сигнал частотой 250 Гц, a будет примерно равен нулю, а b будет колебаться на частоте по умолчанию.В зависимости от вашего приложения вам может потребоваться узнать, нашли вы сигнал или нет!Предложение Камензинда в главе 12 Проектирование аналоговых микросхем заключается в подаче питания на второй "фазовый детектор" с отклонением по фазе на 90° от реального фазового детектора;его сглаженный выходной сигнал дает вам амплитуду сигнала, на который вы теоретически зафиксировались.
Собственная частота генератора фиксирована и не подметает.Тот самый диапазон захвата для ФАПЧ интервал частот, в пределах которого он заметит колебание, если в данный момент он не зафиксирован на одном из них, довольно узок;его диапазон блокировки, в пределах которого он будет находиться, чтобы следить за сигналом после его блокировки, намного больше.Из-за этого обычно развертывают частоту PLL по всему диапазону, в котором вы ожидаете найти сигнал, пока не получите блокировку, а затем прекращают развертку.
Приведенная выше версия для игры в гольф уменьшена с гораздо более читаемый пример программного цикла фазовой автоподстройки частоты на C то, что я написал сегодня, которое действительно обнаруживает блокировку, но не выполняет развертку.Для этого требуется около 100 циклов процессора на входную выборку для каждого PLL на процессоре Atom в моем нетбуке.
Я думаю, что если бы я был в вашей ситуации, я бы сделал следующее (помимо очевидных вещей, таких как поиск кого-то, кто знает об обработке сигналов больше, чем я, и генерация тестовых данных).Я, вероятно, не стал бы фильтровать и преобразовывать сигнал с понижением частоты во внешнем интерфейсе, поскольку он и так находится на такой низкой частоте.Понижение частоты до диапазона 200 Гц-400 Гц вряд ли представляется необходимым.Я подозреваю, что PSK вызовет некоторые новые проблемы, поскольку, если сигнал внезапно сдвигает фазу на 90 ° или более, вы теряете блокировку фазы;но я подозреваю, что эти проблемы будет легко решить, и вряд ли это нехоженая территория.
У вас есть Matlab с Simulink?Демонстрационные файлы PLL доступны в Matlab Central здесь.Возможности генерации кода Matlab могут привести вас оттуда к PLL, написанному на C.