# phased_CFARDetector2D
二维 CFAR 检测器
函数库: TyPhasedArray
# 描述
phased_CFARDetector2D 系统对象™ 为二维图像数据中的选定元素(称为单元)实现恒虚警率检测器(CFAR)。当图像单元的值超过阈值时,即宣布检测成功。为了保持恒定的虚警率,阈值被设置为图像噪声功率的倍数。检测器使用三种单元平均法之一或有序统计量法,从周围的单元中估算出被检单元(CUT)的噪声功率。单元平均法包括单元平均法(CA)、最大单元平均法(GOCA)或最小单元平均法(SOCA)。
对于每个测试单元,检测器:
从围绕 CUT 单元的参考区域中的单元值估算噪声统计量;
将噪声估计值乘以阈值因子,计算出阈值;
将 CUT 单元值与阈值进行比较,以确定目标是否存在。如果值大于阈值,则说明存在目标。
运行检测器:
定义并设置 2-D CFAR 检测器。您可以在创建对象时设置 phased_CFARDetector2D 系统对象的属性,也可以将其设置为默认值;
调用 step 方法查找检测结果。此方法的输出取决于 phased_CFARDetector2D 系统对象的属性。
# 构造
# 语法
H = phased_CFARDetector2D()
H = phased_CFARDetector2D(; Name = Value)
# 说明
detector = phased_CFARDetector2D() 创建一个 2-D CFAR 检测器系统对象,即检测器。
detector = phased_CFARDetector2D(; Name=Value) 创建一个 2-D CFAR 系统对象 detector,其中每个指定的属性 Name 都设置为指定的 Value。您还可以按照 (Name1=Value1,...,NameN=ValueN) 的任意顺序指定其他名称-值对参数。
# 属性
Method - 二维 CFAR 平均法"CA" (默认) | "GOCA" | "SOCA" | "OS"
二维 CFAR 平均法,指定为 "CA"、"GOCA"、"SOCA "或 "OS"。对于 "CA"、"GOCA"、"SOCA",噪声功率是由参考区域得出的样本平均值。对于 "OS",噪声功率是对所有参考单元值进行数字排序后得到的第 k 个单元值。使用 Rank 属性设置 k。
| 平均算法 | 说明 |
|---|---|
| CA - 单元平均算法 | 计算 CUT 单元周围所有参考单元的样本平均值。 |
| GOCA - 最大单元平均算法 | 将围绕 CUT 单元的二维参考窗分成左右两半。然后,算法计算每一半的样本平均值,并选择最大的平均值。 |
| SOCA - 最小单元平均算法 | 将围绕 CUT 单元的二维参考窗分成左右两半。然后,算法计算每一半的样本平均值,并选择最小的平均值。 |
| OS - 有序统计量法 | 按数值升序排列参考单元数值。然后,算法会从列表中选择第 k 个数值。 |
示例: "OS"
GuardBandSize - 保护区域宽度[1 1] (默认值) | 非负整数 | 非负整数的 2 元素向量
CUT 单元两侧保护区域单元的行数和列数,指定为非负整数。第一个元素指定沿行维度的保护区域大小。第二个元素指定沿列维度的保护区域尺寸。将此属性指定为单个整数,相当于为两个维度指定了一个具有相同值的保护区域。例如,值为 [1 1] 表示每个 CUT 单元周围有一个保护单元宽的区域。值为 0 表示没有保护单元。
示例: [2 3]
TrainingBandSize - 参考区域宽度[1 1](默认) | 正整数 | 2 元素正整数向量
CUT 单元两侧参考区域单元的行数和列数,以正整数或 1×2 的正整数矩阵形式指定。第一个元素指定沿行维度的参考区域大小。第二个元素指定沿列维度的参考区域大小。将此属性指定为标量相当于在两个维度上都指定了相同值的参考区域。例如,[1 1] 的值表示 CUT 单元周围 1 个参考单元宽的区域。
Rank - 有序统计量的序号1(默认) | 正整数
二维 CFAR 算法中使用的阶次统计量的阶次,指定为正整数。该属性的值必须介于 1 和 Ntrain 之间,其中 Ntrain 是参考单元的数量。如果值为 1,则选择参考区域中最小的值。
示例: 5
依赖关系
要启用此属性,请将 Method 属性设置为 "OS"。
ThresholdFactor - 阈值因子计算方法"Auto"(默认) | "Input port" | "Custom"
阈值因子计算方法,指定为 "Auto"、"Input port" 或 "Custom"。
将 ThresholdFactor 属性设置为 "Auto" 时,阈值因子将根据 ProbabilityFalseAlarm 属性中设置的所需虚警概率计算得出。计算假定输入中的每个独立信号都是从方波检测器中发出的单脉冲,没有脉冲积累。此外,还假设噪声为高斯白噪声;
将 ThresholdFactor 属性设置为 "Input port" 时,阈值因子将从 step 方法的输入参数中获取;
将 ThresholdFactor 属性设置为 "Custom" 时,阈值因子将从 CustomThresholdFactor 属性的值中获取。
示例: "Custom"
ProbabilityFalseAlarm - 所需的虚警概率0.1(默认) | 0 和 1 之间的正标量
所需的虚警概率,指定为介于 0 和 1 之间的实数正标量。算法根据所需的虚警概率计算阈值因子。
示例: 0.001
依赖关系
要启用此属性,请将 ThresholdFactor 属性设置为 "Auto"。
CustomThresholdFactor - 自定义阈值因子1(默认) | 正标量
自定义阈值因子,指定为实数正标量。此属性可调。
依赖关系
要启用此属性,请将 ThresholdFactor 属性设置为 "Custom"。
OutputFormat - 检测结果格式"CUT result"(默认) | "Detection index"
step 方法返回的检测结果的格式,指定为 "CUT result" 或者 "Detection index"。
设置为 "CUT result" 时,结果为每个检测单元的逻辑检测值(true 或 false);
当设置为 "Detection index" 时,结果会形成一个向量或矩阵,其中包含超过检测阈值的被检单元的索引。您可以使用这种格式作为 phased_RangeEstimator 和 phased_DopplerEstimator 系统对象的输入。
ThresholdOutputPort - 启用检测阈值输出false(默认) | true
启用检测阈值输出的选项,指定为 false 或 true。将此属性设置为 true 时,检测阈值将通过 step 方法的输出参数 th 返回。
NoisePowerOutputPort - 启用噪声功率输出false(默认) | true
启用噪声功率输出的选项,可指定为 false 或 true。将此属性设为 true 时,将通过 step 方法的输出参数 noise 返回噪声功率。
NumDetectionsSource - 检测数的来源"Auto" (默认) | "Property"
检测数来源,指定为 "Auto" 或 "Property"。将此属性设置为 "Auto" 时,报告的检测索引个数是有检测的被测单元总数。如果将此属性设置为 "Property",则报告的检测数由 NumDetections 属性的值决定。
依赖关系
要启用此属性,请将 OutputFormat 属性设置为 "Detection index"。
NumDetections - 要报告的最大检测索引个数1(默认) | 正整数
要报告的最大检测索引个数,指定为正整数。
依赖关系
要启用此属性,请将 OutputFormat 属性设置为 "Detection index",并将 NumDetectionsSource 属性设置为 "Property"。
# 方法
| 方法 | 说明 |
|---|---|
| reset | 重置系统对象的状态 |
| step | 二维 CFAR 检测 |
| 对系统对象通用的操作 | |
| release | 允许系统对象属性值更改 |
# 示例
为纯噪声数据设置二维 CFAR 门限
本例说明如何根据所需的虚警概率 (pfa) 设置 2-D CFAR 门限。
在包含高斯噪声的 41 x 41 单元矩阵上执行单元平均 CFAR 检测。估算经验 pfa,并将其与要求的 pfa 进行比较。为获得较好的估计值,可在 1000 个类似矩阵上进行模拟。首先,使用所需的 pfa 设置阈值。在这种情况下,没有目标,可以根据超过阈值的单元数量来估算 pfa。假设数据是通过平方律检测器处理的,并且没有进行脉冲积累。使用宽度为 3 个单元、高度为 4 个单元的参考区域。使用宽度为 3 个单元、高度为 2 个单元的保护区域,将被检单元(CUT)与参考单元分开。指定所需的 pfa 为 5.0e-4。
using TyPhasedArray
using TyMath
using TyPlot
p = 5e-4
N = 41
ntrials = 1000
detector = phased_CFARDetector2D(;
TrainingBandSize=[4, 3],
ThresholdFactor="Auto",
GuardBandSize=[2, 3],
ProbabilityFalseAlarm=p,
Method="SOCA",
ThresholdOutputPort=true,
)
创建一个 41 x 41 的图像,其中包含随机的复数据。然后,对数据进行平方处理,模拟平方律检测器。
rs = mt19937ar(5)
x = 2 / sqrt(2) .* (randn(rs, N, N, ntrials) .+ 1im .* randn(rs, N, N, ntrials))
x2 = abs.(x) .^ 2
处理每幅图像中的所有单元。为此,需要找出参考区域完全位于每幅图像中的每个 CUT 单元的行和列。
Ngc = detector.GuardBandSize[2]
Ngr = detector.GuardBandSize[1]
Ntc = detector.TrainingBandSize[2]
Ntr = detector.TrainingBandSize[1]
colstart = Ntc + Ngc + 1
colend = N - (Ntc + Ngc)
rowstart = Ntr + Ngr + 1
rowend = N - (Ntr + Ngr)
global cutidx = zeros(Int64, 2, (colend - colstart + 1) * (rowend - rowstart + 1))
global idk = 1
for m in colstart:colend
for n in rowstart:rowend
global cutidx[:, idk] = [n; m]
global idk = idk + 1
end
end
ncutcells = size(cutidx, 2)
显示 CUT 单元。
global cutimage = zeros(N, N)
for k in 1:ncutcells
global cutimage[cutidx[1, k], cutidx[2, k]] = 1
end
figure(1)
imagesc(cutimage)
axis("equal")
对所有 CUT 单元进行检测。返回检测分类和用于对单元进行分类的阈值。
dets, th, noise = step(detector, x2, cutidx)
查找并显示虚警图像,以作说明。
di = zeros(Int64, ntrials)
i = 1
for k in 1:ntrials
d = dets[:, k]
if any(d)
global di[i] = k
global i = i + 1
end
end
idx = di[1]
detimg = zeros(Int64, N, N)
for k in 1:ncutcells
global detimg[cutidx[1, k], cutidx[2, k]] = dets[k, idx]
end
figure(2)
imagesc(detimg)
axis("equal")
计算经验 pfa。
pfa = sum(dets[:]) / ntrials / ncutcells
display(pfa)
pfa = 0.00045897740784780024
经验值和指定的 pfa 一致。
显示所有图像的平均经验阈值。
display(mean(th[:]))
31.713860604619477
计算所需 pfa 的理论阈值因子。
threshfactor = npwgnthresh(p, 1, "noncoherent")
threshfactor = 10^(threshfactor / 10)
display(threshfactor)
7.600902459542192
理论阈值系数乘以噪声方差应与测量阈值一致。
noisevar = mean(x2[:])
display(threshfactor * noisevar)
30.411833405812192
理论阈值和经验阈值在可接受的误差范围内一致。
在背景噪声中检测目标
在高斯噪声中,对包含五个间距较近目标的 41 x 41 单元矩阵进行单元平均 CFAR 检测。对 1000 幅图像进行模拟检测。使用两个具有不同保护区域的检测器。使用自定义阈值因子手动设置阈值。假设通过平方律检测器处理数据,且不进行脉冲积累。使用宽度为 2 个单元、高度为 2 个单元的参考区域。对于第一个检测器,使用一个四周为 1 个单元的保护区域,将 CUT 单元与参考单元分开。对于第二个检测器,四周使用 8 个单元的保护区域。
using TyPhasedArray
using TyPlot
using TyMath
p = 5e-4
rs = mt19937ar(5)
N = 41
ntrials = 1000
创建 1000 幅标准偏差为 1 的 41 x 41 复杂随机噪音图像。
s = 1
x = s / sqrt(2) .* (randn(rs, N, N, ntrials) .+ 1im .* randn(rs, N, N, ntrials))
将目标单元值设置为 1.5。然后,将单元值平方。
A = 1.5
x[23, 20, :] .= A
x[23, 18, :] .= A
x[23, 23, :] .= A
x[20, 22, :] .= A
x[21, 18, :] .= A
x2 = abs2.(x)
显示目标单元。
xtgt = zeros(N, N)
xtgt[23, 20, :] .= A
xtgt[23, 18, :] .= A
xtgt[23, 23, :] .= A
xtgt[20, 22, :] .= A
xtgt[21, 18, :] .= A
figure()
imagesc(xtgt)
axis("equal")
axis("tight")
将 CUT 单元设置为目标单元。
cutidx = [23 23 23 20 21; 20 18 23 22 18]
使用两个 CFAR 2-D 检测器对所有 CUT 单元进行探测。第一个检测器有一个较小的保护区域。参考区域可能包括邻近的目标,这会影响噪声功率的计算。第二个检测器有一个较大的保护区域,可以避免在噪声计算中使用目标单元。
创建两个 CFAR 检测器。
detector1 = phased_CFARDetector2D(;
TrainingBandSize=[2, 2],
GuardBandSize=[1, 1],
ThresholdFactor="Custom",
Method="CA",
CustomThresholdFactor=2,
ThresholdOutputPort=true,
)
detector2 = phased_CFARDetector2D(;
TrainingBandSize=[2, 2],
GuardBandSize=[8, 8],
ThresholdFactor="Custom",
Method="CA",
CustomThresholdFactor=2,
ThresholdOutputPort=true,
)
返回检测分类和用于分类单元的阈值。然后计算检测概率。
dets1, th1 = step(detector1, x2, cutidx)
ndets = length(dets1)
pd1 = sum(dets1[:]) / ndets
display(pd1)
pd1 = 0.6416
dets2, th2 = step(detector2, x2, cutidx)
pd2 = sum(dets2[:]) / ndets
display(pd2)
pd2 = 0.9396
保护区域较大的检测器 pfa 值较高,因为对噪声的估计更为准确。
# 参考文献
[1] Mott, H. Antennas for Radar and Communications. New York: John Wiley & Sons, 1992.
[2] Richards, M. A. Fundamentals of Radar Signal Processing. New York: McGraw-Hill, 2005.
[3] Skolnik, M. Introduction to Radar Systems, 3rd Ed. New York: McGraw-Hill, 2001.