В настоящее время я использую акустическую модуляцию и демодуляцию FSK. Я не парень обработки сигналов ...
Поскольку вы говорите, что у вас есть подходящие фильтры, и вы упоминаете некогерентное обнаружение, я думаю, что вы уже в значительной степени являетесь специалистом по цифровым коммуникациям - шаг к тому, чтобы быть человеком DSP, довольно мал :)
Полноценный подход синхронизатора SDR
Таким образом, классический способ сделать это состоит в том, чтобы взять выходные данные двух ваших фильтров, (по амплитуде) возвести их в квадрат, отфильтровать нижние частоты до значения, превышающего и во время / после фильтрации decimate (если возможно), так что мы не тратим операций в секунду.2 фсимвол, не более
Я сделал себе быстрый полосовой сигнал реального времени с демодуляцией FSK (думаю, если бы я сделал это снова, я бы заменил два полосовых фильтра одним комбинированным преобразованием частоты и одним фильтром нижних частот, дав мне сложную базовую полосу, или бросил набор многофазных фильтров в проблеме, но неважно) в GNU Radio с помощью спутника GNU Radio (файл потокового графика здесь ):
Дело в том, что мы, вероятно, хотим синхронизировать символы между делением и пороговым блоком. Впоследствии мы могли бы сделать это - классический подход «проектирование микроконтроллеров и цифрового оборудования» на самом деле был бы поглотителем тактовых импульсов Мюллера и Мюллера, и это сработало бы там точно так же - но давайте не будем тратить впустую информацию об уклоне.
Итак, я бы добавил здесь многофазную синхронизацию часов; Я должен признать, что не мог сформулировать это лучше, чем Том, ученик Харриса, сделал в документации одноименного радиоблока GNU :
Синхронизатор времени с использованием многофазных фильтров.
Этот блок выполняет временную синхронизацию для сигналов PAM путем минимизации производной отфильтрованного сигнала, что, в свою очередь, максимизирует SNR и минимизирует ISI.
Этот подход работает путем установки двух наборов фильтров; один набор фильтров содержит согласованный фильтр формирования импульсов сигнала (такой как фильтр с косинусным корнем), где каждая ветвь набора фильтров содержит различную фазу фильтра. Второй банк фильтров содержит производные фильтров в первом банке фильтров. Думая об этом во временной области, первый набор фильтров содержит фильтры, которые имеют форму синуса к ним. Мы хотим выровнять выходной сигнал, который будет дискретизирован точно на пике формы синуса. Производная sinc содержит ноль в точке максимума ( sinc ( 0 ) = 1 ,синк ). Кроме того, область вокруг нулевой точки является относительно линейной. Мы используем этот факт для генерации сигнала ошибки.sinc ( 0 ) = 1 ,синк'( 0 ) = 0
Если сигнал из производных фильтров равен для i- го фильтра, а выходной сигнал согласованного фильтра равен x i [ n ] , мы вычисляем ошибку как:dя[ п ]яИкся[ п ]
e [ n ] = R { xя[ n ] } ⋅ R { dя[ n ] } + I { xя[ n ] } ⋅ I { dя[ n ] }2,0 ,
Икся[ п ]Икся[ п ]Икся[ п ]а не просто знак особенно хорош для сигналов с низким SNR.
е [ п ]dКdставкаdставкаdставкаdКdставкаdКdαdβdαdβусиление24
Понимая, что это аудио частота
Таким образом, правильно настроив этот блок (и, возможно, сократив его bpf_decim
и lpf_decim
предоставив синхронизатору больший запас для сдвига фаз), вы можете создать очень стабильное восстановление синхронизации символов, что будет полностью излишним для вашего приложения 😁
Поскольку вы выполняете семплирование с помощью звуковой карты на обоих концах, и, как я полагаю, вам не нужно иметь дело с доплеровским режимом, скорость передачи символов имеет фиксированное отношение к несущим частотам (например, передающая сторона имеет более высокую несущую с период из 8 сэмплов звуковой карты, и символ всегда берет, скажем, 128 сэмплов, так что есть фиксированное соотношение), вы можете сделать короткий путь:
dагсdT[ п ]
Относительно синхронизации пакетов
Что ж, поскольку у вас есть работающий демодулятор, который, вероятно, слишком долго не синхронизируется при отсутствии сигнала, просто используйте фиксированную известную последовательность данных, чтобы найти ваш пакет.