✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
⛄ 内容介绍
阵列信号波达方向(Direction ofArrival,DOA)估计是阵列信号处理领域中主要研究内容之一,广泛应用于军事及民用领域。基于压缩感知理论的稀疏重构算法的阵列信号DOA估计具有高分辨率的特点,而且其特殊的重构方式使其具有天然解相干的能力。 针对窄带信号DOA估计问题,本文应用SSOMP(SVD-SOMP)DOA估计算法。
⛄ 部分代码
clc
clear all
close all
% # of antennas
Nt = 256;
Nr = 64;
sqrtNt = sqrt(Nt);
sqrtNr = sqrt(Nr);
% # of RF chains
NtRF = 4;
NrRF = 4;
% # of departed(arrived) rays
Ncl = 8;
Nray = 10;
% Angle Spread (std.)
std = pi/24;
% SNR
sigma_n = 1; % 0dB
rhodB = -40 : 4 : 0;
rho = 10.^(rhodB/10);
I1 = zeros(1000, length(rho)); % SS (Spatially Sparse) / Ns = 1
I2 = zeros(1000, length(rho)); % SS (Spatially Sparse) / Ns = 2
I3 = zeros(1000, length(rho)); % SS (Spatially Sparse) / Ns = 4
I4 = zeros(1000, length(rho)); % Unconstrained / Ns = 1
I5 = zeros(1000, length(rho)); % Unconstrained / Ns = 2
I6 = zeros(1000, length(rho)); % Unconstrained / Ns = 4
for i = 1 : length(rho)
for l = 1 : 1000
Atcell = ArrayResponse_cell(sqrtNt, Ncl, Nray, std);
Arcell = ArrayResponse_cell(sqrtNr, Ncl, Nray, std);
At = cell2mat(Atcell);
Ar = cell2mat(Arcell);
% CHANNEL Formation (Lines 39 ~ 51)
H = zeros(Nr, Nt);
for p = 1 : Ncl
Atmat = Atcell{1,p};
Armat = Arcell{1,p};
for q = 1 : Nray
alpha = sqrt(1/2) * (randn(1,1) + 1i * randn(1,1));
H = H + alpha * Armat(:,q) * Atmat(:,q)';
end
end
H = (sqrt(Nt * Nr) / norm(H, 'fro')) * H;
% SS - Spatial Sparse Precoding / Decoding
I1(l,i) = SS(1, NtRF, NrRF, H, At, Ar, sigma_n, rho(i));
I2(l,i) = SS(2, NtRF, NrRF, H, At, Ar, sigma_n, rho(i));
I3(l,i) = SS(4, NtRF, NrRF, H, At, Ar, sigma_n, rho(i));
% unconstrained - Unconstrained Precoding / Decoding
I4(l,i) = unconstrained (1, H, sigma_n, rho(i));
I5(l,i) = unconstrained (2, H, sigma_n, rho(i));
I6(l,i) = unconstrained (4, H, sigma_n, rho(i));
end
end
I1mean = mean(I1);
I2mean = mean(I2);
I3mean = mean(I3);
I4mean = mean(I4);
I5mean = mean(I5);
I6mean = mean(I6);
x = plot(rhodB, I1mean, rhodB, I2mean, rhodB, I3mean, rhodB, I4mean, rhodB, I5mean, rhodB, I6mean);
x(1).LineWidth = 2;
x(2).LineWidth = 2;
x(3).LineWidth = 2;
x(4).LineWidth = 2;
x(5).LineWidth = 2;
x(6).LineWidth = 2;
x(1).Marker = 'o';
x(2).Marker = 'o';
x(3).Marker = 'o';
x(4).Marker = 's';
x(5).Marker = 's';
x(6).Marker = 's';
legend('SSOMP Ns=1', 'SSOMP Ns=2', 'SSOMP Ns=4', 'Full-Digital Ns=1', 'Full-Digital Ns=2', 'Full-Digital Ns=4', 'Location', 'northwest');
title('SSOMP vs Full-Digital');
xlabel('SNR (dB)');
ylabel('Spectral Efficiency (bits/s/Hz)');
grid on;