Обнаружение Постоянного ложного сигнального уровня (CFAR)

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

Введение

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

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

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

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

T=αPn

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

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

Ячейка, составляющая в среднем обнаружение CFAR

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

Pn=1Nm=1Nxm

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

Следующий рисунок показывает отношение среди этих ячеек для 1D случая.

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

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

где Pfa желаемый ложный сигнальный уровень.

Обнаружение CFAR Используя автоматический пороговый фактор

В остальной части этого примера мы показываем, как использовать Phased Array System Toolbox, чтобы выполнить ячейку, составляющую в среднем обнаружение CFAR. Для простоты и не теряя общности, мы все еще принимаем, что шум белый Гауссов. Это включает сравнение между CFAR и классической теорией обнаружения.

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

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

В этом детекторе мы используем 20 учебных ячеек и 2 защитных ячейки всего. Это означает, что существует 10 учебных ячеек и 1 защитная ячейка на каждой стороне CUT. Как упомянуто выше, если мы принимаем, что сигнал от квадратичного детектора без импульсного интегрирования, порог может быть вычислен на основе количества учебных ячеек и желаемой вероятности ложного предупреждения. Принятие желаемого ложного сигнального уровня 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 для изображений Доплера области значений

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

На рисунке выше, размер защитной полосы [2 2], и учебный размер полосы [4 3]. Индексы размера относятся к количеству ячеек на каждой стороне сокращения строки и размерностей столбцов, соответственно. Размер защитной полосы может также быть задан как 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 кГц и от 1 000 до 4 000 м. Во-первых, задайте ячейки под тестом для этой области.

[~,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. В частности, мы исследовали, как использовать Phased Array System Toolbox, чтобы выполнить ячейку, составляющую в среднем обнаружение CFAR на сигналах и доплеровских областью значений изображениях. Сравнение между эффективностью, предлагаемой ячейкой, составляющей в среднем детектор CFAR и детектором, оборудованным теоретически расчетным порогом, показывает ясно, что детектор CFAR более подходит для действительных полевых приложений.

Ссылка

[1] Марк Ричардс, основные принципы радарной обработки сигналов, Макгроу Хилла, 2005