Chirp Synchronization
Для более информативных графиков необходимо синхронизировать переданный и принятый сигналы. Так что сейчас поговорим о том, как синхронизировать передаваемые сигналы с полученными данными и как это улучшит получаемые графики дальности. Такая синхронизация очень важна для радиолокационных систем, поэтому это хорошая тема для изучения.

Мы говорили о частотно-модулированных сигналах. Если мы передаём их, а затем используем согласованный фильтр для сравнения передаваемого и принимаемого сигналов, мы получаем частоту биений. Частота биений прямо пропорциональна расстоянию. Так, мы можем измерять расстояние с помощью непрерывного сигнала. Непрерывный сигнал особенно важен для радаров ближнего действия, над которым мы сейчас работаем. Если помните, наша линейно-частотно-модулированная волна выглядит примерно так. Эта волна показана во временной области. Это немного утрированный вид волны в зависимости от времени. Но вы видите, что частота волны меняется со временем, а затем повторяется. Но проще всего представить это в виде графика зависимости частоты от времени. Вот я нарисовал это ниже. И теперь вы видите ту пилообразную форму, о которой мы говорили в прошлом видео. Она может быть треугольной или с задержками между сигналами. Но суть в том, что сигнал просто повторяется.


Хорошо, в чём проблема. Когда мы получаем данные с Pluto, что мы делаем. Мы просим Pluto записать определённое количество значений напряжения, которые он видит, и это записывается в буферы данных. Каждый буфер содержит тысячи точек данных и охватывает несколько миллисекунд времени. Таким образом, вы получаете буфер значений напряжений в зависимости от времени. Для нашей системы с stretch-обработкой это напряжение представляет собой разницу между передаваемым и принимаемым сигналами. Мы берём БПФ этого сигнала. Это график зависимости частоты от времени. А потом мы запрашиваем у Pluto ещё один буфер данных. Этот буфер будет той же длины, но, вероятно, его начальные и конечные точки будут отличаться от предыдущих. И мы снова строим график БПФ. И вроде бы всё нормально, но это не идеально. И причина в том, что кривая не совсем линейна. Давайте я покажу вам, как выглядят эти частотные скачки, увеличив масштаб.

Вот здесь синим цветом показан примерный набросок того, как выглядят наши реальные скачки частоты, а чёрная пунктирная линия — это наша идеальная кривая. Вы видите, что в начале каждого скачка есть разница. И надо сказать, что это во многом из-за того, что мы используем аналоговый генератор с обратной связью для управления частотой. Это stretch-обработка, о которой мы говорили ранее. Если бы мы создавали эту кривую в цифровом виде, то она выглядела бы намного лучше. Но у нас есть кривая, которая не всегда полностью линейна. То есть частота сначала повышается, а потом мы хотим, чтобы она вернулась к более низкой частоте. Но это занимает некоторое время. Так как это аналоговый процесс. Затем происходит небольшой скачок, и частота снова возвращается к нужному значению. А затем начиная с этого момента и до конца кривой она становится очень линейной. Но когда наш буфер приёма Pluto захватывает несколько скачков, он также получает долю нелинейной части. Это плохо, так как все наши уравнения основаны на предположении, что это будет чисто линейная кривая. А нелинейная часть по-другому относится с расстоянием. Так, в нашем графике FFT появляется лишний мусор. И этот мусор не имеет для нас никакого значения. Это не то расстояние, которое мы обозначили на графике. Поэтому, учитывая эту нелинейность, нам нужно, чтобы наш буфер Pluto захватывал только линейную часть кривой.

Вот такую. Если мы сможем это сделать, то сможем очистить наши графики. Как это сделать.

На плате ADF4159, есть специальный контакт TXDATA. Когда вы его активируете, плата ADF4159 выполнит заранее запрограммированную последовательность действий. И, конечно, последовательность, которую мы хотим выполнить — это передача сигнала с определённой частотой. Но теперь необходимо синхронизировать контакт TXDATA с чем-то внутри Pluto, чтобы он начал принимать сигнал. Если мы сможем это сделать, то получим один принятый буфер данных от Pluto и будем знать, что передача сигнала началась в самом начале этого буфера. Затем мы можем извлечь данные только для линейного участка сигнала. И можно снова активировать контакт TXDATA, чтобы получить следующий сигнал. Но есть ещё одна деталь, которая нам пока не нужна, но понадобится дальше. Нам нужно, чтобы таких сигналов было много. И мы должны точно знать, когда они появляются. Для этого мы можем постоянно активировать контакт TXDATA, но у Raspberry Pi есть операционная система реального времени, в которой происходит много всего. Поэтому время активации будет не очень точным. Оно может отличаться на несколько миллисекунд, а весь сигнал занимает несколько сотен микросекунд. Нам нужно более точное время. Поэтому мы синхронизируем время начала сигнала с помощью Pluto, а не Raspberry Pi.

Итак, мы начинаем с сигнала прерывания от Raspberry Pi, и время срабатывания этого контакта не имеет значения. Он нужен только запуска всей последовательности. Этот сигнал прерывания поступает на Pluto и Pluto будет управлять временем импульса на контакте передачи данных. Затем мы просто сделаем буфер Pluto достаточно большим, чтобы он мог записывать столько сигналов, сколько нам нужно. Сейчас это всего один сигнал. Но скоро их будет 64 или 128. Время на Pluto достаточно точное, поэтому он будет выдавать импульсы на передачу с заданным нами интервалом, и мы будем знать точное время начала каждого импульса. Затем мы просто извлекаем линейную часть этих импульсов из буфера данных. И, конечно, мы можем повторить всю эту последовательность, снова подав сигнал прерывания на Raspberry Pi.

Итак, где находятся эти контакты на Pluto. Сигнал прерывания поступает с разъёма Rasbperry Pi и подключается к ножке L12N на схеме Pluto. Затем сигнал передачи данных поступает с Pluto на контакт передачи данных ADF4159. Он подключается к контакту L10P на схеме Pluto. Всё программное обеспечение на странице Github. Python скрипт, который здесь используется, называется FMCW_RADAR_Waterfall_ChirpSync. Теперь, когда мы синхронизируем сигналы, очень важно, чтобы использовалась последняя версия (REV > 0.17) PYADI-IIO и Pluto Firmware (REV > 0.37).
По сравнению с предыдущей версией внесено всего три изменения. Первое изменение касается ADF4159. Нам нужно настроить его так, чтобы он ожидал импульс на выводе данных TX и запускал нарастание сигнала при получении импульса. Для этого мы устанавливаем значение tx_trig_en равным единице. Раньше оно было равно нулю, а теперь единица. До этого режим нарастания сигнала был непрерывным пилообразным или треугольным, а теперь мы установим его на одиночный пилообразный импульс. Каждый раз, когда на выходе данных TX появится сигнал, будет генерироваться один пилообразный импульс. Но остальные параметры останутся такими же, как в предыдущей программе.
Далее и это самое важное нам нужно создать контроллер TDD. Контроллер TDD — это программа внутри Pluto, которая будет управлять всеми временными параметрами. Все временные параметры, о которых мы говорили, настраиваются здесь. Сначала мы создаём объект tdd. А затем этот объект настраивается. Пока настраиваются атрибуты объекта, нужно установить для параметра enable значение false. После того как настройка закончится, должно быть установлено значение true. Будет использоваться внешнее управление, поэтому установим значение sync_external = true. Насколько далеко друг от друга расположены данные, передаваемые в каждом кадре, определяется параметром frame_length_ms. Здесь просто указывается время нарастания сигнала плюс небольшой буфер, но передаётся только один сигнал. Позднее, когда будет строиться график дальности доплеровского смещения, это будет 64 или 128, но сейчас передаётся только один сигнал. Затем настраивается синхронизация нулевого, первого и второго каналов. Нулевой канал управляет синхронизацией передачи данных. Первый канал управляет синхронизацией начала передачи данных в буфер Pluto. Второй канал предназначен для передачи данных в буфер Pluto. Буфер передачи данных не используется. Сигнал передаётся, но не синхронизируется передача и приём данных. Поэтому не нужно ничего менять. Синхронизация второго канала просто отключена. Наконец, для tdd.enable устанавливается значение true. И это фиксирует все значения.
Теперь каждый раз, когда нам нужно получить данные с Pluto, мы будем переключать вывод данных с Raspberry Pi. Будем переключать его с высокого на низкий уровень. Затем мы считываем данные с Pluto и обрабатываем их, как обычно, кроме того, что для каждого сигнала мы будем удалять всё, что не входит в линейный диапазон этого сигнала. В итоге у нас остаётся только линейная часть каждого сигнала. Эту линейную часть мы обрабатываем, как обычно. Мы получаем БПФ и применяем его.
Вот как теперь выглядит новый график. Это снова БПФ для одного сигнала, и это только линейная часть. Видно, что он выглядит совсем не так, как в прошлый раз. Здесь гораздо меньше всплесков, и сигнал выглядит более ровным. Потому что мы обрабатываем один сигнал, а не накладываем друг на друга несколько. Мы можем изменить уровни графика, чтобы выделить нужный нам пик. Выглядит очень красиво. И, как и раньше, мы можем изменить полосу пропускания, и будет видно, как это повлияет на график. Здесь полоса уменьшена до 250 МГц и видно, что частота теперь вдвое меньше, чем была при 500 МГц.

Если кто-то хочет разобраться в настройках, вот как выглядят параметры синхронизации. Ещё одна интересная функция — управление буфером передачи. Можно синхронизировать передачу с буфером приёма. Это может быть полезно, если создаются цифровые сигналы или какие-то кодированные радиолокационные сигналы. Но здесь этого нет, и поэтому второй канал отключён. Данные всё ещё передаются, но буфер передачи не синхронизирован с буфером приёма. Опять же для этого случая это нормально. Эта диаграмма — это понимание автора того, что делает прошивка Pluto, но настоящий источник этого всего — это код и пояснения, которые можно найти по ссылке.
CFAR Targeting
Серия о том, как создать радар для отслеживания дронов продолжается. Мы уже рассмотрели модулированные по частоте сигналы и увидели, как можно определить расстояние. Но на графиках было много помех. И из-за них сложно было выделить реальные цели. Поэтому нужно понять, что считать помехами, а что реальными целями.

Но проблема в том, что эти сигналы могут сильно различаться в зависимости от условий, расстояний и движения. Поэтому мы не можем просто установить постоянный порог амплитуды для обнаружения целей. Для этого используется вероятность ложных тревог CFAR (Constant False Alarm Rate), которая позволяет отличить цели от помех. Она устанавливает порог уровня сигнала, который рассчитывается на основе ближайших бинов.

Метод CFAR очень популярен и широко используется сегодня. На самом деле существует несколько алгоритмов CFAR, сосредоточимся на одном из них, который называется усреднением по ячейкам. Усреднение по ячейкам — это как вычисление среднего значения по всем бинам. Основные шаги этого алгоритма — это получение данных и обработка БПФ, выбор одного из бинов БПФ в качестве интересующей ячейки. Затем выбор нескольких ячеек в качестве защитных. Затем усреднение нескольких ячеек. Они называются эталонными. Умножение среднего значения на некоторый коэффициент и получение порога. А потом сравнение этого порога с интересующей ячейкой. И если интересующая ячейка выше порога, то, вероятно, в этом бине есть цель.
Взглянем на это в трёх шагах.

Первый шаг. Посмотреть на диапазон и вычислить среднее значение в нём.

Второй шаг. Сдвинуть это среднее значение на некоторое количество единиц. Это наш пороговый уровень, и вы можете видеть его как красную линию.

Третий шаг. Удалить всё, что ниже этого порога. Таким образом, у нас остаётся меньше сигналов, о которых нужно думать и обрабатывать, чем было вначале.
def cfar(X_k, num_guard_cells, num_ref_cells, bias): N = X_k.size cfar_values = np.ma.masked_all(X_k.shape) for center_index in range(num_guard_cells + num_ref_cells, N - (num_guard_cells + num_ref_cells)): min_index = center_index - (num_guard_cells + num_ref_cells) min_guard = center_index - num_guard_cells max_index = center_index + (num_guard_cells + num_ref_cells) + 1 max_guard = center_index + num_guard_cells + 1 lower_nearby = X_k[min_index:min_guard] upper_nearby = X_k[max_guard:max_index] mean = np.mean(np.concatenate((lower_nearby, upper_nearby))) output = mean + bias cfar_values[center_index] = output lower_mean = np.mean(lower_nearby) upper_mean = np.mean(upper_nearby) cfar_values[np.where(cfar_values == np.ma.masked)] = np.min(cfar_values) targets_only = np.ma.masked_array(np.copy(X_k)) targets_only[np.where(abs(X_k) > abs(cfar_values))] = np.ma.masked return cfar_values, targets_only
Мы можем изменить нашу программу с прошлой недели, чтобы сделать всё это. Вот функция python, которую нужно добавить. По сути, она вычисляет среднее значение в определённом диапазоне. А затем мы маскируем все значения, которые ниже этого порога. Давайте посмотрим, как это работает.
Вот график, и теперь используется синхронизация по нарастающему фронту, о которой мы говорили раньше. Этот график должен выглядеть примерно так же, как раньше. На этот раз уровни графиков останутся на максимуме. В прошлый раз использовались уровни графика, чтобы замаскировать всё кроме самого высокого пика. Это больше костыль, поэтому мы больше так делать не будем. Вместо этого мы применим алгоритм подавления шума и посмотрим, можно ли использовать только его для выделения движущейся цели. Порог можно увидеть как красную линию. Сейчас он просто примерно дублирует график жёлтого БПФ. Это потому, что все значения установлены на минимальных уровнях. Но если увеличить уровень смещения, можно увидеть, как красная линия порога сдвигается относительно графика БПФ. Затем можно изменить количество защитных ячеек. Это определяет, сколько ячеек БПФ необходимо пропустить, прежде чем применить порог. Таким образом, можно задать размер цели, которую необходимо обнаружить. Маленькая цель займёт всего несколько ячеек, а большая, например, самолёт или здание может занять несколько десятков ячеек. Для таких целей автор бы увеличил количество защитных ячеек. И наконец, количество эталонных ячеек. Это количество ячеек за пределами защитных ячеек, которые будут усреднены для определения порога. Если сделать это значение очень-очень большим, то получится линия, которая будет следовать за средним уровнем сигнала в зависимости от расстояния. Но необходимо найти оптимальную комбинацию этих трёх переменных, чтобы только цель превышала этот порог. А затем, установив эти значения, можно применить их здесь. Теперь программа удаляет все ячейки, амплитуда которых ниже этого порога. И видно, что график стал намного чище. Конечно, можно ещё немного изменить эти значения, если нужно.
Автор надеется, что это было понятно и интересно. Теперь можно собрать это в полноценный радар. Дальше этот радар будет установлен на улице и будет использоваться для отслеживания расстояния и скорости маленького дрона. Далее автор расскажет о двумерных преобразованиях Фурье и построении графиков дальности и доплеровского смещения.
Range Doppler Processing
Рассмотрим несколько частотно-модулированных импульсов, построение графиков дальности и объединим всё это в настоящий радар, чтобы использовать его для отслеживания велосипеда, автомобиля и даже небольшого дрона.

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

Возьмём эти импульсы и разместим их в столбцы. Берём полученный импульс, который пропущен через согласованный фильтр и разделяем его, располагая в виде столбца. Делаем это со всеми импульсами, например, если есть 6 импульсов, это даст 6 столбцов данных.

Объединим эти столбцы. Если есть 6 импульсов, то это даёт нам матрицу данных размером N строк на M столбцов. Где N количество точек данных на импульс, а M количество импульсов. Таким образом, матрица идёт от нуля до N-1, а затем от 0 до M-1. Итак, для этого случая M это 6, а N, как показано здесь 9. И если подумать, есть время по оси Y, но и по оси X тоже время. Чтобы не запутаться, можно обозначить время по оси Y как быстрое время, а время по оси X как медленное время. Оно называется медленным, потому что если посмотреть на каждый столбец, то видно, что все точки данных разделены интервалом между импульсами, который составляет миллисекунды. А по оси Y, где быстрое время, все точки данных разделены частотой дискретизации преобразователя данных. Это микросекунды или меньше. Поэтому это называется быстрым и медленным временем. Это важно усвоить. Это основа для обработки данных радара. Теперь есть матрица данных с частотной модуляцией. И раньше мы видели, что если сделать БПФ для одного столбца данных, то получится дальность. Это всё ещё верно.

Можем сделать БПФ для любого столбца и получить дальность. Ничего не изменилось. Теперь, если сделать это для всех столбцов, получится дальность по оси Y и медленное время по оси X. Опять же ничего нового. Просто данные упорядочены так, чтобы показать частоту биений, которая соответствует дальности каждого импульса. Но объединив их таким образом, получилась матрица силы сигнала в диапазоне с регулярными интервалами времени. И эти регулярные промежутки времени, конечно же, соответствуют частоте повторений импульсов. Так что если посмотреть на каждый ряд, то видно, как эта дальность меняется со временем. А изменение дальности со временем — это скорость.

Чтобы получить скорость, сделаем ещё одно быстрое преобразование Фурье, но на этот раз по столбцам. В радиолокации это называется скоростью или доплеровским сдвигом.

Можно сделать оба этих преобразования Фурье одним махом, используя функцию, которая называется двумерное преобразование Фурье. Эта функция есть в Python или Matlab или где угодно, и она очень легко выполняет преобразование. Так что для этих данных радара применение двумерного преобразования Фурье к матрице с быстрым и медленным временем даст новую матрицу с дальностью по оси Y и скоростью или доплеровским сдвигом по оси X.
def get_radar_data(frame): global range_doppler # Collect data my_phaser.gpios.gpio_burst = 0 my_phaser.gpios.gpio_burst = 1 my_phaser.gpios.gpio_burst = 0 data = my_sdr.rx() chan1 = data[0] chan2 = data[1] sum_data = chan1+chan2 # Process data # Make a 2D array of the chirps for each burst rx_bursts = np.zeros((num_bursts, good_ramp_samples), dtype=complex) for burst in range(num_bursts): start_index = start_offset_samples + burst * N_frame stop_index = start_index + good_ramp_samples rx_bursts[burst] = sum_data[start_index:stop_index] rx_bursts_fft = np.fft.fftshift(abs(np.fft.fft2(rx_bursts))) range_doppler.set_data(np.log10(rx_bursts_fft).T) return [range_doppler]
Программа для построения графика дальности и скорости очень проста. Просто разделяем импульсы по столбцам, а затем применяем двумерное преобразование Фурье. Время, необходимое для разделения импульсов, уже было рассмотрено ранее. Время очень важно, потому что оно используется для расчёта скорости. Каждый импульс на Raspberry Pi запускает последовательность синхронизированных по фазе импульсов ЛЧМ, и это даёт большой буфер данных, в котором будут все импульсы. Затем этот буфер просто разбивается на отдельные импульсы, и к нему применяется двумерное преобразование Фурье. Давайте попробуем сделать это сейчас.
Вот как выглядят графики дальности и скорости. Машина с большой площадью отражения для радара и велосипед с чуть меньшей площадью. Каждый кадр или обновление этого графика использует 128 импульсов. По оси Y отображается расстояние, которое меняется от 0 до 40 метров, и, конечно, 0 метров соответствует радару, установленному на столе. Скорость рассчитывается по результатам быстрого преобразования Фурье для нескольких импульсов. Скорость отображается по оси X в метрах в секунду. Видно, что правая часть, графика показывает положительную скорость. Это объекты, которые удаляются от радара. А левая часть, графика показывает отрицательную скорость, то есть объекты, которые приближаются к радару. Прямо посередине графика проходит большая линия, которая соответствует нулевой скорости. Неподвижные объекты на графике отображаются со скоростью 0 метров в секунду. Все неподвижные объекты необходимо назвать помехами. Можно попытаться отфильтровать их или поставить фильтр на 0 метров в секунду, чтобы удалить их с графика. Когда будет показан график с целью-дроном, будет настроен фильтр, чтобы можно было увидеть, как это выглядит. Но для этого графика все помехи оставлены, чтобы можно было видеть, как выглядит необработанное двухмерное доплеровское изображение. Также можно заметить, что на нулевом расстоянии от радара есть яркая точка. Это не помехи, а сигнал, который попадает прямо в антенну приёмника. Это можно исправить, изолировав передающую и приёмную антенны. Но в радарах непрерывного излучения всегда есть небольшая утечка сигнала от передатчика к приёмнику. И это потому, что в системе непрерывного излучения и передатчик и приёмник работают одновременно. И, конечно, мощность передатчика намного выше мощности, которая принимается на приёмнике. Поэтому очень часто можно увидеть яркую точку на нулевой скорости и нулевом расстоянии. Это интересный пример того, как выглядит доплеровский график.
Это беспилотник, за которым мы будем следить. Это очень маленький беспилотник. Это dji mini 3 pro, он весит 249 грамм и полностью сделан из пластика. И, конечно, на видео радар, который будет использоваться. К нему прикреплена рупорная антенна PASTERNACK X диапазона. Автор пробовал несколько разных антенн, например, Vivaldi, которая идёт в комплекте с радаром, а также несколько патч антенн и все они выглядели более или менее одинаково, по крайней мере, для задач автора, но, конечно, эта рупорная антенна лучше всего подходит для одноканальной передачи.
Но прежде чем этот радар будет использован, посмотрим, как выглядит форма сигнала и выходная мощность передатчика. Это полевой анализатор спектра от Keysight. Анализатор спектра показывает мощность радиочастотного сигнала в зависимости от частоты. То есть, по сути, то же самое, когда мы получали БПФ только гораздо лучше, чем то, что можно сделать с Pluto. И этот анализатор спектра может отображать мощность в диапазоне частот от постоянного тока до 26 Гигагерц. Это гораздо больший диапазон частот, чем у Phaser и Pluto. Этот диапазон частот позволяет видеть полную картину мощности передачи, а также частоты передачи любых других помех, которые мы создаём. Видно, что на этом графике есть только один всплеск на частоте 10.3 ГГц. Это хорошо. Необходимая частота передачи 10.3 ГГц. Нет никаких других пиков, которые превышают уровень шума в минус 60 дБ/мВт. Именно то, что нужно. Также видно, что мощность передачи составляет всего около -3 дБм, это примерно половина милливатта. Это очень низкая выходная мощность для радара. Обычный радар для отслеживания дрона может иметь мощность передачи от 10 до 50 Вт. Это в десятки тысяч раз больше. Можем легко увеличить мощность передатчика Phaser, добавив усилитель. Но на самом деле цель этого материала — показать, как это сделать или хотя бы объяснить, как это работает и с чего начать.
Вот, например, дрон летает во дворе у автора. Общая площадь двора около 20 метров. Когда дрон движется туда-сюда, он выглядит как яркое пятно. Также можно увидеть его лопасти. Это называется микродоплеровский эффект. Это происходит из-за вращения лопастей. Даже когда дрон неподвижен, его легко отличить от помех на земле по вращающимся лопастям. Микродоплеровский эффект — это важная информация, которую используют для распознавания и классификации дронов. Микродоплеровский эффект также был виден на видео с автомобилем и велосипедом, когда вращались колёса. Но он не такой яркий и заметный, как у пропеллеров дрона.
Увеличение дальности действия и обработка MTI
В заключительной части поговорим о трёх вещах. Во-первых, используем обработку Moving target indication (MTI) для устранения помех, и это действительно поможет выделить дрон. Во-вторых, увеличим дальность действия, цель увидеть маленький дрон на расстоянии около 100 м. Поэтому попробуем новую антенну и новый усилитель передачи сигнала. И наконец, самое интересное, автор даст возможность попробовать обработать сигнал радара у себя дома. Даже если у вас нет Pluto, Phaser, или другого оборудования для радара, вы сможете поэкспериментировать с данными от дронов, которые здесь используются. Итак, давайте начнём с обработки MTI.
MTI обработка
Вот тот же дрон и данные с предыдущего видео с графиком доплеровской дальности. Виден дрон, а также помехи на земле. Но теперь если применить фильтр MTI, то большая часть помех на земле исчезнет, а движущиеся объекты не будут искажены. Так что дрон виден гораздо лучше. И, конечно, возникает вопрос как это работает, как это применяется. Давайте разберёмся, что такое MTI.

MTI расшифровывается, как индикатор движущейся цели и цель обработки MTI — улучшить обнаружение движущихся целей, устраняя всё, что не движется. MTI обработка также известна как импульсная доплеровская радиолокация, потому что она использует доплеровский сдвиг частоты движущихся целей для их распознавания. Некоторые также называют это когерентным Детектором. Это можно найти это в книге Грегори Л. Чарватера Радары малого и среднего радиуса действия. Two Pulse Canceller также является распространённым способом обозначения MTI обработки.

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

Затем эти импульсы упорядочили в столбцы. Фильтр MTI — это очень простое изменение. Полученный импульс просто вычитается из предыдущего импульса. Если цель неподвижна, то сигналы будут почти идентичными и разница будет близка к нулю. Таким образом, эти цели будут в значительной степени компенсированы. А когда цель движется, сигналы будут отличаться из-за эффекта Доплера, и они не будут компенсированы.

Вот как это выглядит. Вычитаем два последовательных импульса. Таким образом, вычитая первые два импульса получаем новый импульс, который автор называет вторым импульсом. Затем переходим к следующему импульсу и вычитаем его и так продолжаем делать это для всех импульсов в интервале когерентной обработки. Теперь должно стать понятно почему это двухпульсовый компенсатор. И не обязательно останавливаться на двух импульсах.

Мы можем провести ещё один раунд компенсации импульсов и получить трёхимпульсный компенсатор. Здесь можно было бы рассказать гораздо больше, но вместо этого автор направляет на онлайн-курс по радарам в лабораторию Линкольна.

Это бесплатный онлайн-курс с видео и презентациями доктора Роберта О’Доннэла из Массачусетского Технологического института в лаборатории Линкольна. Доктор О’Доннэл скончался в 2015 году, но за несколько лет до этого он записал серию видео, чтобы помочь другим в этой области. И они до сих пор великолепны. В частности, посмотрите 8 лекцию под названием обработка сигналов и методы импульсного Допплера. Он отлично справился с объяснением основ, и нет смысла пытаться повторить то, что он сделал так хорошо. Посмотрите эти лекции, если хотите больше узнать о фильтрации MTI, а также о некоторых её особенностях, например, о слепых зонах.
def pulse_canceller(radar_data): global num_chirps, num_samples rx_chirps = [] rx_chirps = radar_data # create 2 pulse canceller MTI array Chirp2P = np.empty([num_chirps, num_samples])*1j for chirp in range(num_chirps-1): chirpI = rx_chirps[chirp,:] chirpI1 = rx_chirps[chirp+1,:] chirp_correlation = np.correlate(chirpI, chirpI1, 'valid') angle_diff = np.angle(chirp_correlation, deg=False) # returns radians Chirp2P[chirp,:] = (chirpI1 - chirpI * np.exp(-1j*angle_diff[0])) # create 3 pulse canceller MTI array Chirp3P = np.empty([num_chirps, num_samples])*1j for chirp in range(num_chirps-2): chirpI = Chirp2P[chirp,:] chirpI1 = Chirp2P[chirp+1,:] Chirp3P[chirp,:] = chirpI1 - chirpI return Chirp2P, Chirp3P
Итак, как это реализовать на Python. Опять же этот пример кода можно найти на странице в github. Здесь особо нечего рассказывать. Просто вычитаем два сигнала и создаём новый массив из этих вычитаемых сигналов. Единственное, что добавил автор это то, что он заметил, что вычитание работает лучше, если сначала выравнять фазы двух сигналов. Поэтому выполняется быстрая корреляция, чтобы получить фазовое смещение, а затем сдвигается один из сигналов на это смещение. Автор нигде не встречал такого подхода, так что он не уверен, что это правильно. Но показалось, что это работает и результаты стали лучше.
Вот как это выглядит. На верхнем графике нет фильтрации MTI. В середине работает двухимпульсный компенсатор. Видно, что утечка сигнала и помеха от земли значительно уменьшились, но дрон сохраняет полную амплитуду сигнала. А на нижнем графике работает трёхимпульсный компенсатор, и здесь помехи полностью устранены. Однако недостатком MTI является то, что дрон не виден, когда неподвижен. Но виден микродоплеровский эффект от лопастей пропеллера. Так что в случае квадрокоптера можно использовать его. Надо иметь в виду, что лопасти пропеллера отражают сигнал гораздо слабее, чем корпус дрона. А теперь давайте увеличим дальность действия Phaser радара.
Increase Radar Range
Когда начинался этот проект, предполагалось увидеть крошечный беспилотник на расстоянии хотя бы 100 метров. Профессиональный радар повышенной мощности мог бы увидеть нечто подобное на расстоянии пары километров. Но для простой установки хотелось бы иметь возможность работать хотя бы на 100 метрах. Чтобы проверить это, была использована другая передающая антенна.
Антенна, которая использовалась в прошлый раз, была рупорная антенна pasternack.com PE9856/SF-10. Это фантастическая антенна и можно ознакомиться с её характеристиками в интернете, но она стоит около 1 тыс. долларов.
Автор надеялся найти что-то более доступное для всех и ему указали на антенну X диапазона (Antenne cornet SHF 10 GHz / Horn antenna HAM 3 cm X band / High gain), которая обычно используется для связи со спутниками любительской радиосвязи. Автор купил эту антенну примерно за 100 долларов. И с каждой антенной этот продавец также измеряет параметры и распечатывает график. Это очень ценно знать. Поскольку автор использовал её в своей установке, то он сравнивает её по эффективности с pasternack.com PE9856/SF-10.
Установка работает в парке на дистанции примерно 110 метров и вот как выглядят доплеровские графики дальности с новой антенной.
А затем, если применить двухимпульсный компенсатор, вот как это будет выглядеть. В целом всё выглядит довольно прилично. Дрон можно увидеть с расстояния примерно 100 метров.
Но автор хотел посмотреть, можно ли увеличить дальность, усилив сигнал. Поэтому использовал усилитель. Это хороший усилитель, который даёт около 22 дБ усиления. Теперь мощность передачи составляет около 100 мВт.
Видно, что сигнал стал немного лучше. Но когда цель находится близко к радару, сигнал сильно искажается. Это из-за фиксированного усиления на приёмнике. Возможно, необходимо сделать что-то более умное, чтобы избежать этого, но пока что и так неплохо. В целом автор доволен результатом. Этот маленький пластиковый дрон получается увидеть с расстояния примерно 100 метров и усилитель и обработка сигнала, конечно, очень помогают.
Radar Processing without Hardware
В качестве бонуса автор сохранил все данные. То есть все необработанные данные IQ, полученные с помощью Phaser, сохранены. Это значит, что, даже если у вас нет Phaser, Pluto, или другого радиолокационного оборудования, вы всё равно можете попробовать некоторые алгоритмы обработки радара.