想法
参考论文Beam Focusing for Near-Field Multiuser MIMO Communications,可视化beam focusing效应
代码
完全不对,狗屁不通。
clc;
clear;
% 网格范围
D = 1; % 整个均匀平面阵列的孔径
lambda = 1e-2; % 波长0.01m,单位:米 30Ghz
N_d = floor(2 * D / lambda); % 垂直方向的阵元数 600
N_e = floor(2 * D / lambda); % 水平方向的阵元数 600
spacing = D / N_d;
x_range = -20:0.25:20; %* spacing - D / 2 ;
y_range = -20:0.25:20; %* spacing - D / 2 ;
% 生成网格四
[X, Y] = meshgrid(x_range, y_range);
% 计算每个点的信号强度
signal_strength = zeros(numel(x_range),numel(y_range));
for x_index = 1:numel(x_range)
x_b = x_range(x_index);
for y_index = 1:numel(y_range)
y_b = y_range(y_index);
signal_strength(x_index,y_index) = NearFieldFDA2D(x_b,y_b,D,lambda);
fprintf('测量点的横坐标%g,纵坐标%g\n',x_b,y_b);
end
end
% 绘制彩色图
figure;
imagesc(x_range, y_range, signal_strength);
title('xy平面近场信号强度图');
xlabel('X轴位置');
ylabel('Y轴位置');
colorbar; % 添加颜色条
函数
function SignalPower_xbyb = NearFieldFDA2D(x_b, y_b, D, lambda)
% 定义参数和变量
N_d = floor(2 * D / lambda); % 垂直方向的阵元数 600
N_e = floor(2 * D / lambda); % 水平方向的阵元数 600
spacing = D / N_d;
M = 2; % 用户数
b = 2; % Boresight gain参数
% x_b = 5; % 用户 Bob 的 x 坐标
% y_b = 5; % 用户 Bob 的 y 坐标
z_b = 0; % 用户 Bob 的 z 坐标
k = 2 * pi / lambda; % 波数
alpha_c = 1.2;
beta_c = 827.67;
% 生成信道系数
% rho = rand(N_d, N_e); % 元件位置
A_b = zeros(N_d, N_e);
A_w = zeros(N_d, N_e);
s = randn(N_d, N_e); % 模拟发送信号
SignalPower_xbyb = 0;
for i = 1:N_d
for l = 1:N_e
% rho(i, l) =
p_i_l = [(i - 1) * spacing - D / 2, 0, (l - 1) * spacing - D / 2];
% p_i_l = [0, (i - 1) * spacing - D / 2, (l - 1) * spacing - D / 2];
% 计算用户 Bob 的信道系数
p_b = [x_b, y_b, z_b];
Theta_i_l_b = calculateTheta(p_i_l, p_b);
distance_b_il = norm(p_b - p_i_l); % 计算距离 |p_m - p_i_l|
phase_b_il = exp(-1i * k * distance_b_il); % 计算相位 e^{-j*k*|p_m - p_i_l|}
A_b(i, l) = sqrt(F(Theta_i_l_b)) * (lambda / (4 * pi * norm(p_b - p_i_l))) * phase_b_il;
SignalPower_xbyb = SignalPower_xbyb + A_b(i, l);
end
end
SignalPower_xbyb = norm(SignalPower_xbyb);
end
% 计算辐射函数 F
function F_theta = F(Theta)
b = 2; % Boresight gain参数
if Theta >= 0 && Theta <= pi/2
F_theta = 2 * (b + 1) * cos(Theta)^b;
else
F_theta = 0;
end
end
% 计算信道方向角Theta
function Theta = calculateTheta(p_i_l, p)
delta_x = p(1) - p_i_l(1);
delta_y = p(2) - p_i_l(2);
delta_z = p(3) - p_i_l(3);
Theta = atan2(delta_z, sqrt(delta_x^2 + delta_y^2));
end
目前啥样
目前仅仅考虑了所有天线向各个方向等功率发送,也就是目前还没有针对某一个用户的beam focusing,这一点的实现需要后续专门设计优化算法,可以这么理解: 是beamforming矩阵 W \mathbf{W} W的存在让波束聚焦在一个具体的位置,目前代码中仅仿真了近场信道,波束赋形矩阵 W \mathbf{W} W等价于单位阵。
SVD预编码
如果发射天线是一个均匀线阵(Uniform Planar Array,UPA),并且接收天线数为1,我们可以使用SVD预编码来简化通信,并提高系统性能。在这种情况下,我们将信道矩阵分解为 ( U Σ V H \mathbf{U} \mathbf{\Sigma} \mathbf{V}^H UΣVH),其中 ( U \mathbf{U} U) 包含发射天线的方向信息,而 ( V \mathbf{V} V) 则包含接收天线的方向信息。
以下是一个简单的MATLAB示例代码,说明如何实现这一点:
% 设置信道参数
N_t = 4; % 发射天线数
N_r = 1; % 接收天线数
% 生成随机信道矩阵
H = randn(N_r, N_t);
% 奇异值分解 (SVD)
[U, S, V] = svd(H);
% 选择前 N_s 个奇异值,这里假设 N_s = 1
N_s = 1;
U_s = U(:, 1:N_s);
V_s = V(:, 1:N_s);
% 生成要发送的符号向量
x = [1; -1; 1; -1]; % 假设发送的符号向量
% 预编码
y = H * V_s * x; % 使用预编码矩阵进行预编码
% 打印预编码后的信号
disp('预编码后的信号:');
disp(y);
在这个示例中,我们首先生成了一个随机的信道矩阵 (H),然后进行了奇异值分解以获取 (U)、(\Sigma) 和 (V)。接着,我们选择了前 (N_s) 个奇异值对应的左右奇异向量,并将右奇异向量作为预编码矩阵 (V_s)。最后,我们生成了一个符号向量 (x) 并使用预编码矩阵对其进行预编码,得到发送信号 (y)。
矩阵向量化
将矩阵向量化是指将矩阵中的元素按照某种顺序排列成一个向量。在MATLAB中,可以使用(:)操作符来实现矩阵向量化。这个操作符会按列优先的顺序将矩阵中的元素排列成一个列向量。
例如,假设有一个 3x3 的矩阵 A:
A = [1, 2, 3; 4, 5, 6; 7, 8, 9];
使用(:)操作符,可以将矩阵 A 向量化:
A_vectorized = A(:);
结果将是一个包含矩阵 A 所有元素的列向量:
A_vectorized =
1
4
7
2
5
8
3
6
9
这样,矩阵中的元素按列优先的顺序排列成了一个列向量。
如果想按行优先的顺序进行向量化,可以使用reshape函数:
A_vectorized_row_major = reshape(A.', 1, []);
这将产生一个按行优先的向量。
总的来说,矩阵向量化可以通过(:)操作符或reshape函数来实现,具体取决于你希望的排列顺序。