matlab无线通信系统仿真


% 系统参数设置
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 的列向量,从而可以顺利执行符号级预编码操作了。