MATLAB模拟不同MIMO-OFDM方案

模拟不同MIMO-OFDM方案的MATLAB代码示例,涵盖基本系统搭建、信道建模、性能对比(如BER、吞吐量)以及常见MIMO模式(如Alamouti、STBC)的实现。


1. MATLAB代码框架

clc; clear; close all;

%% 系统参数设置
params = struct();
params.N_subcarriers = 64;    % 子载波数量
params.cp_len = 16;           % 循环前缀长度
params.tx_antennas = 2;       % 发射天线数(可改为4/8)
params.rx_antennas = 2;       % 接收天线数
params.tx_power = 1;          % 发射功率(dBm)
params.snr_range = 0:5:30;    % SNR范围(dB)
params.mod_order = 4;         % 调制阶数(QPSK=4, 16-QAM=16)
params.mimo_scheme = 'alamouti'; % MIMO方案: 'almaouti', 'stbc', 'simo'

%% 生成随机QAM符号
data = randi([0 params.mod_order-1], params.N_subcarriers, 1);
tx_symbols = qammod(data, params.mod_order, 'UnitAveragePower', true);

%% MIMO预编码(根据方案选择)
if strcmp(params.mimo_scheme, 'almaouti')
    % Alamouti方案(2x1空时块编码)
    [tx_matrix, codebook] = alamouti_encoder(tx_symbols);
elseif strcmp(params.mimo_scheme, 'stbc')
    % 2x2 STBC编码
    tx_matrix = stbc_encoder(tx_symbols, 2);
else
    % SIMO(单天线发射,多天线接收)
    tx_matrix = reshape(tx_symbols, [], params.tx_antennas);
end

%% OFDM调制
tx_ofdm = ifft(tx_matrix, params.N_subcarriers);
tx_ofdm = [tx_ofdm(:, end-params.cp_len+1:end), tx_ofdm]; % 添加CP

%% 信道模型(瑞利衰落)
H = (1/sqrt(2))*(randn(params.rx_antennas, params.tx_antennas, params.N_subcarriers) + 1j*randn(params.rx_antennas, params.tx_antennas, params.N_subcarriers));

%% 信号传播与噪声
rx_signal = zeros(size(tx_ofdm));
for i = 1:params.N_subcarriers
    rx_signal(:, i) = H(:,:,i) * tx_ofdm(:, i);
end
rx_signal = awgn(rx_signal, params.tx_power + 30 - 10*log10(params.mod_order), 'measured');

%% MIMO检测与OFDM解调
rx_symbols = zeros(size(tx_symbols));
for i = 1:params.N_subcarriers
    % 去除CP
    rx_cp_removed = rx_signal(:, i)(params.cp_len+1:end);
    
    % OFDM解调
    rx_ofdm = fft(rx_cp_removed, params.N_subcarriers);
    
    % MIMO检测
    if strcmp(params.mimo_scheme, 'almaouti')
        rx_symbols(:, i) = alamouti_decoder(rx_ofdm, codebook);
    elseif strcmp(params.mimo_scheme, 'stbc')
        rx_symbols(:, i) = stbc_decoder(rx_ofdm);
    else
        rx_symbols(:, i) = rx_ofdm(:, 1); % SIMO直接接收
    end
end

%% 计算BER
rx_data = qamdemod(rx_symbols, params.mod_order, 'UnitAveragePower', true);
ber = sum(rx_data ~= data) / length(data);
disp(['SNR: ', num2str(mean(params.snr_range)), ' dB, BER: ', num2str(ber)]);

%% 绘图
figure;
semilogy(params.snr_range, ber, '-o');
grid on;
xlabel('SNR (dB)'); ylabel('BER');
title([params.mimo_scheme, ' MIMO-OFDM Performance']);

2. 关键函数实现

Alamouti编码器

function [tx_matrix, codebook] = alamouti_encoder(symbols)
    N = length(symbols);
    tx_matrix = zeros(2, N);
    tx_matrix(1,:) = symbols;
    tx_matrix(2,:) = zeros(1, N);
    codebook = [1 1; 1 -1]; % Alamouti编码矩阵
end

function decoded = alamouti_decoder(rx_matrix, codebook)
    decoded = (conj(codebook(1,1))*rx_matrix(1,:) + codebook(2,2)*conj(rx_matrix(2,:))) ...
              + 1j*(codebook(2,1)*conj(rx_matrix(1,:)) - codebook(1,2)*conj(rx_matrix(2,:)));
end

STBC编码器(2x2)

function tx_matrix = stbc_encoder(symbols, num_tx)
    N = length(symbols);
    tx_matrix = zeros(num_tx, 2*N);
    tx_matrix(1, 1:2:end) = symbols(1:2:end);
    tx_matrix(2, 1:2:end) = symbols(2:2:end);
    tx_matrix(1, 2:2:end) = conj(symbols(2:2:end));
    tx_matrix(2, 2:2:end) = -conj(symbols(1:2:end));
end

function decoded = stbc_decoder(rx_matrix)
    decoded = (rx_matrix(1,:) .* conj(rx_matrix(2,:)) + 1j*rx_matrix(2,:) .* conj(rx_matrix(1,:))) / 2;
end

模拟不同MIMO-OFDM方案的MATLAB代码

3. 可扩展方案对比

(1) 不同MIMO模式

  • Alamouti (2x1):时域空分复用,适合单流传输。
  • STBC (2x2):空间分集增益,牺牲速率换取可靠性。
  • SIMO (1x2):接收分集,无编码增益。

修改 params.mimo_scheme 即可切换方案。

(2) 不同调制方式

修改 params.mod_order(如 16 对应16-QAM)。

(3) 不同信道模型

替换信道生成代码,例如:

% 瑞利衰落信道(当前代码)
H = (1/sqrt(2))*(randn(...) + 1j*randn(...));

% Rician衰落信道
H = ricianchan(1e-3, 30, 10); % K=10

4. 性能分析指标

  • BER vs SNR:对比不同MIMO方案的误码率曲线。
  • 吞吐量:计算有效数据速率(调制阶数 × 天线数 × 子载波利用率)。
  • 频谱效率log2(mod_order) × N_subcarriers / (N_subcarriers + cp_len)

5. 扩展建议

  1. 添加信道估计:使用LS或MMSE估计信道。
  2. MIMO预编码:实现ZF、MMSE或ZF-SIC预编码。
  3. 大规模MIMO:扩展至64x64天线系统,分析波束成形效果。
  4. LDPC编码:结合信道编码提升性能。

通过调整参数和函数,可快速验证不同MIMO-OFDM方案的优劣。如需完整仿真,建议结合Simulink的Communications Toolbox进行链路级仿真。

posted @ 2025-06-26 17:44  u95900090  阅读(229)  评论(0)    收藏  举报