EngeePhased.CFARDetector2D
资料描述
系统对象*EngeePhased。CFARDetector2D*为二维信号模拟具有恒定虚警电平的检测器。
输入信号序列被分成间隔(称为信元)。 当输入数据中的像元值超过阈值时注册检测。 为了保持恒定的虚警率,阈值被设置为输入数据的噪声功率的倍数。
检测器使用三种小区平均方法或序数统计方法中的一种来评估来自被测小区周围的相邻小区(被测小区,CUT)的噪声功率。 小区平均方法:小区平均(CA)、最大小区值平均(GOCA)或最小小区值平均(SOCA)。
有关CFAR探测器的更多信息,请参阅[1]。
对于每个被测试的细胞,检测器:
-
基于围绕测试小区的训练频带中的小区值评估噪声统计。
-
通过将噪声估计值乘以阈值因子来计算阈值。
-
将被测小区的值与阈值进行比较,以确定目标的存在或不存在。 如果该值大于阈值,则目标存在。
要创建和使用带有池的检测器,请按照以下步骤操作:
-
创建*EngeePhased。CFARDetector2D*对象并设置其属性。
-
用参数调用对象,就好像它是一个函数一样。
若要了解有关如何使用系统对象的详细信息,请参阅 AnyMath系统对象.
语法
创造
-
探测器=EngeePhased。CFARDetector2D()-创建具有默认属性值的池的二维探测器对象。 -
探测器=EngeePhased。CFARDetectora2D(名称=值)-创建具有指定属性的池的二维探测器对象,其形式为一对名称=值,在哪里姓名-物业的名称,以及价值-适当的值。 您可以指定多个对 «名称-值» 对的顺序并不重要。 未指定的属性保留其默认值。detector=EngeePhased.CFARDetector2D(Method="OS", ThresholdFactor="Custom", Rank=2)
使用
-
Y=检测器(X,cutidx)-在输入数据*X*中为测试细胞*cutidx*执行二维检测。 输出参数*Y*包含被测细胞的检测结果。 -
Y,th=检测器(_)-还返回应用于检测到的测试细胞的检测阈值*th*。 若要使用此语法,请设置*ThresholdOutputPort*值真的. -
Y,噪声=检测器(_)-还返回参数*X*中每个检测到的测试单元的噪声功率*噪声*的估计值。 若要使用此语法,请设置*NoisePowerOutputPort*值真的. -
_=检测器(X,cutidx,thfac)-还使用阈值因子*thfac*来计算检测阈值。 若要使用此语法,请设置*ThresholdFactor*值"输入端口".
争论
输入参数
X — 输入信号
+
实矩阵M乘N | m乘N乘P的实数组
Details
输入信号,指定为实矩阵 上 或者一个真正的数组 上 上
| 数据类型 |
|
cutidx — 测试细胞的索引
+
正整数2乘D的矩阵
Details
被测单元格的索引,设置为正整数矩阵 上 ,在哪里 -被测试的细胞数。
每列*cutidx*包含被测单元格的行和列索引。 相同的索引应用于输入数组中的所有页面。 应限制待测像元的位置,使待测区域完全位于输入数据内。
| 数据类型 |
|
thfac — 检测阈值系数
+
正标量
Details
用于计算检测阈值的阈值系数,设为正标量。
依赖关系
要使用此输入参数,请将detector对象的属性*CustomThresholdFactor*设置为 "输入端口".
| 数据类型 |
|
输出参数
*Y*是 探测器输出
+
P上的逻辑矩阵D | 逻辑矩阵K由L
Details
探测器输出数据的格式取决于*OutputFormat*:
If for a propertyOutputFormat*值集 "切割结果",参数*Y*是一个矩阵 上 ,包含所述逻辑检测结果。 意义 是*cutidx*参数的长度,并且 是参数*X*的第三维的值。 Y*线对应于*cutidx*线。 对于参数的每一行,*Y*包含值 1 列中,如果在参数*X*的相应列中存在检测。 否则,*Y*参数包含值 0.
*If for a propertyOutputFormat*值集 "检测指标",参数*Y*是一个矩阵 上 ,包含检测指标。 意义 是在输入数据中找到的检测次数,以及 -维数*X*。
如果参数*X*是一个数组,则参数*Y*包含*X*中每个检测的行、列和页索引 [detrow;detcol;detpage]. 如果属性*NumDetectionsSource*设置为 "财产", 等于*NumDetections*属性的值。 如果实际检测的数量小于此值,则非检测列将设置为 南.
| 数据类型 |
|
第 — 计算出的检测阈值
+
实矩阵
Details
计算出的每个检测小区的检测阈值,作为实矩阵返回。 Th*端口上的数据具有与*Y*相同的维度。
*If for a propertyOutputFormat*值集 "切割结果",当参数*y*为时,参数*th*返回检测阈值 1,而 南 当参数*Y*等于 0.
If for a propertyOutputFormat*值集 "检测指标",th*参数返回*Y*中每个相应检测的检测阈值。 如果属性NumDetectionsSource*设置为 "财产", 等于*NumDetections*属性的值。 如果实际检测的数量小于此值,则没有检测的列将设置为 南.
依赖关系
若要启用此输出参数,请设置*ThresholdOutputPort*值 真的.
| 数据类型 |
|
噪音 — 噪音功率评估
+
实矩阵
Details
每个检测到的小区的噪声功率的估计,作为实矩阵返回。 噪声的尺寸与参数*Y*相同。
If for a propertyOutputFormat*值集 "切割结果",noise*参数返回当*Y*参数为 1,而 南 当参数*Y*等于 0.
*If for a propertyOutputFormat*值集 "检测指标",noise*参数返回*Y*中每个相应检测的噪声功率。 如果属性NumDetectionsSource*设置为 "财产", 等于*NumDetections*属性的值。 如果实际检测的数量小于此值,则没有检测的列将设置为 南.
依赖关系
若要启用此输出参数,请设置NoisePowerOutputPort值 真的.
| 数据类型 |
|
特征
#
Method —
池平均法
String
Details
由以下值之一定义的二维池平均方法: "CA" (默认情况下), "戈卡", "索卡" 或 "操作系统".
对于值 "CA", "戈卡", "索卡" 噪声功率是从训练区域接收的样本的平均值。
为值 "操作系统" 噪声功率为 是作为训练细胞的所有值的数值排序的结果而获得的细胞值。 安装/安装 使用*Rank*。
| 平均方法 | 资料描述 |
|---|---|
|
计算测试细胞周围的所有训练细胞的样本平均值。 |
|
将测试单元周围的二维学习窗口分成左右两半。 然后,该算法计算每半样本的平均值,并选择最大的平均值。 |
|
将测试单元周围的二维学习窗口分成左右两半。 然后,该算法计算每半样本的平均值,并选择最小的平均值。 |
|
按照数值的升序对训练单元格进行排序。 然后算法选择 列表中的th值,其中 —这是属性*Rank*设置的等级。 |
#
NoisePowerOutputPort —
启用噪声输出功率估计
Logical
Details
接通噪声输出功率,设置为 错误 (默认情况下)或 真的.
若要获取噪声估计值,请将*NoisePowerOutputPort*属性设置为 真的 并在调用对象函数时使用输出参数*noise*。
#
ProbabilityFalseAlarm —
所需的虚警概率
Real number
Details
虚警的所需概率,作为一个真正的正标量在范围内给出 0 以前 1.
算法从所需的虚警概率计算阈值系数。
默认值 — 0.001.
依赖关系
若要使用此属性,请设置*ThresholdFactor*值 "汽车".
#
OutputFormat —
检测结果的格式
String
Details
返回的检测结果的格式,由以下值之一设置: "切割结果" (默认情况下)或 "检测指标".
如果*OutputFormat*属性设置为 "切割结果",结果为布尔检测值(1 或 0)对于每个测试的细胞。
如果*OutputFormat*属性设置为 "检测指标" 结果是包含超过检测阈值的被检查细胞的索引的向量或矩阵。
#
ThresholdFactor —
阈值系数的确定方法
String
Details
阈值系数方法,由以下值之一设置: "汽车" (默认情况下), "习惯" 或 "输入端口":
-
"汽车"-对象根据属性*ProbabilityFalseAlarm*中指定的虚警的期望概率自动计算阈值系数。 在计算中,假设每个独立的输入信号是从具有二次定律的检测器出来的单个脉冲,没有脉冲积分。 该计算还假定噪声是白高斯。 -
"习惯"-阈值系数在*CustomThresholdFactor*属性中设置。 -
"输入端口"-输入参数*thfac*设置阈值系数。
#
TrainingBandSize —
训练区域的大小
Scalar / array of real numbers
Details
待测小区每一侧的训练区域中小区的行数和列数,设为正整数或矩阵 上 正整数。 第一个元素按行设置训练区域的大小,第二个按列设置。
将此属性指定为标量等效于为两个维度指定具有相同值的训练区域。
默认值 [1 1] 表示宽度为 1 测试小区周围的训练小区。
#
GuardBandSize —
保护区域的大小
Scalar / array of real numbers
Details
被测细胞每一侧的保护区域的细胞的行数和列数,设为正整数或矩阵 上 正整数。 第一个元素按行设置保护区域的大小,第二个按列设置保护区域的大小。
默认值 [1 1] 表示宽度为 1 测试小区周围的训练小区。
意义 0 表示不存在保护细胞。
#
ThresholdOutputPort —
使能阈值检测值的输出
Logical
Details
启用检测阈值输出,设置为 错误 (默认情况下)或 真的.
要启用检测阈值输出,请将*ThresholdOutputPort*属性设置为 真的 并使用输出参数*th*。
#
NumDetections —
最大检测索引数
Integer
Details
#
NumDetectionsSource —
检测次数的来源
String
Details
检测次数的来源,设置为以下值之一: "汽车" (默认情况下)或 "财产":
*如果*NumDetectionsSource*属性设置为 "汽车" 报告的检测索引的数量等于已检测的细胞的总数。
如果*NumDetectionsSource*属性设置为 "财产",报告的检测次数由NumDetections*属性的值决定。
依赖关系
若要使用此属性,请设置*[Property:OutputForma]t*值 "检测指标".
#
CustomThresholdFactor —
用户阈值因子
Real number
Details
一个自定义阈值系数集作为一个真正的正标量.
默认值 — 1.
依赖关系
若要使用此属性,请将*属性设置为:ThresholdFactor*值 "习惯".
例子:
为纯噪声数据设置二维池阈值
Details
此示例演示如何根据所需的虚警概率(pfa)设置二维拉动阈值。
让我们使用池方法对具有大小的细胞矩阵进行细胞平均检测 含高斯噪声。 让我们评估经验pfa并将其与所需的pfa进行比较。 为了得到一个很好的估计,我们将在 1000 类似的矩阵。 首先,我们将使用所需的pfa设置阈值。 在这种情况下,不存在目标小区,并且可以通过超过阈值的小区的数量来估计pfa。 假设正在使用二次定律检测器处理数据,并且未执行脉冲积分。 我们使用一个宽度为 3 细胞和高度 4 细胞。 我们使用宽保护带 3 细胞和高度 2 细胞以将测试细胞与训练细胞分离(切割)。 指定所需的PFA 5.0e-4.
using EngeePhased
using Random
Random.seed!(1234)
p = 5e-4
rs = MersenneTwister(5)
N = 41
ntrials = 1000
detector = EngeePhased.CFARDetector2D(TrainingBandSize=[4,3],
ThresholdFactor="Auto",GuardBandSize=[2,3],
ProbabilityFalseAlarm=p,Method="SOCA",ThresholdOutputPort=true);
让我们创建一个大小的图像 41 上 41 包含随机复杂数据。 然后我们将这些数据平方以模拟二次定律检测器。
x = 2/sqrt(2) * (randn(rs, N, N, ntrials) + im * randn(rs, N, N, ntrials))
x2 = abs.(x).^2;
我们将处理每个图像中的所有单元格。 为此,我们将找到每个切割单元格的行和列,其学习区域完全位于每个图像内部。 让我们显示剪切的单元格。
Ngc = detector.GuardBandSize[2];
Ngr = detector.GuardBandSize[1];
Ntc = detector.TrainingBandSize[2];
Ntr = detector.TrainingBandSize[1];
cutidx = Matrix{Int}(undef, 2, 0)
colstart = Ntc + Ngc + 1;
colend = N - ( Ntc + Ngc);
rowstart = Ntr + Ngr + 1;
rowend = N - ( Ntr + Ngr);
for m in colstart:colend
for n in rowstart:rowend
cutidx = [cutidx [n; m]]
end
end
ncutcells = size(cutidx,2);
using Plots
cutimage = zeros(N, N)
for k in 1:ncutcells
cutimage[cutidx[1, k], cutidx[2, k]] = 1
end
heatmap(cutimage, aspect_ratio=:equal, yflip=true)

让我们执行所有切割细胞的检测。 让我们返回检测分类和用于对小区进行分类的阈值。
dets,th = detector(x2,cutidx);
我们将发现并显示假阳性图像。
using Plots
di = Int[]
for k in 1:ntrials
d = dets[:, k]
if any(d)
push!(di, k)
end
end
idx = di[1]
detimg = zeros(N, N)
for k in 1:ncutcells
detimg[cutidx[1, k], cutidx[2, k]] = dets[k, idx]
end
heatmap(detimg, aspect_ratio=:equal, yflip=true)

让我们计算经验pfa。
pfa = sum(dets) / ntrials / ncutcells
0.0005005945303210463
Pfa的经验值和设定值相同。
让我们显示所有图像的平均经验阈值。
import EngeeDSP.Functions: mean
mean(th, "all")
31.71466631470533
让我们计算所需pfa值的理论阈值系数。
import EngeePhased.Functions: npwgnthresh
threshfactor = npwgnthresh(p,1,"noncoherent");
threshfactor = 10^(threshfactor/10)
7.600902459542084
理论阈值因子乘以噪声方差必须与测量的阈值匹配。
noisevar = mean(x2, "all")
threshfactor*noisevar
30.42597796742739
理论和经验阈值与可接受的差异一致。
此外
被测细胞
Details
用PULT进行二维检测的算法需要对噪声功率进行估计。 噪声功率是从假定不包含目标信号的信元计算的。 这些细胞是训练细胞。 训练细胞在测试细胞周围形成条带,但可通过保护条带与测试细胞分离。 通过将噪声功率乘以阈值因子来计算检测阈值。
对于GOCA和SOCA平均,噪声功率被定义为训练小区区域的左半部分或右半部分之一的平均值。
由于训练区域中的列数为奇数,因此中间列中的单元格同样属于左半部分或右半部分。
使用序数统计方法时,秩不能大于训练小区区域的小区数。 . 你可以计算 .
合训练区、保护区和测试小区的小区总数为:
哪里
-
-训练条的列数;
-
-训练条的行数;
-
-保护条的列数;
-
-保护条的线数。
合保护区域和被测细胞的细胞总数为:
训练小区的个数为:
通过设计,训练细胞的数量总是均匀的。 因此,要实现中值滤波器,可以选择秩 或 .