% 系统参数设置
num_antennas_tx = 4; % 发射机天线数量
num_antennas_rx = 4; % 接收机天线数量
num_reflect_elements = 64; % IRS反射元素数量
channel_model = 'rayleigh'; % 信道模型
noise_model = 'awgn'; % 噪声模型
snr_db_start = 0;
snr_db_end = 30;
% 生成发送符号序列
num_symbols = 1000; % 符号数量
symbol_set = [-1+1i, -1-1i, 1+1i, 1-1i] / sqrt(2); % 4-QAM 符号集合
symbols = randsample(symbol_set, num_symbols, true); % 随机生成发送符号序列
% 预编码技术选择
precoding_technique = 'symbol_level'; % 'symbol_level' 或 'no_symbol_level'
% 预编码
if strcmp(precoding_technique, 'symbol_level')
% 符号级预编码
x_precoded = zeros(num_antennas_tx, num_symbols); % 符号级预编码后的信号
for i = 1:num_symbols
x_s = symbols(i); % 当前发送符号
x_s = reshape(x_s, [], 1); % 将标量转换为列向量
% ZF预编码
snr = 10^(snr_db_start/10);
H = sqrt(1/2)*(randn(num_antennas_rx, num_antennas_tx) + 1j*randn(num_antennas_rx, num_antennas_tx));
F = H'/(H*H' + eye(num_antennas_rx)/snr);
x_precoded(:, i) = F *x_s;
end
else
% 无符号级预编码
x_uncoded = (randn(num_reflect_elements, num_symbols) + 1j*randn(num_reflect_elements, num_symbols)) * sqrt(num_reflect_elements) * sqrt(1/num_antennas_tx);
end
% 初始化误码率和信噪比变量
num_snr_points = 10;
snr_dbs = linspace(snr_db_start, snr_db_end, num_snr_points);
bers_symbol_level = zeros(1, num_snr_points);
bers_no_symbol_level = zeros(1, num_snr_points);
% 仿真
for snr_point_idx = 1:num_snr_points
% 当前信噪比点的dB值
snr_db = snr_dbs(snr_point_idx);
% 当前信噪比下的信噪比
snr = 10^(snr_db/10);
% 仿真多次以获得平均误码率
num_trials = 100;
errors_symbol_level = 0;
errors_no_symbol_level = 0;
for trial_idx = 1:num_trials
% 通过IRS传输信号
if strcmp(precoding_technique, 'symbol_level')
% 符号级预编码
H = sqrt(1/2)*(randn(num_antennas_rx, num_antennas_tx) + 1j*randn(num_antennas_rx, num_antennas_tx));
G = sqrt(1/2)*(randn(num_reflect_elements, num_antennas_rx) + 1j*randn(num_reflect_elements, num_antennas_rx));
y = G*H*x_precoded + sqrt(1/snr)*sqrt(num_reflect_elements)*sqrt(num_antennas_tx)*randn(num_reflect_elements, num_symbols);
else
% 无符号级预编码
H = sqrt(1/2)*(randn(num_antennas_rx, num_antennas_tx) + 1j*randn(num_antennas_rx, num_antennas_tx));
G = sqrt(1/2)*(randn(num_reflect_elements, num_antennas_rx) + 1j*randn(num_reflect_elements, num_antennas_rx));
y = G*H*x_uncoded + sqrt(1/snr)*sqrt(num_reflect_elements)*sqrt(num_antennas_tx)*randn(num_reflect_elements, num_symbols);
end
% 接收机
r = sqrt(1/2)*(randn(num_antennas_rx, num_symbols) + 1j*randn(num_antennas_rx, num_symbols));
if strcmp(channel_model, 'rayleigh')
h = sqrt(1/2)*(randn(num_antennas_rx, num_antennas_tx) + 1j*randn(num_antennas_rx, num_antennas_tx));
y = h'*y;
r = h'*r;
end
if strcmp(noise_model, 'awgn')
y = y + sqrt(1/snr)*r;
end
% 最大比合并(MRC)
y_mrc = sum(y, 1);
% 使用最小均方误差(MMSE)检测接收符号
if strcmp(precoding_technique, 'symbol_level')
% 符号级预编码
H_eff = G*H;
F = H_eff'/(H_eff*H_eff' + eye(num_antennas_rx)/snr);
x_hat = F*y_mrc;
else
% 无符号级预编码
H_eff = G;
W = H_eff'/(H_eff*H_eff' + eye(num_antennas_tx)/snr);
x_hat = x_uncoded(:)'*W'*y_mrc;
end
% 计算误码率
errors_symbol_level = errors_symbol_level + sum(x_hat ~= symbols);
errors_no_symbol_level = errors_no_symbol_level + sum(abs(x_hat - x_uncoded(:)) > 1e-10);
end
% 误码率计算
bers_symbol_level(snr_point_idx) = errors_symbol_level/(num_symbols*num_trials);
bers_no_symbol_level(snr_point_idx) = errors_no_symbol_level/(num_symbols*num_trials*length(symbol_set));
end
% 绘制误码率曲线
figure;
semilogy(snr_dbs, bers_symbol_level, 'bo-', 'linewidth', 2);
hold on;
semilogy(snr_dbs, bers_no_symbol_level/length(symbol_set), 'rs-', 'linewidth', 2);
grid on;
xlabel('信噪比 (dB)');
ylabel('误码率');
legend('符号级预编码', '无符号级预编码');
赋值具有的非单一 rhs 维度多于非单一下标数
出错 Untitled9 (line 37)
x_precoded(:, i) = F *x_s;
这个错误是由于 x_s 变量的维度不是 4\times 14×1,因此无法与 4\times 44×4 的 ZF 预编码矩阵 F 相乘,导致维度不匹配。在这段代码中,x_s 变量在生成符号序列时被定义为一个向量,但是在执行符号级预编码时却变成标量了,需要将其转换为列向量。因此,在第 27 行的符号生成代码中,可以使用下列语句将 x_s 变量转换为列向量:
x_s = reshape(x_s, [], 1);
这样做之后,x_s 变量就会被正确地赋值为一个 4\times 14×1 的列向量,从而可以顺利执行符号级预编码操作了。