Сигналы со спутников
До того как заняться приёмом сигналов со спутников, я ничего не знал о радио сигналах. Тем более о радио сигналах со спутников. В моём представлении это было: навести антенну на спутник и выставить частоту приёма.
На самом деле частота сигнала меняется и на спектограмме выглядит как-то вот так:
Если схематично представить, то принимаемый сигнал будет выглядеть вот так:
С этим сигналом есть 2 проблемы (на самом деле больше):
- Эффект Доплера. Спутник движется очень быстро, поэтому частота будет смещаться. При этом смещение зависит от расстояния до спутника.
- Постоянная составляющая сигнала (DC spike). Появляется при конвертации входящей частоты в рабочую. Обычно присутствует в супергетеродинной архитектуре радиоприёмника.
Каждый из этих эффектов можно компенсировать:
- Зная положение спутника и станции приёма сигнала, можно очень точно рассчитать расстояние до спутника и смещение частоты в момент пролёта. Если сдвигать принимаемую частоту на это смещение, то можно выровнять сигнал и компенсировать эффект Доплера.
- С DC spike можно бороться двумя способами: добавить фильтр, который будет сдвигать сигнал так, чтобы средняя мощность была равна 0, либо принимать на другой частоте, а сигнал смещать и отфильтровывать от DC spike.
Я выбрал второй способ фильтрации постоянной составляющей, поэтому формула вычисления смещения для сигнала следующая:
long startFrequency = частота сигнала в начале приёма
long endFrequency = частота сигнала по окончанию приёма
long satelliteFrequency = настоящая частота передачи сигнала спутником
long maxOffset = Math.max(Math.abs(satelliteFrequency - startFrequency), Math.abs(satelliteFrequency - endFrequency));
long bandwidth = ширина сигнала спутника // обычно задаётся производителем
long offset = maxOffset + bandwidth / 2;
После того как смещение посчитано, нужно настроить приёмник на эту частоту + смещение. А при обработке сигнала, необходимо сместить сигнал назад на это же смещение. Это можно сделать, например, с помощью Frequency Xlating FIR Filter.