Files
2024-05-09 16:54:58 +08:00

380 lines
9.4 KiB
Matlab

clc
clear
% rng(1)
%% 参数设置
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; % 光速
%%
sigma_n = 0.1; % 噪声标准差
alpha_prop = 0.8; % 目标散射点强度
SNR = 50; % 信噪比(积累后信噪比)
% rou >= c / 2B = 15(m)
slow_len = 128; % 多普勒维采样点
% 是否有目标,0无目标,1有目标
has_target = 0;
%% 产生发射信号
% t=-Tp/2:1/fs:Tp/2-1/fs;
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
% signal_t = zeros(1, N);
% for i = 1:N_high
% tp = (i - 1) * (1 / fs);
% signal_t(1, i) = exp(1j*2*pi*(fc*tp+0.5*K*tp.^2));
% end
figure(1);
subplot(311)
plot(tP,real(signal_t));
xlabel('时间/t');ylabel('幅度');
title('发射信号');
%%
% 距离匹配滤波增益
multiple_r = signal_t(1, 1: N) * signal_t(1, 1: N)';
% 多普勒匹配滤波增益
F_ori = dftmtx(slow_len);
F = F_ori(1:numP,:);
multiple_d = F(:,1)' * F(:,1);
%% 设置目标 1
distance1 = 18000;
v1 = 187.5;
tau1 = distance1 * 2 / c; % 时延
n_tau1 = round(tau1 * fs); % 对应采样点
f_d1 = 2 * fc * v1 / c; % 多普勒频率
% 根据 SNR 设置回波散射强度
if has_target
alpha1 = alpha_prop * sqrt(10^(SNR/10) * sigma_n^2 / (multiple_r * multiple_d));
else
alpha1 = 0;
end
% 生成目标 1 回波
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 = (temp - 1) * (1 / fs);
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_r1 = zeros(1, N);
% for i = 1:N
% temp = i - n_tau1;
% if temp >= 1 && temp <= N_high
% signal_r1(1, i) = alpha1 * signal_t(1, temp);
% end
% end
%% 生成回波
signal_r = signal_r1;
figure(1);
subplot(312)
plot(tP, real(signal_r));
% plot(real(signal_r));
xlabel('时间/t');
ylabel('幅度');
title('回波信号');
%% 噪声处理
noise = random('Normal', 0, sigma_n/sqrt(2), 1, N * numP) + 1j * random('Normal', 0, sigma_n/sqrt(2), 1, N * numP);
signal_r_n = signal_r + noise;
figure(1);
subplot(313)
plot(tP, real(signal_r_n));
xlabel('时间/t');
ylabel('幅度');
title('回波+噪声信号');
%% 对回波求多普勒频移
% s_R_slow = zeros(1, slow_len);
%
% slow_freqs = ((0:slow_len - 1) .* (1 / Tr)) / slow_len;
%
% init_idx = 1;
% while abs(signal_r_n(init_idx)) == 0
% init_idx = init_idx + 1;
% end
%
% for i = 0:numP - 1
% s_R_slow(i + 1) = signal_r_n(init_idx + i * N + 1);
% end
%
% s_R_fft = fftshift(fft(s_R_slow));
% figure(3)
% plot(real(s_R_fft))
% [~, max_index_s_R] = max(s_R_fft);
% freq_s_R = slow_freqs(max_index_s_R);
%
% f_d = 1 / Tr - freq_s_R;
% v = f_d * c / (2 * (fc - B / 2))
%% 距离匹配滤波——按Tr划分
Srange = zeros(N, numP);
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;
% 匹配滤波
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;
% figure(2000)
% plot(abs(filterred_rf_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)
%% 多普勒滤波
% F_ori = dftmtx(slow_len);
% F = F_ori(1:numP,:);
% multiple_d = F(:,1)' * F(:,1);
F_inv = conj(F)/slow_len;
% ttttttt = F_inv * transpose(F);
% VAMP参数
delta_VAMP = 1e-6;
iter_max = 1000;
lambda_val = 0.05;
lambda = zeros(slow_len,1) + lambda_val;
% 放大到行正交
A = (sqrt(slow_len) * eye(numP)) * F_inv;
n = slow_len;
m = numP;
gamma = numP / slow_len;
% 设定虚警率
P_fa = [1e-4, 5e-4, 1e-3, 5e-3, 1e-2, 5e-2, 1e-1, 5e-1, 1];
count_Pfa_d = zeros(size(length(P_fa), N));
Srd = zeros(N, slow_len);
for i = 1: N
% for i = 1201: 1201
x_slow = Srange(i, :); % 慢时间采样
y = (sqrt(slow_len) * eye(numP)) * transpose(x_slow); % 进行相应放大
% LASSO 求解
% x_LASSO = FISTA(y, A, lambda_val, delta_VAMP);
[x_LASSO,y_d] = cVAMPro(y,A,lambda,delta_VAMP,iter_max);
% x_LASSO = x_LASSO ./ multiple_d ./ 2;
% CROD求去偏
rho_active = sum(abs(x_LASSO) > 1e-3)/n;
Q_hat = (gamma - rho_active)/(1 - rho_active);
Rho = sum((abs(x_LASSO) > 1e-3).* (2 - lambda./(Q_hat*abs(x_LASSO) + lambda))) / 2 / n;
diff = 1;
while(diff > 1e-4)
Rho_pre = Rho;
Rho = sum((abs(x_LASSO) > 1e-3).* (2 - lambda./((gamma-Rho)/(1-Rho)*abs(x_LASSO) + lambda))) / 2 / n;
diff = abs(Rho - Rho_pre);
end
Q_hat = (gamma-Rho)/(1-Rho);
x_d_CROD = x_LASSO + A'*(y - A*x_LASSO)/Q_hat;
% CROD求门限和检验统计量
RSS = sum(abs(y - A * x_LASSO).^2)/m;
chi = Rho*(1 - Rho)/(gamma - Rho);
if chi ~= 0
chi_temp = sqrt((chi+1)*(chi+1)-4*gamma*chi);
z = -(1 - chi + chi_temp) / (2*chi);
z_prime = -(1 - 2*gamma*chi + chi + chi_temp) / (2*chi*chi*chi_temp);
G_prime = (z + 1/chi);
G_wprime = (z_prime + 1/chi/chi);
chi_hat = gamma/2*G_wprime*RSS/(G_prime - chi*G_wprime)...
+ (G_prime*G_prime/2 - gamma/2*G_wprime)*sigma_n*sigma_n/(G_prime - chi*G_wprime);
else
G_prime = gamma;
G_wprime = gamma*(1-gamma);
chi_hat = gamma/2*G_wprime*RSS/(G_prime - chi*G_wprime)...
+ (G_prime*G_prime/2 - gamma/2*G_wprime)*sigma_n*sigma_n/(G_prime - chi*G_wprime);
end
sigma_CROD = sqrt(2*chi_hat) / Q_hat;
% 【经验分布、待解决】
sigma_CROD = sigma_CROD*0.895;
stat_CROD = abs(x_d_CROD / sigma_CROD).^2; % 统计量
h_thd = chi2inv(1 - P_fa, 2) / 2; % 门限
% 检测
% 目标点位
target_node_d = round(v1 / (c / fc * PRF / 2 / slow_len)) + 1;
target_node_r = n_tau1 + 1;
for j = 1:length(P_fa)
if i ~= target_node_r % 非目标点的距离慢采样结果(H0假设)
count_Pfa_d(j,i) = sum(stat_CROD > h_thd(j)) / slow_len;
else % 要考虑目标点的距离慢采样结果
stat_index = ones(size(stat_CROD));
stat_index(target_node_d) = 0; % 去掉目标点(H0假设不考虑目标点)
count_Pfa_d(j,i) = sum(stat_CROD(stat_index > 0) > h_thd(j)) / sum(stat_index);
end
end
% if i ~= target_node_r
% count_Pfa_d(i) = sum(stat_CROD > h_thd) / slow_len;
% else
% stat_index = ones(size(stat_CROD));
% stat_index(target_node_d) = 0;
% count_Pfa_d(i) = sum(stat_CROD(stat_index > 0) > h_thd) / sum(stat_index);
% end
% count_Pfa_d(i)
% figure(444)
% % 归一化
% plot(abs(x_d_CROD ./ multiple_d ./ 2))
% figure(555)
% % 统计量
% plot(stat_CROD)
Srd(i, :) = fftshift(transpose(x_d_CROD ./ multiple_d ./ 2));
end
%% DCS——分布验证
output = mean(count_Pfa_d,2); % 把所有多普勒维检测结果求平均得到总体虚警率
figure(4000)
loglog(P_fa,output)
xlabel('P_fa Set')
ylabel('Actual P_fa')
title('P_fa')
%%
% Srd_bf_mf = zeros(N, slow_len);
% for i = 1: N
% Srd_bf_mf(i, :) = fftshift(fft([Srange_bf_mf(i, :),zeros(1,slow_len-numP)]));
% end
% figure(102)
% mesh(abs(Srd))
% figure(105)
% mesh(abs(Srd_bf_mf))
% figure(1)
% subplot(414)
% t2 = 0: (c / fs / 2) : (Tr * numP * c / 2 - c / fs / 2);
% plot(tP, abs(filterred_rf_r) ./ N_high)
% % plot(abs(filterred_rf_r))
% xlabel('距离')
% title('匹配滤波')
% distance_temp = (0:N - 1) * fs * c / N / 2 / K;
%% RD 绘制
Srd = Srd';
lambda = c / fc;
% 40*lambda*PRF/2/128
distance_temp = 0: (c / fs / 2) : (Tr * c / 2 - c / fs / 2);
speed_temp = (-PRF / 2: PRF / slow_len: PRF / 2 - PRF / slow_len) * lambda / 2 ;
% speed_temp = (-numP / 2: numP / slow_len: numP / 2 - numP / slow_len) * lambda / Tr / numP / 2 ;
figure(5)
[X, Y] = meshgrid(distance_temp, speed_temp);
mesh(X, Y, abs(Srd));
xlabel('距离(m)');
ylabel('速度(m/s)');
zlabel('信号幅值');
title('2维RD图');
figure(6)
imagesc(distance_temp, speed_temp, abs(Srd));
title('Range-Doppler Image');
xlabel('Range (m)');
ylabel('Speed (m/s)');
set(gca, 'FontSize', 18);
set(gcf, 'position', [200, 300, 800, 600]);
set(gca,'fontsize',20,'fontname','Times');
% save test_Rmf_Dmf.mat ...
% distance_temp...
% speed_temp...
% Srd...
% Srange...
% tP...
% signal_t...
% signal_r...
% signal_r_n...
% F...
% slow_len;