exponenta event banner

Обнаружение постоянной частоты ложных аварийных сигналов (CFAR)

В этом примере описывается обнаружение постоянной частоты ложных аварийных сигналов (CFAR) и показано, как использовать CFARDetector и CFARDetector2D в системе с фазированным массивом (Phased Array System Toolbox™) для определения среднего значения CFAR соты.

Введение

Одной из важных задач радиолокационной системы является обнаружение цели. Само обнаружение довольно простое. Он сравнивает сигнал с пороговым значением. Поэтому реальная работа по обнаружению приближается к соответствующему порогу. В общем, порог является функцией как вероятности обнаружения, так и вероятности ложной тревоги.

Во многих системах с фазированной решеткой из-за стоимости, связанной с ложным обнаружением, желательно иметь порог обнаружения, который не только максимизирует вероятность обнаружения, но также поддерживает вероятность ложного предупреждения ниже заданного уровня.

Существует обширная литература о том, как определить порог обнаружения. Читателям могут быть интересны примеры обнаружения сигнала в белом гауссовом шуме и обнаружения сигнала с использованием нескольких выборок для некоторых хорошо известных результатов. Однако все эти классические результаты основаны на теоретических вероятностях и ограничены белым гауссовым шумом с известной дисперсией (мощностью). В реальных применениях шум часто окрашен и его мощность неизвестна.

Технология CFAR решает эти проблемы. В CFAR, когда обнаружение необходимо для данной ячейки, часто называемой тестируемой ячейкой (CUT), мощность шума оценивается из соседних ячеек. Затем порог обнаружения, T, задается

T = αPn

где Pn - оценка мощности шума, а α - коэффициент масштабирования, называемый пороговым коэффициентом.

Из уравнения ясно, что порог адаптируется к данным. Можно показать, что при соответствующем пороговом коэффициенте α результирующая вероятность ложной тревоги может поддерживаться на постоянной, отсюда и название CFAR.

Обнаружение Cell Averaging CFAR

Детектор, усредняющий CFAR, вероятно, является наиболее широко используемым детектором CFAR. Он также используется в качестве базового сравнения для других методов CFAR. В детекторе, усредняющем CFAR, выборки шума извлекаются как из ведущих, так и из отстающих ячеек (называемых обучающими ячейками) вокруг CUT. Оценка шума может быть вычислена как [1]

Pn=1N∑m=1Nxm

где N - количество обучающих ячеек, а xm - образец в каждой обучающей ячейке. Если xm является выходом детектора квадратного закона, то Pn представляет оцененную мощность шума. В целом количество ведущих и отстающих тренировочных ячеек одинаково. Защитные ячейки размещаются рядом с CUT, как ведущие, так и отстающие. Назначение этих защитных ячеек состоит в том, чтобы избежать утечки сигнальных компонентов в тренировочную ячейку, что может отрицательно повлиять на оценку шума.

На следующем рисунке показана связь между этими ячейками для 1-D случая.

При использовании указанного детектора, усредняющего CFAR соты, при условии, что данные, передаваемые в детектор, исходят из одного импульса, т.е. при отсутствии интеграции импульсов, пороговый коэффициент может быть записан как [1].

α = N (Pfa-1/N-1)

где Pfa - желаемая частота ложных аварийных сигналов.

Обнаружение CFAR с использованием автоматического порогового коэффициента

В остальном примере показано, как использовать панель инструментов системы фазированного массива для определения среднего значения CFAR в ячейке. Для простоты и без потери какой-либо общности мы всё же предполагаем, что шум белый гауссов. Это позволяет сравнить CFAR и классическую теорию обнаружения.

Можно создать экземпляр детектора CFAR с помощью следующей команды

cfar = phased.CFARDetector('NumTrainingCells',20,'NumGuardCells',2);

В этом детекторе мы используем в общей сложности 20 тренировочных ячеек и 2 защитные ячейки. Это означает, что на каждой стороне CUT имеется 10 тренировочных ячеек и 1 защитная ячейка. Как упоминалось выше, если предположить, что сигнал поступает от детектора квадратного закона без интегрирования импульсов, порог может быть вычислен на основе количества обучающих ячеек и желаемой вероятности ложной тревоги. Предполагая, что требуемая частота ложных аварийных сигналов равна 0,001, можно сконфигурировать детектор CFAR следующим образом, чтобы можно было выполнить этот расчет.

exp_pfa = 1e-3;
cfar.ThresholdFactor = 'Auto';
cfar.ProbabilityFalseAlarm = exp_pfa;

Ниже показан сконфигурированный детектор CFAR.

cfar
cfar = 
  phased.CFARDetector with properties:

                   Method: 'CA'
            NumGuardCells: 2
         NumTrainingCells: 20
          ThresholdFactor: 'Auto'
    ProbabilityFalseAlarm: 1.0000e-03
             OutputFormat: 'CUT result'
      ThresholdOutputPort: false
     NoisePowerOutputPort: false

Теперь смоделируем входные данные. Поскольку фокус состоит в том, чтобы показать, что детектор CFAR может поддерживать частоту ложных аварийных сигналов при определенном значении, мы просто моделируем выборки шума в этих ячейках. Ниже приведены настройки:

  • Последовательность данных имеет длину 23 выборки, а CUT является ячейкой 12. Это оставляет 10 тренировочных ячеек и 1 защитную ячейку на каждой стороне CUT.

  • Коэффициент ложной тревоги рассчитывается с использованием 100 тысяч испытаний Монте-Карло

rs = RandStream('mt19937ar','Seed',2010);
npower = db2pow(-10);  % Assume 10dB SNR ratio

Ntrials = 1e5;
Ncells = 23;
CUTIdx = 12;

% Noise samples after a square law detector
rsamp = randn(rs,Ncells,Ntrials)+1i*randn(rs,Ncells,Ntrials);   
x = abs(sqrt(npower/2)*rsamp).^2;

Чтобы выполнить обнаружение, передайте данные через детектор. В этом примере существует только один CUT, поэтому выходной сигнал является логическим вектором, содержащим результат обнаружения для всех испытаний. Если результат верен, это означает, что цель присутствует в соответствующем испытании. В нашем примере все обнаружения являются ложными тревогами, потому что мы проходим только в шуме. Результирующая частота ложных аварийных сигналов может быть вычислена на основе количества ложных аварийных сигналов и количества испытаний.

x_detected = cfar(x,CUTIdx);
act_pfa = sum(x_detected)/Ntrials
act_pfa = 9.4000e-04

Результат показывает, что результирующая вероятность ложной тревоги ниже 0,001, как мы и указали.

Обнаружение CFAR с использованием пользовательского порогового коэффициента

Как поясняется в предыдущей части этого примера, существует лишь несколько случаев, в которых детектор CFAR может автоматически вычислять соответствующий пороговый коэффициент. Например, используя предыдущий сценарий, если мы используем некогерентную интеграцию из 10 импульсов до того, как данные поступят в детектор, автоматический порог больше не может обеспечить желаемую частоту ложных сигналов тревоги.

npower = db2pow(-10);  % Assume 10dB SNR ratio
xn = 0;
for m = 1:10
    rsamp = randn(rs,Ncells,Ntrials)+1i*randn(rs,Ncells,Ntrials);
    xn = xn + abs(sqrt(npower/2)*rsamp).^2;   % noncoherent integration
end
x_detected = cfar(xn,CUTIdx);
act_pfa = sum(x_detected)/Ntrials
act_pfa = 0

Можно озадачиться, почему мы думаем, что результирующая частота ложных тревог 0 хуже, чем частота ложных тревог 0,001. В конце концов, разве частота ложной тревоги 0 не велика? Ответ на этот вопрос заключается в том, что когда вероятность ложной тревоги уменьшается, так же как и вероятность обнаружения. В этом случае, поскольку истинная частота ложных аварийных сигналов намного ниже допустимого значения, порог обнаружения устанавливается слишком высоким. Такая же вероятность обнаружения может быть достигнута с нашей желаемой вероятностью ложной тревоги при меньших затратах; например, с меньшей мощностью передатчика.

В большинстве случаев пороговый коэффициент должен оцениваться на основе конкретной среды и конфигурации системы. Можно настроить детектор CFAR для использования пользовательского порогового коэффициента, как показано ниже.

release(cfar);
cfar.ThresholdFactor = 'Custom';

Продолжая пример интеграции импульсов и используя эмпирические данные, мы обнаружили, что мы можем использовать пользовательский пороговый коэффициент 2,35 для достижения желаемой частоты ложных аварийных сигналов. Используя этот порог, мы видим, что результирующая частота ложных аварийных сигналов соответствует ожидаемому значению.

cfar.CustomThresholdFactor = 2.35;
x_detected = cfar(xn,CUTIdx);
act_pfa = sum(x_detected)/Ntrials
act_pfa = 9.6000e-04

Порог обнаружения CFAR

Обнаружение CFAR происходит, когда уровень входного сигнала в ячейке превышает пороговый уровень. Пороговый уровень для каждой соты зависит от порогового коэффициента и мощности шума в той, которая получена из обучающих сот. Для поддержания постоянной частоты ложных аварийных сигналов порог обнаружения будет увеличиваться или уменьшаться пропорционально мощности шума в обучающих ячейках. Сконфигурируйте детектор CFAR для вывода порогового значения, используемого для каждого обнаружения, с помощью ThresholdOutputPort собственность. Используйте автоматический пороговый коэффициент и 200 обучающих ячеек.

release(cfar);
cfar.ThresholdOutputPort = true;
cfar.ThresholdFactor = 'Auto';
cfar.NumTrainingCells = 200;

Затем создайте входной сигнал квадратного закона с увеличением мощности шума.

rs = RandStream('mt19937ar','Seed',2010);
Npoints = 1e4;
rsamp = randn(rs,Npoints,1)+1i*randn(rs,Npoints,1);
ramp = linspace(1,10,Npoints)';
xRamp = abs(sqrt(npower*ramp./2).*rsamp).^2;

Вычисление обнаружений и пороговых значений для всех ячеек в сигнале.

[x_detected,th] = cfar(xRamp,1:length(xRamp));

Затем сравните пороговое значение CFAR с входным сигналом.

plot(1:length(xRamp),xRamp,1:length(xRamp),th,...
  find(x_detected),xRamp(x_detected),'o')
legend('Signal','Threshold','Detections','Location','Northwest')
xlabel('Time Index')
ylabel('Level')

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Signal, Threshold, Detections.

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

Сравнение между CFAR и классическим детектором Неймана-Пирсона

В этом разделе мы сравниваем производительность детектора CFAR с классической теорией обнаружения, используя принцип Неймана - Пирсона. Возвращаясь к первому примеру и предполагая, что истинная мощность шума известна, теоретический порог может быть вычислен как

T_ideal = npower*db2pow(npwgnthresh(exp_pfa));

Частота ложных аварийных сигналов этого классического детектора Неймана-Пирсона может быть вычислена с использованием этого теоретического порога.

act_Pfa_np = sum(x(CUTIdx,:)>T_ideal)/Ntrials
act_Pfa_np = 9.5000e-04

Поскольку мы знаем мощность шума, классическая теория обнаружения также производит желаемую частоту ложных сигналов тревоги. Частота ложных аварийных сигналов, полученная детектором CFAR, аналогична.

release(cfar);
cfar.ThresholdOutputPort = false;
cfar.NumTrainingCells = 20;
x_detected = cfar(x,CUTIdx);
act_pfa = sum(x_detected)/Ntrials
act_pfa = 9.4000e-04

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

npower = db2pow(-9);  % Assume 9dB SNR ratio
rsamp = randn(rs,Ncells,Ntrials)+1i*randn(rs,Ncells,Ntrials);
x = abs(sqrt(npower/2)*rsamp).^2;   
act_Pfa_np = sum(x(CUTIdx,:)>T_ideal)/Ntrials
act_Pfa_np = 0.0041

Напротив, это не влияет на работу детектора CFAR.

x_detected = cfar(x,CUTIdx);
act_pfa = sum(x_detected)/Ntrials
act_pfa = 0.0011

Следовательно, детектор CFAR устойчив к неопределенности мощности шума и лучше подходит для полевых применений.

Наконец, используйте обнаружение CFAR в присутствии цветного шума. Сначала применим классический порог обнаружения к данным.

npower = db2pow(-10);
fcoeff = maxflat(10,'sym',0.2);
x = abs(sqrt(npower/2)*filter(fcoeff,1,rsamp)).^2;   % colored noise
act_Pfa_np = sum(x(CUTIdx,:)>T_ideal)/Ntrials
act_Pfa_np = 0

Следует отметить, что результирующая частота ложных аварийных сигналов не соответствует требованиям. Однако с помощью детектора CFAR с пользовательским пороговым коэффициентом можно получить требуемую частоту ложных аварийных сигналов.

release(cfar);
cfar.ThresholdFactor = 'Custom';
cfar.CustomThresholdFactor = 12.85;
x_detected = cfar(x,CUTIdx);
act_pfa = sum(x_detected)/Ntrials
act_pfa = 0.0010

Обнаружение CFAR для изображений с доплеровским диапазоном

В предыдущих разделах оценка шума была вычислена из обучающих ячеек, ведущих и отстающих CUT в одном измерении. Мы также можем выполнить обнаружение CFAR на изображениях. Ячейки соответствуют пикселям на изображениях, а защитные ячейки и тренировочные ячейки размещены в полосах вокруг CUT. Порог обнаружения вычисляется из ячеек в прямоугольной тренировочной полосе вокруг CUT.

На приведенном выше рисунке размер защитной полосы составляет [2 2], а размер обучающей полосы - [4 3]. Индексы размера относятся к количеству ячеек на каждой стороне CUT в размерах строк и столбцов соответственно. Размер защитной полосы также может быть определен как 2, так как размер одинаков вдоль размеров строки и столбца.

Затем создайте двухмерный детектор CFAR. Используйте вероятность ложного аварийного сигнала 1e-5 и укажите размер защитной полосы, равный 5 ячейкам, и размер обучающей полосы, равный 10 ячейкам.

cfar2D = phased.CFARDetector2D('GuardBandSize',5,'TrainingBandSize',10,...
  'ProbabilityFalseAlarm',1e-5);

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

[resp,rngGrid,dopGrid] = helperRangeDoppler;

Figure contains an axes. The axes with title Range Doppler Map contains an object of type image.

Используйте CFAR для поиска объектов в пространстве диапазона-доплера и постройте карту обнаружений. Выполните поиск от -10 до 10 кГц и от 1000 до 4000 м. Сначала определите тестируемые ячейки для этой области.

[~,rangeIndx] = min(abs(rngGrid-[1000 4000]));
[~,dopplerIndx] = min(abs(dopGrid-[-1e4 1e4]));
[columnInds,rowInds] = meshgrid(dopplerIndx(1):dopplerIndx(2),...
  rangeIndx(1):rangeIndx(2));
CUTIdx = [rowInds(:) columnInds(:)]';

Вычислите результат обнаружения для каждой проверяемой ячейки. Каждый пиксель в области поиска является ячейкой в этом примере. Постройте карту результатов обнаружения для доплеровского изображения диапазона.

detections = cfar2D(resp,CUTIdx);
helperDetectionsMap(resp,rngGrid,dopGrid,rangeIndx,dopplerIndx,detections)

Figure contains an axes. The axes with title Range Doppler CFAR Detections contains an object of type image.

Обнаруживаются три объекта. Куб данных доплеровских изображений диапазона во времени может также подаваться в качестве входного сигнала для cfar2Dи обнаружения будут вычисляться за один шаг.

Резюме

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

Ссылка

[1] Марк Ричардс, Основы обработки радиолокационных сигналов, McGraw Hill, 2005