Необходимый пример программного кода с фазовой автоподстройкой

StackOverflow https://stackoverflow.com/questions/39485

  •  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 Гц или около того, и извергают их в виде выходного аудиопотока.

В этом простом примере не хватает нескольких вещей:

  1. В этом нет ничего хорошего способ обнаружения блокировки.Если у вас тишина, шум или сильный чистый входной сигнал частотой 250 Гц, a будет примерно равен нулю, а b будет колебаться на частоте по умолчанию.В зависимости от вашего приложения вам может потребоваться узнать, нашли вы сигнал или нет!Предложение Камензинда в главе 12 Проектирование аналоговых микросхем заключается в подаче питания на второй "фазовый детектор" с отклонением по фазе на 90° от реального фазового детектора;его сглаженный выходной сигнал дает вам амплитуду сигнала, на который вы теоретически зафиксировались.

  2. Собственная частота генератора фиксирована и не подметает.Тот самый диапазон захвата для ФАПЧ интервал частот, в пределах которого он заметит колебание, если в данный момент он не зафиксирован на одном из них, довольно узок;его диапазон блокировки, в пределах которого он будет находиться, чтобы следить за сигналом после его блокировки, намного больше.Из-за этого обычно развертывают частоту PLL по всему диапазону, в котором вы ожидаете найти сигнал, пока не получите блокировку, а затем прекращают развертку.

Приведенная выше версия для игры в гольф уменьшена с гораздо более читаемый пример программного цикла фазовой автоподстройки частоты на C то, что я написал сегодня, которое действительно обнаруживает блокировку, но не выполняет развертку.Для этого требуется около 100 циклов процессора на входную выборку для каждого PLL на процессоре Atom в моем нетбуке.

Я думаю, что если бы я был в вашей ситуации, я бы сделал следующее (помимо очевидных вещей, таких как поиск кого-то, кто знает об обработке сигналов больше, чем я, и генерация тестовых данных).Я, вероятно, не стал бы фильтровать и преобразовывать сигнал с понижением частоты во внешнем интерфейсе, поскольку он и так находится на такой низкой частоте.Понижение частоты до диапазона 200 Гц-400 Гц вряд ли представляется необходимым.Я подозреваю, что PSK вызовет некоторые новые проблемы, поскольку, если сигнал внезапно сдвигает фазу на 90 ° или более, вы теряете блокировку фазы;но я подозреваю, что эти проблемы будет легко решить, и вряд ли это нехоженая территория.

У вас есть Matlab с Simulink?Демонстрационные файлы PLL доступны в Matlab Central здесь.Возможности генерации кода Matlab могут привести вас оттуда к PLL, написанному на C.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top