276 lines
6.9 KiB
Matlab
276 lines
6.9 KiB
Matlab
clc
|
|
clear
|
|
close all;
|
|
|
|
%% 参数设置
|
|
B = 5e6; % 信号带宽5MHz
|
|
Tp = 20e-6; % 脉宽100us
|
|
fs = 2 * B; % 采样频率
|
|
Ts = 1 / fs; % 采样周期
|
|
K = B / Tp; % 线性调频率
|
|
fc = 1.25e9; % 载波频率1.25GHz
|
|
PRF = 5000; % 脉冲重复频率
|
|
Tr = 1 / PRF; % 脉冲重复间隔
|
|
|
|
numP = 64; % 脉冲数量
|
|
|
|
t = 0: 1 / fs: Tr - 1 / fs;
|
|
tP = 0: 1 / fs: Tr * numP - 1 / fs;
|
|
|
|
c = 3e8; % 光速
|
|
|
|
slow_len = 128;
|
|
|
|
%%
|
|
sigma_n = 0.1;
|
|
alpha_prop = 0.8;
|
|
|
|
% SNR = -30;
|
|
SNR = [-5,0,5,8,10,12,15,20,25];
|
|
len_SNR = length(SNR);
|
|
|
|
P_fa = [1e-4, 5e-4, 1e-3, 5e-3, 1e-2, 5e-2, 1e-1, 5e-1, 1];
|
|
len_P_fa = length(P_fa);
|
|
|
|
rep_time = 500;
|
|
|
|
% rou >= c / 2B = 15(m)
|
|
|
|
%% 产生发射信号
|
|
N = Tr * fs;
|
|
N_high = Tp * fs;
|
|
|
|
signal_t = zeros(1, N * numP);
|
|
for j = 1: numP
|
|
for i = 1: N_high
|
|
tp = ((j - 1) * N + i) * (1 / fs);
|
|
signal_t(1, i + (j-1)*N) = exp(1j * 2 * pi * (fc * tp + 0.5 * K * tp .^ 2));
|
|
end
|
|
end
|
|
|
|
multiple_r = signal_t(1, 1: N) * signal_t(1, 1: N)';
|
|
% figure(1);
|
|
% subplot(311)
|
|
% plot(tP,real(signal_t));
|
|
% xlabel('时间/t');ylabel('幅度');
|
|
% title('发射信号');
|
|
|
|
%% 设置目标 1
|
|
distance1 = 18000;
|
|
v1 = 187.5;
|
|
|
|
tau1 = distance1 * 2 / c;
|
|
n_tau1 = round(tau1 * fs);
|
|
|
|
f_d1 = 2 * fc * v1 / c;
|
|
|
|
alpha1 = alpha_prop;
|
|
% alpha1 = 0;
|
|
|
|
signal_r1 = zeros(1, N * numP);
|
|
for j = 1: numP
|
|
for i = 1: N
|
|
temp = i - n_tau1;
|
|
if temp >= 1 && temp <= N_high
|
|
tp = ((j - 1) * N + i - n_tau1) * (1 / fs);
|
|
signal_r1(1, i + (j-1)*N) = alpha1 * exp(1j*2*pi*((fc - f_d1) * tp + 0.5 * K * tp .^ 2));
|
|
end
|
|
end
|
|
end
|
|
|
|
%% 生成回波
|
|
signal_r = signal_r1;
|
|
% figure(1);
|
|
% subplot(312)
|
|
% plot(tP, real(signal_r));
|
|
% xlabel('时间/t');
|
|
% ylabel('幅度');
|
|
% title('回波信号');
|
|
|
|
%%
|
|
P_fa_MF_cnt = zeros(len_SNR, len_P_fa, rep_time);
|
|
P_d_MF_cnt = zeros(len_SNR, len_P_fa, rep_time);
|
|
|
|
% 多普勒处理
|
|
F_ori = dftmtx(slow_len);
|
|
F = F_ori(1:numP,:);
|
|
multiple_d = F(:,1)' * F(:,1);
|
|
|
|
parfor rep = 1: rep_time
|
|
% for rep = 1: rep_time
|
|
|
|
for cnt_SNR = 1: len_SNR
|
|
|
|
%% 噪声处理
|
|
noise = random('Normal', 0, sigma_n/sqrt(2), 1, N * numP) + 1j * random('Normal', 0, sigma_n/sqrt(2), 1, N * numP);
|
|
alpha_SNR = sqrt(10^(SNR(cnt_SNR)/10) * sigma_n^2 / (multiple_r * multiple_d));
|
|
signal_r_n = signal_r * alpha_SNR + noise;
|
|
|
|
% figure(1);
|
|
% subplot(313)
|
|
% plot(tP, real(signal_r_n));
|
|
% xlabel('时间/t');
|
|
% ylabel('幅度');
|
|
% title('回波+噪声信号');
|
|
|
|
|
|
%% 匹配滤波——按Tr划分
|
|
Srange = zeros(N, numP);
|
|
|
|
% A = generate_matrix(transpose(signal_t(1, 1: N)), 1);
|
|
|
|
count_fa=0;
|
|
|
|
for i = 1: numP
|
|
sr = signal_r_n(1, 1 + (i - 1) * N: i * N);
|
|
st = signal_t(1, 1 + (i - 1) * N: i * N);
|
|
|
|
% A = generate_matrix(transpose(st), 1);
|
|
% mf = A' * transpose(sr);
|
|
% filterred_rf_r = mf ./ multiple_r;
|
|
|
|
% 匹配滤波
|
|
rf_r_fft_conj = conj(fft(st));
|
|
filterred_rf_r = ifft(fft(sr) .* rf_r_fft_conj);
|
|
filterred_rf_r = filterred_rf_r ./ multiple_r;
|
|
|
|
Srange(:,i) = filterred_rf_r';
|
|
|
|
end
|
|
|
|
|
|
% figure(101)
|
|
% mesh(abs(Srange))
|
|
% title('按Tr进行匹配滤波结果')
|
|
|
|
%% R匹配滤波——分布验证
|
|
% Before MF
|
|
% a+bi
|
|
% a~N(0,sigma_n^2 / 2)
|
|
% b~N(0,sigma_n^2 / 2)
|
|
|
|
% After MF
|
|
% a+bi
|
|
% a~N(0,sigma_n^2 / 2 / multiple_r)
|
|
% b~N(0,sigma_n^2 / 2 / multiple_r)
|
|
% a^2 + b^2 ~ chi^2(2) * sigma_n^2 / 2 / multiple_r
|
|
|
|
% stat_R = abs(Srange).^2;
|
|
% P_fa = 0.1;
|
|
% kd = sigma_n^2 * chi2inv(1 - P_fa, 2) / 2 / multiple;
|
|
% sum(sum(stat_R>kd))/numel(stat_R)
|
|
|
|
%% 多普勒滤波
|
|
Srd = zeros(N, slow_len);
|
|
for i = 1: N
|
|
% for i = 1201: 1201
|
|
% Srd(i, :) = fftshift(fft([Srange(i, :),zeros(1,slow_len-numP)]));
|
|
% x_slow = [Srange(i, :),zeros(1,slow_len-numP)];
|
|
% % y' = F * x'
|
|
% y_slow2 = F * transpose(x_slow);
|
|
y_slow2 = transpose(F) * transpose(Srange(i, :))./ multiple_d;
|
|
% figure(444)
|
|
% plot(abs(y_slow2))
|
|
|
|
Srd(i, :) = fftshift(transpose(y_slow2));
|
|
end
|
|
|
|
%% D匹配滤波——分布验证
|
|
% Before MF
|
|
% a+bi
|
|
% a~N(0,sigma_n^2 / 2 / multiple)
|
|
% b~N(0,sigma_n^2 / 2 / multiple)
|
|
|
|
% After MF
|
|
% a+bi
|
|
% a~N(0,sigma_n^2 / 2 / multiple_r / multiple_d)
|
|
% b~N(0,sigma_n^2 / 2 / multiple_r / multiple_d)
|
|
% a^2 + b^2 ~ chi^2(2) * sigma_n^2 / 2 / multiple_r / multiple_d
|
|
|
|
% 检测
|
|
target_node_d = round(v1 / (c / fc * PRF / 2 / slow_len)) + 1 + slow_len / 2;
|
|
target_node_r = n_tau1 + 1;
|
|
|
|
stat_D = abs(Srd).^2;
|
|
H0_index = zeros(size(Srd));
|
|
H0_index(target_node_r-N_high:target_node_r+N_high, :) = 1;
|
|
H0_index(target_node_r, target_node_d) = 0;
|
|
H1_index = zeros(size(Srd));
|
|
H1_index(target_node_r, target_node_d) = 1;
|
|
|
|
kd = sigma_n^2 * chi2inv(1 - P_fa, 2) / 2 / multiple_r / multiple_d;
|
|
|
|
for cnt_h_th = 1: len_P_fa
|
|
P_fa_MF_cnt(cnt_SNR, cnt_h_th, rep) = sum(sum(stat_D(H0_index > 0) > kd(cnt_h_th))) / sum(sum(H0_index));
|
|
P_d_MF_cnt(cnt_SNR, cnt_h_th, rep) = sum(sum(stat_D(H1_index > 0) > kd(cnt_h_th))) / sum(sum(H1_index));
|
|
end
|
|
|
|
end
|
|
|
|
fprintf('%d\n', rep);
|
|
|
|
end
|
|
|
|
P_fa_MF = mean(P_fa_MF_cnt, 3);
|
|
P_d_MF = mean(P_d_MF_cnt, 3);
|
|
|
|
%% plot
|
|
figure(1);
|
|
loglog(P_fa,P_fa_MF(1,:), 'linewidth', 2);
|
|
% hold on;
|
|
% grid on;
|
|
% loglog(P_fa,P_fa_MF(2,:), 'linewidth', 2);
|
|
% loglog(P_fa,P_fa_MF(3,:), 'linewidth', 2);
|
|
% loglog(P_fa,P_fa_MF(4,:), 'linewidth', 2);
|
|
% loglog(P_fa,P_fa_MF(5,:), 'linewidth', 2);
|
|
% loglog(P_fa,P_fa_MF(6,:), 'linewidth', 2);
|
|
% legend('SNR = 0','SNR = 2','SNR = 4','SNR = 6','SNR = 8','SNR = 10');
|
|
xlabel('P_fa');
|
|
ylabel('Actual P_fa');
|
|
|
|
figure(2);
|
|
semilogx(P_fa,P_d_MF(1,:), 'linewidth', 2);
|
|
% hold on;
|
|
% grid on;
|
|
% semilogx(P_fa,P_d_MF(2,:), 'linewidth', 2);
|
|
% semilogx(P_fa,P_d_MF(3,:), 'linewidth', 2);
|
|
% semilogx(P_fa,P_d_MF(4,:), 'linewidth', 2);
|
|
% semilogx(P_fa,P_d_MF(5,:), 'linewidth', 2);
|
|
% semilogx(P_fa,P_d_MF(6,:), 'linewidth', 2);
|
|
% legend('SNR = 0','SNR = 2','SNR = 4','SNR = 6','SNR = 8','SNR = 10');
|
|
xlabel('P_fa');
|
|
ylabel('P_d');
|
|
|
|
distance_temp = 0: (c / fs / 2) : (Tr * c / 2 - c / fs / 2);
|
|
speed_temp = (-PRF / 2: PRF / slow_len: PRF / 2 - PRF / slow_len) * (c / fc) / 2 ;
|
|
|
|
% save test_Rmf_Dmf.mat ...
|
|
% distance_temp...
|
|
% speed_temp...
|
|
% Srd...
|
|
% Srange...
|
|
% tP...
|
|
% signal_t...
|
|
% signal_r...
|
|
% signal_r_n...
|
|
% F...
|
|
% slow_len;
|
|
|
|
save test_MC_Pfa_Rmf_Dmf.mat ...
|
|
SNR...
|
|
P_fa...
|
|
P_fa_MF...
|
|
P_d_MF...
|
|
sigma_n...
|
|
B...
|
|
Tp...
|
|
fs...
|
|
Ts...
|
|
K...
|
|
fc...
|
|
PRF...
|
|
Tr...
|
|
numP...
|
|
t...
|
|
tP...
|
|
slow_len; |