一,CFRA基礎知識介紹算法
二,經典CFAR算法解析與性能圖譜展現網絡
①均值類CFRAdom
核心思想是經過對參考窗內採樣數據取平均來估計背景功率。ide
CA-CFAR、GO-CFAR、SO-CFAR算法這三個是最經典的均值類CFAR算法,後續有其變形log-CFAR算法可是原理是相同的。函數
圖1 均值類CFAR檢測器原理圖性能
②統計有序CFAR優化
核心思想:經過對參考窗內的數據由小到大排序選取其中第K個數值假設其爲雜波背景噪聲。spa
圖2 OS-CFAR檢測器原理圖3d
③自適應CFARcode
針對不一樣的雜波選用不一樣的決策方法來進行。
圖3 HCE-CFAR檢測器原理圖
圖4 VI-CFAR檢測器原理圖
④雜波圖CFAR
經典的空域雜波圖CFAR算法,假設每一個距離元和方位角上的平方率值聽從獨立同分布,經過對時間維上的數據進行遺忘迭代來擬合雜波背景噪聲。
圖5 雜波圖CFAR檢測器原理圖
三,CFRA發展示狀
均值類-統計有序類-自適應-雜波圖-變換域-壓縮感知-神經網絡
四,經典CFAR算法實現源碼(matlab)
cfar_ac.m 單元平均恆虛警算法實現
優勢:損失率最少的一種算法;
缺點:多目標遮掩,雜波邊緣性能也欠佳;
1 function [ index, XT ] = cfar_ac( xc, N, pro_N, PAD) 2 % 假設回波服從高斯分佈 3 % 4 alpha=N.*(PAD.^(-1./N)-1); 5 index=1+N/2+pro_N/2:length(xc)-N/2-pro_N/2; 6 XT=zeros(1,length(index)); 7 8 for i=index 9 cell_left=xc(1,i-N/2-pro_N/2:i-pro_N/2-1); 10 cell_right=xc(1,i+pro_N/2+1:i+N/2+pro_N/2); 11 Z=(sum(cell_left)+sum(cell_right))./N; 12 13 XT(1,i-N/2-pro_N/2)=Z.*alpha; 14 end 15 16 end
test_cfar_ca.m
1 %% 程序初始化 2 clc;clear all;close all; 3 4 %% 均勻背景噪聲(單目標&多目標) 5 % shape=[200]; 6 % variance=200; 7 % noise_db=20; 8 % noise_p=10.^(noise_db./10); 9 % show_out=0; 10 % [ xc ] = env_uniform(variance, shape, noise_db,show_out); 11 12 % 單目標 13 % SNR1=15; signal1_p=10.^(SNR1./10).*noise_p; 14 % xc(1,90)=signal1_p; 15 % 16 % 多目標 17 % SNR1=20;signal1_p=10.^(SNR1./10).*noise_p; 18 % xc(1,90)=signal1_p; 19 % SNR2=15;signal2_p=10.^(SNR2./10).*noise_p; 20 % xc(1,102)=signal2_p; 21 22 23 %% 雜波邊緣背景噪聲(單目標&多目標) 24 shape=[100,200]; 25 variance=200; 26 noise_db=[20,30]; 27 noise_p=10.^(noise_db./10); 28 show_out=0; 29 [ xc ] = env_edge(variance, shape, noise_db,show_out); 30 31 % 多目標 32 SNR1=15;signal1_p=10.^(SNR1./10).*noise_p(1,end); 33 SNR2=12;signal2_p=10.^(SNR2./10).*noise_p(1,end); 34 SNR3=8;signal3_p=10.^(SNR3./10).*noise_p(1,end); 35 SNR4=5;signal4_p=10.^(SNR4./10).*noise_p(1,end); 36 37 loc1=randi([43,44],1,1); 38 xc(1,loc1)=signal1_p; 39 loc2=randi([46,48],1,1); 40 xc(1,loc2)=signal3_p; 41 loc3=randi([50,53],1,1); 42 xc(1,loc3)=signal2_p; 43 loc4=randi([55,58],1,1); 44 xc(1,loc4)=signal1_p; 45 loc5=randi([90,93],1,1); %接近雜波區,可是依然在 46 % xc(1,loc5)=signal1_p; 47 xc(1,loc5)=signal2_p; %這種雜波邊緣有目標的狀況,還須要優化 48 % xc(1,loc5)=signal3_p; 49 50 loc6=randi([102,108],1,1); 51 xc(1,loc6)=signal3_p; 52 53 %% 算法結果&圖譜顯示 54 N=36; 55 pro_N=2; 56 PAD=10^(-4); 57 [ index, XT ] = cfar_ac( xc, N, pro_N, PAD); 58 59 figure; 60 plot(10.*log(abs(xc))./log(10)),hold on; 61 plot(index,10.*log(abs(XT))./log(10)),hold on;
圖6 CA-CFAR效果圖
cfar_go.m 最大選擇恆虛警算法實現
優勢:雜波邊緣區域虛警機率下降
缺點:多目標遮掩
1 function [ index, XT ] = cfar_go( xc, N, pro_N, PAD) 2 % 假設回波服從高斯分佈 3 % alpha賦值有些問題,一個比較複雜的高次函數 4 alpha=N.*(PAD.^(-1./N)-1); 5 6 index=1+N/2+pro_N/2:length(xc)-N/2-pro_N/2; 7 XT=zeros(1,length(index)); 8 9 for i=index 10 cell_left=xc(1,i-N/2-pro_N/2:i-pro_N/2-1); 11 cell_right=xc(1,i+pro_N/2+1:i+N/2+pro_N/2); 12 Z=max([mean(cell_left),mean(cell_right)]); 13 14 XT(1,i-N/2-pro_N/2)=Z.*alpha; 15 end 16 17 end
test_cfar_go.m
1 %% 程序初始化 2 clc;clear all;close all; 3 4 %% 均勻背景噪聲(單目標&多目標) 5 % shape=[200]; 6 % variance=200; 7 % noise_db=20; 8 % noise_p=10.^(noise_db./10); 9 % show_out=0; 10 % [ xc ] = env_uniform(variance, shape, noise_db,show_out); 11 12 % 單目標 13 % SNR1=15; signal1_p=10.^(SNR1./10).*noise_p; 14 % xc(1,90)=signal1_p; 15 % 16 % 多目標 17 % SNR1=20;signal1_p=10.^(SNR1./10).*noise_p; 18 % xc(1,90)=signal1_p; 19 % SNR2=15;signal2_p=10.^(SNR2./10).*noise_p; 20 % xc(1,102)=signal2_p; 21 22 23 %% 雜波邊緣背景噪聲(單目標&多目標) 24 shape=[100,200]; 25 variance=200; 26 noise_db=[20,30]; 27 noise_p=10.^(noise_db./10); 28 show_out=0; 29 [ xc ] = env_edge(variance, shape, noise_db,show_out); 30 31 % 多目標 32 SNR1=15;signal1_p=10.^(SNR1./10).*noise_p(1,end); 33 SNR2=12;signal2_p=10.^(SNR2./10).*noise_p(1,end); 34 SNR3=8;signal3_p=10.^(SNR3./10).*noise_p(1,end); 35 SNR4=5;signal4_p=10.^(SNR4./10).*noise_p(1,end); 36 37 loc1=randi([43,44],1,1); 38 xc(1,loc1)=signal1_p; 39 loc2=randi([46,48],1,1); 40 xc(1,loc2)=signal3_p; 41 loc3=randi([50,53],1,1); 42 xc(1,loc3)=signal2_p; 43 loc4=randi([55,58],1,1); 44 xc(1,loc4)=signal1_p; 45 % loc5=randi([90,93],1,1); %接近雜波區,可是依然在 46 % xc(1,loc5)=signal1_p; 47 % xc(1,loc5)=signal2_p; %這種雜波邊緣有目標的狀況,還須要優化 48 % xc(1,loc5)=signal3_p; 49 50 loc6=randi([102,108],1,1); 51 xc(1,loc6)=signal3_p; 52 53 %% 算法結果&圖譜顯示 54 N=36; 55 pro_N=2; 56 PAD=10^(-4); 57 [ index, XT ] = cfar_go( abs(xc), N, pro_N, PAD); 58 59 figure; 60 plot(10.*log(abs(xc))./log(10)),hold on; 61 plot(index,10.*log(abs(XT))./log(10)),hold on;
圖7 GO-CFAR效果圖
cfar_so.m 最小選擇恆虛警算法實現
優勢:多目標效果有改進;
缺點:雜波邊緣區域虛警機率提高;
1 function [ index, XT ] = cfar_so( xc, N, pro_N, PAD) 2 % 假設回波服從高斯分佈 3 % alpha賦值有些問題,一個比較複雜的高次函數 4 alpha=N.*(PAD.^(-1./N)-1); 5 6 index=1+N/2+pro_N/2:length(xc)-N/2-pro_N/2; 7 XT=zeros(1,length(index)); 8 9 for i=index 10 cell_left=xc(1,i-N/2-pro_N/2:i-pro_N/2-1); 11 cell_right=xc(1,i+pro_N/2+1:i+N/2+pro_N/2); 12 Z=min([mean(cell_left),mean(cell_right)]); 13 14 XT(1,i-N/2-pro_N/2)=Z.*alpha; 15 end 16 17 end
test_cfar_so.m
1 %% 程序初始化 2 clc;clear all;close all; 3 4 %% 均勻背景噪聲(單目標&多目標) 5 % shape=[200]; 6 % variance=200; 7 % noise_db=20; 8 % noise_p=10.^(noise_db./10); 9 % show_out=0; 10 % [ xc ] = env_uniform(variance, shape, noise_db,show_out); 11 12 % 單目標 13 % SNR1=15; signal1_p=10.^(SNR1./10).*noise_p; 14 % xc(1,90)=signal1_p; 15 % 16 % 多目標 17 % SNR1=20;signal1_p=10.^(SNR1./10).*noise_p; 18 % xc(1,90)=signal1_p; 19 % SNR2=15;signal2_p=10.^(SNR2./10).*noise_p; 20 % xc(1,102)=signal2_p; 21 22 23 %% 雜波邊緣背景噪聲(單目標&多目標) 24 shape=[100,200]; 25 variance=200; 26 noise_db=[20,30]; 27 noise_p=10.^(noise_db./10); 28 show_out=0; 29 [ xc ] = env_edge(variance, shape, noise_db,show_out); 30 31 % 多目標 32 SNR1=15;signal1_p=10.^(SNR1./10).*noise_p(1,end); 33 SNR2=12;signal2_p=10.^(SNR2./10).*noise_p(1,end); 34 SNR3=8;signal3_p=10.^(SNR3./10).*noise_p(1,end); 35 SNR4=5;signal4_p=10.^(SNR4./10).*noise_p(1,end); 36 37 loc1=randi([43,44],1,1); 38 xc(1,loc1)=signal1_p; 39 loc2=randi([46,48],1,1); 40 xc(1,loc2)=signal3_p; 41 loc3=randi([50,53],1,1); 42 xc(1,loc3)=signal2_p; 43 loc4=randi([55,58],1,1); 44 xc(1,loc4)=signal1_p; 45 % loc5=randi([90,93],1,1); %接近雜波區,可是依然在 46 % xc(1,loc5)=signal1_p; 47 % xc(1,loc5)=signal2_p; %這種雜波邊緣有目標的狀況,還須要優化 48 % xc(1,loc5)=signal3_p; 49 50 loc6=randi([102,108],1,1); 51 xc(1,loc6)=signal3_p; 52 53 %% 算法結果&圖譜顯示 54 N=36; 55 pro_N=2; 56 PAD=10^(-4); 57 [ index, XT ] = cfar_so( abs(xc), N, pro_N, PAD); 58 59 figure; 60 plot(10.*log(abs(xc))./log(10)),hold on; 61 plot(index,10.*log(abs(XT))./log(10)),hold on;
圖8 SO-CFAR效果圖
cfar_os.m 有序統計恆虛警算法實現
優勢:多目標檢測性能很好;
缺點:雜波邊緣區域虛警機率提升;
1 function [ index, XT ] = cfar_os( xc, N, k, pro_N, PAD) 2 % 假設回波服從高斯分佈 3 % alpha賦值有些問題,一個比較複雜的高次函數 4 5 %% 計算alpha 6 % syms alpha PFA; 7 % PFA(alpha)=gamma(N-1).*gamma(N-k+alpha-1)./gamma(N-k-1)./gamma(N+alpha-1); 8 % [alpha,~,~]=solve(PFA(alpha)==PAD,'ReturnConditions', true) ; 9 10 alpha=N.*(PAD.^(-1./N)-1); 11 12 index=1+N/2+pro_N/2:length(xc)-N/2-pro_N/2; 13 XT=zeros(1,length(index)); 14 15 for i=index 16 cell_left=xc(1,i-N/2-pro_N/2:i-pro_N/2-1); 17 cell_right=xc(1,i+pro_N/2+1:i+N/2+pro_N/2); 18 cell_all=cat(2,cell_left,cell_right); 19 cell_sort=sort(cell_all); 20 21 Z=cell_sort(1,k); 22 23 XT(1,i-N/2-pro_N/2)=Z.*alpha; 24 end 25 26 end
test_cfar_os.m
1 %% 程序初始化 2 clc;clear all;close all; 3 4 %% 均勻背景噪聲(單目標&多目標) 5 % shape=[200]; 6 % variance=200; 7 % noise_db=20; 8 % noise_p=10.^(noise_db./10); 9 % show_out=0; 10 % [ xc ] = env_uniform(variance, shape, noise_db,show_out); 11 12 % 單目標 13 % SNR1=15; signal1_p=10.^(SNR1./10).*noise_p; 14 % xc(1,90)=signal1_p; 15 % 16 % 多目標 17 % SNR1=20;signal1_p=10.^(SNR1./10).*noise_p; 18 % xc(1,90)=signal1_p; 19 % SNR2=15;signal2_p=10.^(SNR2./10).*noise_p; 20 % xc(1,102)=signal2_p; 21 22 23 %% 雜波邊緣背景噪聲(單目標&多目標) 24 shape=[100,200]; 25 variance=200; 26 noise_db=[20,30]; 27 noise_p=10.^(noise_db./10); 28 show_out=0; 29 [ xc ] = env_edge(variance, shape, noise_db,show_out); 30 31 % 多目標 32 SNR1=15;signal1_p=10.^(SNR1./10).*noise_p(1,end); 33 SNR2=12;signal2_p=10.^(SNR2./10).*noise_p(1,end); 34 SNR3=8;signal3_p=10.^(SNR3./10).*noise_p(1,end); 35 SNR4=5;signal4_p=10.^(SNR4./10).*noise_p(1,end); 36 37 loc1=randi([43,44],1,1); 38 xc(1,loc1)=signal1_p; 39 loc2=randi([46,48],1,1); 40 xc(1,loc2)=signal3_p; 41 loc3=randi([50,53],1,1); 42 xc(1,loc3)=signal2_p; 43 loc4=randi([55,58],1,1); 44 xc(1,loc4)=signal1_p; 45 loc5=randi([90,93],1,1); %接近雜波區,可是依然在 46 % xc(1,loc5)=signal1_p; 47 xc(1,loc5)=signal2_p; %這種雜波邊緣有目標的狀況,還須要優化 48 % xc(1,loc5)=signal3_p; 49 50 loc6=randi([102,108],1,1); 51 xc(1,loc6)=signal3_p; 52 53 %% 算法結果&圖譜顯示 54 N=36; 55 pro_N=2; 56 k=2.*N./4; 57 PAD=10^(-4); 58 [ index, XT ] = cfar_os( abs(xc), N, k, pro_N, PAD); 59 60 figure; 61 plot(10.*log(abs(xc))./log(10)),hold on; 62 plot(index,10.*log(abs(XT))./log(10)),hold on;
圖9 OS-CAFR效果圖
cfar_tc.m 雜波圖恆虛警算法實現
優勢:經過提升累積幀數,雜波背景噪聲功率趨近於理論值
缺點:對於慢移動目標有自遮掩效果
1 function [ index, XT, xc_tpn ] = cfar_tc( xc, xc_tp, N, pro_N, PAD) 2 % 假設回波服從高斯分佈 3 % 4 xc_tc=zeros(1,length(xc)); 5 alpha=N.*(PAD.^(-1./N)-1); 6 xc_tc(1,2:end-1)=xc_tp(1,2:end-1)./3+xc(1,1:end-2)./3+xc(1,3:end)./3; 7 xc_tpn=xc_tp(1,1:end)./2+xc(1,1:end)./2; 8 xc_tc(1,1)=xc_tpn(1,1); 9 xc_tc(1,end)=xc_tpn(1,end); 10 11 index=1+N/2+pro_N/2:length(xc)-N/2-pro_N/2; 12 XT=zeros(1,length(index)); 13 14 for i=index 15 cell_left=xc_tc(1,i-N/2-pro_N/2:i-pro_N/2-1); 16 cell_right=xc_tc(1,i+pro_N/2+1:i+N/2+pro_N/2); 17 Z=(sum(cell_left)+sum(cell_right))./N; 18 19 XT(1,i-N/2-pro_N/2)=Z.*alpha; 20 end 21 22 end
test_cfar_tc.m
1 %% 程序初始化 2 clc;clear all;close all; 3 4 %% 均勻背景噪聲(單目標&多目標) 5 % shape=[200]; 6 % variance=200; 7 % noise_db=20; 8 % noise_p=10.^(noise_db./10); 9 % show_out=0; 10 % [ xc ] = env_uniform(variance, shape, noise_db,show_out); 11 12 % 單目標 13 % SNR1=15; signal1_p=10.^(SNR1./10).*noise_p; 14 % xc(1,90)=signal1_p; 15 % 16 % 多目標 17 % SNR1=20;signal1_p=10.^(SNR1./10).*noise_p; 18 % xc(1,90)=signal1_p; 19 % SNR2=15;signal2_p=10.^(SNR2./10).*noise_p; 20 % xc(1,102)=signal2_p; 21 22 23 %% 雜波邊緣背景噪聲(單目標&多目標) 24 shape=[100,200]; 25 variance=200; 26 noise_db=[20,30]; 27 noise_p=10.^(noise_db./10); 28 show_out=0; 29 % [ xc ] = env_edge(variance, shape, noise_db, show_out); 30 31 % 多目標 32 SNR1=15;signal1_p=10.^(SNR1./10).*noise_p(1,end); 33 SNR2=12;signal2_p=10.^(SNR2./10).*noise_p(1,end); 34 SNR3=8;signal3_p=10.^(SNR3./10).*noise_p(1,end); 35 SNR4=5;signal4_p=10.^(SNR4./10).*noise_p(1,end); 36 37 % loc1=randi([43,44],1,1); 38 % xc(1,loc1)=signal1_p; 39 % loc2=randi([46,48],1,1); 40 % xc(1,loc2)=signal3_p; 41 % loc3=randi([50,53],1,1); 42 % xc(1,loc3)=signal2_p; 43 % loc4=randi([55,58],1,1); 44 % xc(1,loc4)=signal1_p; 45 % loc5=randi([90,93],1,1); %接近雜波區,可是依然在 46 % xc(1,loc5)=signal1_p; 47 % xc(1,loc5)=signal2_p; %這種雜波邊緣有目標的狀況,還須要優化 48 % xc(1,loc5)=signal3_p; 49 50 % loc6=randi([102,108],1,1); 51 % xc(1,loc6)=signal3_p; 52 53 %% 迭代算法實現(雜波圖) 54 N=36; 55 u=0.001; 56 PAD=10^(-4); 57 alpha=N.*(PAD.^(-1./N)-1); 58 xtp=zeros(1,shape(end)); 59 d0=0; 60 d1=[0]; 61 for i=1:1:4000 62 [ xc ] = env_edge(variance, shape, noise_db,show_out); 63 64 loc1=randi([43,44],1,1); 65 xc(1,loc1)=signal1_p; 66 loc2=randi([46,48],1,1); 67 xc(1,loc2)=signal3_p; 68 loc3=randi([50,53],1,1); 69 xc(1,loc3)=signal2_p; 70 loc4=randi([55,58],1,1); 71 xc(1,loc4)=signal1_p; 72 73 loc6=randi([102,108],1,1); 74 xc(1,loc6)=signal3_p; 75 76 xtp=xtp.*(1-u)+xc.*u; 77 d0=d0.*(1-u)+u; 78 d1=cat(2,d1,d0); 79 80 if mod(i,100)==0 81 %% 圖譜顯示 82 figure; 83 plot(10.*log(abs(xc))./log(10)),hold on; 84 plot(10.*log(abs(xtp.*alpha./d0))./log(10)),hold on; 85 end 86 87 end
圖10 雜波圖CFAR效果圖
五,總結
理想狀況下的CFAR算法:
①多目標檢測性能很好,幾乎互不影響;
②雜波邊緣區域,突變很快,虛警率穩定;
③慢移動目標自遮掩改善;
④算法實用,複雜度適中,理論可實現;
env_uniform.m文件
1 function [ xc ] = env_uniform(variance, shape, power_db, show_out) 2 %UNIFORM_EN 此處顯示有關此函數的摘要 3 % 此處顯示詳細說明 4 if (nargin==3) 5 show_out=0; 6 end 7 8 c=10^(power_db/10); % 這裏是幅度——功率 9 xc=c + random('Normal',0,variance,1,shape); 10 if show_out==1 11 figure;plot(10.*log(abs(xc))./log(10)); 12 end 13 14 end
env_edge.m文件
1 function [ xc ] = env_edge(variance, shape, power_db, show_out) 2 %UNIFORM_EN 此處顯示有關此函數的摘要 3 % 此處顯示詳細說明 4 if (nargin==3) 5 show_out=0; 6 end 7 8 c=10.^(power_db./10); % 這裏是幅度——功率 9 xc=random('Normal',0,variance,1,shape(1,end)); 10 xc(1,1:end)=xc(1,1:end)+c(1,1); 11 index=1; 12 for i=1:length(power_db) 13 xc(1,index:shape(1,i))=xc(1,index:shape(1,i)).*c(1,i)./c(1,1); 14 index=shape(1,i)+1; 15 end 16 17 18 if show_out==1 19 figure;plot(20.*log(abs(xc))./log(10)); 20 end 21 22 end