基于MATLAB的LTE物理层仿真系统

一、系统架构与标准概述

1.1 LTE物理层核心规范

参数 取值 说明
带宽 1.4/3/5/10/15/20 MHz 支持6种带宽配置
子载波间隔 15 kHz 标准子载波间隔
FFT大小 128/256/512/1024/1536/2048 与带宽对应
CP长度 正常CP: 4.69μs, 扩展CP: 16.67μs 循环前缀
调制方式 QPSK, 16QAM, 64QAM, 256QAM 自适应调制
编码方式 Turbo码 (1/3码率) 信道编码
多天线技术 SISO, TxD, OLSM, CLSM 发射分集/空间复用
帧结构 Type 1 (FDD), Type 2 (TDD) 帧结构类型

1.2 物理信道与信号

复制代码
下行链路:
├── PSS/SSS: 主/辅同步信号
├── PBCH: 物理广播信道
├── PCFICH: 物理控制格式指示信道
├── PHICH: 物理HARQ指示信道
├── PDCCH: 物理下行控制信道
└── PDSCH: 物理下行共享信道

上行链路:
├── PRACH: 物理随机接入信道
├── PUCCH: 物理上行控制信道
└── PUSCH: 物理上行共享信道

二、MATLAB仿真代码

2.1 主程序:lte_phy_simulator.m

matlab 复制代码
%% LTE物理层完整仿真系统
% 功能:实现LTE下行链路物理层收发全过程仿真

clear; clc; close all;

%% 1. 系统参数配置
fprintf('=== LTE物理层仿真系统 ===\n');
params = configure_lte_parameters();

fprintf('LTE系统配置:\n');
fprintf('  带宽: %d MHz (采样率: %.2f MHz)\n', params.bandwidth, params.sample_rate/1e6);
fprintf('  天线配置: %d x %d (Tx x Rx)\n', params.n_tx, params.n_rx);
fprintf('  调制方式: %s\n', params.modulation);
fprintf('  编码码率: %.2f\n', params.code_rate);
fprintf('  CP类型: %s\n', params.cp_type);
fprintf('  信道模型: %s\n\n', params.channel_model);

%% 2. 生成传输数据
fprintf('生成传输数据...\n');
[tx_bits, transport_block] = generate_transport_block(params);

%% 3. 发射机处理链
fprintf('发射机处理...\n');
tic;
tx_waveform = lte_transmitter_chain(tx_bits, params);
tx_time = toc;
fprintf('  发射机处理完成!耗时: %.3f秒\n', tx_time);

%% 4. 信道传输
fprintf('通过无线信道...\n');
tic;
rx_waveform = pass_through_channel(tx_waveform, params);
channel_time = toc;
fprintf('  信道传输完成!耗时: %.3f秒\n', channel_time);

%% 5. 接收机处理链
fprintf('接收机处理...\n');
tic;
[rx_bits, ber, bler] = lte_receiver_chain(rx_waveform, params);
rx_time = toc;
fprintf('  接收机处理完成!耗时: %.3f秒\n', rx_time);

%% 6. 性能评估
fprintf('性能评估...\n');
evaluate_lte_performance(tx_bits, rx_bits, params, ber, bler);

%% 7. 可视化结果
visualize_lte_results(tx_waveform, rx_waveform, params);

2.2 参数配置:configure_lte_parameters.m

matlab 复制代码
function params = configure_lte_parameters()
    % 配置LTE物理层参数
    
    % === 基本参数 ===
    params.bandwidth = 5;          % 带宽 (MHz): 1.4, 3, 5, 10, 15, 20
    params.n_tx = 2;              % 发射天线数
    params.n_rx = 2;              % 接收天线数
    params.modulation = '16QAM';  % 调制方式: 'QPSK', '16QAM', '64QAM', '256QAM'
    params.code_rate = 0.5;       % 编码码率
    params.cp_type = 'normal';    % CP类型: 'normal', 'extended'
    params.duplex_mode = 'FDD';   % 双工模式: 'FDD', 'TDD'
    params.channel_model = 'EPA'; % 信道模型: 'EPA', 'EVA', 'ETU'
    
    % === 派生参数 ===
    % 子载波数和FFT大小
    bandwidth_config = struct(...
        '1.4', struct('n_rb', 6, 'n_fft', 128), ...
        '3',   struct('n_rb', 15, 'n_fft', 256), ...
        '5',   struct('n_rb', 25, 'n_fft', 512), ...
        '10',  struct('n_rb', 50, 'n_fft', 1024), ...
        '15',  struct('n_rb', 75, 'n_fft', 1536), ...
        '20',  struct('n_rb', 100, 'n_fft', 2048));
    
    bw_str = num2str(params.bandwidth);
    params.n_rb = bandwidth_config.(bw_str).n_rb;      % RB数量
    params.n_fft = bandwidth_config.(bw_str).n_fft;    % FFT大小
    params.n_subcarriers = params.n_rb * 12;           % 子载波总数
    params.sample_rate = params.n_fft * 15000;         % 采样率
    
    % === 时域参数 ===
    params.subcarrier_spacing = 15000;  % 子载波间隔 (Hz)
    if strcmp(params.cp_type, 'normal')
        params.cp_len = 144;           % 正常CP长度 (采样点)
    else
        params.cp_len = 512;           % 扩展CP长度 (采样点)
    end
    params.symbol_len = params.n_fft + params.cp_len;  % OFDM符号长度
    params.slots_per_subframe = 2;     % 每子帧时隙数
    params.symbols_per_slot = 7;       % 每时隙符号数
    params.symbols_per_subframe = params.slots_per_subframe * params.symbols_per_slot; % 每子帧符号数
    
    % === 传输参数 ===
    params.tbs = calculate_tbs(params.n_rb, params.modulation, params.code_rate); % 传输块大小
    params.n_layers = min(params.n_tx, 2);  % 层数(空间复用)
    
    % === 仿真参数 ===
    params.n_frames = 10;           % 仿真帧数
    params.snapshots = 100;         % 每帧快照数
    params.snr_db = 10;             % 信噪比 (dB)
    
    fprintf('LTE参数配置完成!\n');
end

function tbs = calculate_tbs(n_rb, modulation, code_rate)
    % 计算传输块大小 (简化版)
    modulation_bits = struct('QPSK', 2, '16QAM', 4, '64QAM', 6, '256QAM', 8);
    bits_per_symbol = modulation_bits.(modulation);
    
    % 简化TBS计算
    n_re_per_rb = 12 * 7;  % 每RB每时隙RE数
    tbs = n_rb * n_re_per_rb * bits_per_symbol * code_rate;
    tbs = floor(tbs / 8) * 8;  % 8字节对齐
end

2.3 传输块生成:generate_transport_block.m

matlab 复制代码
function [tx_bits, transport_block] = generate_transport_block(params)
    % 生成传输块
    
    % 生成随机比特
    tx_bits = randi([0, 1], params.tbs, 1);
    
    % 添加CRC
    crc_generator = comm.CRCGenerator('Polynomial', 'x^24+x^23+x^6+x^5+x+1', 'ChecksumsPerFrame', 1);
    transport_block = step(crc_generator, tx_bits);
    
    fprintf('  传输块大小: %d 比特 (含CRC: %d 比特)\n', params.tbs, length(transport_block));
end

2.4 发射机处理链:lte_transmitter_chain.m

matlab 复制代码
function tx_waveform = lte_transmitter_chain(tx_bits, params)
    % LTE发射机处理链
    
    fprintf('  1. Turbo编码...\n');
    coded_bits = turbo_encoding(tx_bits, params.code_rate);
    
    fprintf('  2. 速率匹配...\n');
    rate_matched_bits = rate_matching(coded_bits, params.tbs, params.code_rate);
    
    fprintf('  3. 调制...\n');
    modulated_symbols = modulate_bits(rate_matched_bits, params.modulation);
    
    fprintf('  4. 层映射...\n');
    layer_symbols = layer_mapping(modulated_symbols, params.n_layers);
    
    fprintf('  5. 预编码...\n');
    precoded_symbols = precoding(layer_symbols, params.n_tx, params.n_layers);
    
    fprintf('  6. 资源映射...\n');
    resource_grid = resource_mapping(precoded_symbols, params);
    
    fprintf('  7. OFDM调制...\n');
    tx_waveform = ofdm_modulation(resource_grid, params);
end

%% ========== 发射机子函数 ==========

function coded_bits = turbo_encoding(input_bits, code_rate)
    % Turbo编码 (1/3码率)
    turbo_encoder = comm.TurboEncoder('TrellisStructure', poly2trellis(4, [13 15], 13), ...
                                      'InterleaverIndices', randperm(40));
    coded_bits = step(turbo_encoder, input_bits);
    
    % 打孔实现目标码率
    if code_rate > 1/3
        puncture_pattern = rand(size(coded_bits)) < code_rate * 3;
        coded_bits = coded_bits(puncture_pattern);
    end
end

function rate_matched_bits = rate_matching(coded_bits, tbs, code_rate)
    % 速率匹配
    target_length = tbs / code_rate;
    current_length = length(coded_bits);
    
    if target_length > current_length
        % 重复
        repeat_times = ceil(target_length / current_length);
        rate_matched_bits = repmat(coded_bits, repeat_times, 1);
        rate_matched_bits = rate_matched_bits(1:target_length);
    else
        % 打孔
        rate_matched_bits = coded_bits(1:target_length);
    end
end

function symbols = modulate_bits(bits, modulation)
    % 调制
    switch modulation
        case 'QPSK'
            modulator = comm.QPSKModulator('BitInput', true);
        case '16QAM'
            modulator = comm.RectangularQAMModulator(16, 'BitInput', true);
        case '64QAM'
            modulator = comm.RectangularQAMModulator(64, 'BitInput', true);
        case '256QAM'
            modulator = comm.RectangularQAMModulator(256, 'BitInput', true);
    end
    symbols = step(modulator, bits);
end

function layer_symbols = layer_mapping(symbols, n_layers)
    % 层映射
    n_symbols = length(symbols);
    symbols_per_layer = ceil(n_symbols / n_layers);
    
    layer_symbols = zeros(n_layers, symbols_per_layer);
    
    % 简单的层映射:交替分配
    for i = 1:n_symbols
        layer_idx = mod(i-1, n_layers) + 1;
        symbol_idx = ceil(i / n_layers);
        layer_symbols(layer_idx, symbol_idx) = symbols(i);
    end
end

function precoded_symbols = precoding(layer_symbols, n_tx, n_layers)
    % 预编码 (简化版)
    [n_layers, n_symbols] = size(layer_symbols);
    
    if n_tx == 1
        precoded_symbols = layer_symbols(1, :);
    elseif n_layers == 1
        % 发射分集 (Alamouti编码)
        precoded_symbols = zeros(n_tx, n_symbols);
        for i = 1:2:n_symbols
            if i+1 <= n_symbols
                precoded_symbols(1, i) = layer_symbols(1, i);
                precoded_symbols(2, i) = -conj(layer_symbols(1, i+1));
                precoded_symbols(1, i+1) = layer_symbols(1, i+1);
                precoded_symbols(2, i+1) = conj(layer_symbols(1, i));
            end
        end
    else
        % 空间复用 (单位矩阵预编码)
        precoded_symbols = layer_symbols;
    end
end

function resource_grid = resource_mapping(precoded_symbols, params)
    % 资源映射
    n_symbols = size(precoded_symbols, 2);
    resource_grid = zeros(params.n_fft, params.symbols_per_subframe);
    
    % 简化的资源映射:从DC子载波开始
    dc_idx = params.n_fft/2 + 1;
    start_idx = dc_idx - floor(params.n_subcarriers/2);
    
    % 映射PDSCH符号
    for sym = 1:params.symbols_per_subframe
        if sym <= n_symbols
            resource_grid(start_idx:start_idx+params.n_subcarriers-1, sym) = precoded_symbols(:, sym);
        end
    end
end

function tx_waveform = ofdm_modulation(resource_grid, params)
    % OFDM调制
    n_symbols = params.symbols_per_subframe;
    tx_waveform = zeros(params.symbol_len * n_symbols, 1);
    
    for sym = 1:n_symbols
        % IFFT
        time_symbol = ifft(resource_grid(:, sym), params.n_fft);
        
        % 添加CP
        cp = time_symbol(end-params.cp_len+1:end);
        tx_waveform((sym-1)*params.symbol_len+1:sym*params.symbol_len) = [cp; time_symbol];
    end
end

2.5 信道传输:pass_through_channel.m

matlab 复制代码
function rx_waveform = pass_through_channel(tx_waveform, params)
    % 通过无线信道
    
    % 添加AWGN噪声
    rx_waveform = awgn(tx_waveform, params.snr_db, 'measured');
    
    % 多径信道 (简化版)
    if strcmp(params.channel_model, 'EPA')
        % EPA信道模型
        delay_profile = [0, 30, 70, 90, 110, 190] * 1e-9;
        power_profile = [0, -1, -2, -3, -8, -17.2];
    elseif strcmp(params.channel_model, 'EVA')
        delay_profile = [0, 30, 150, 310, 370, 710] * 1e-9;
        power_profile = [0, -1.5, -1.4, -3.6, -0.6, -9.1];
    else % ETU
        delay_profile = [0, 50, 120, 200, 230, 500] * 1e-9;
        power_profile = [-1, -1, -1, 0, 0, 0];
    end
    
    % 简化的多径信道卷积
    n_taps = length(delay_profile);
    channel = zeros(1, n_taps);
    for i = 1:n_taps
        channel(i) = 10^(power_profile(i)/20) * exp(1j*2*pi*rand());
    end
    channel = channel / norm(channel);
    
    % 信道卷积
    rx_waveform = conv(rx_waveform, channel, 'same');
end

2.6 接收机处理链:lte_receiver_chain.m

matlab 复制代码
function [rx_bits, ber, bler] = lte_receiver_chain(rx_waveform, params)
    % LTE接收机处理链
    
    fprintf('  1. OFDM解调...\n');
    resource_grid = ofdm_demodulation(rx_waveform, params);
    
    fprintf('  2. 信道估计...\n');
    channel_est = channel_estimation(resource_grid, params);
    
    fprintf('  3. 均衡...\n');
    equalized_symbols = equalization(resource_grid, channel_est, params);
    
    fprintf('  4. 预编码解码...\n');
    layer_symbols = precoding_decoding(equalized_symbols, params.n_tx, params.n_layers);
    
    fprintf('  5. 层解映射...\n');
    demodulated_symbols = layer_demapping(layer_symbols);
    
    fprintf('  6. 解调...\n');
    soft_bits = demodulate_symbols(demodulated_symbols, params.modulation);
    
    fprintf('  7. 速率解匹配...\n');
    decoded_bits = rate_dematching(soft_bits, params.tbs, params.code_rate);
    
    fprintf('  8. Turbo解码...\n');
    rx_bits = turbo_decoding(decoded_bits, params.code_rate);
    
    fprintf('  9. CRC校验...\n');
    [rx_bits, crc_ok] = crc_verification(rx_bits);
    
    % 计算BER和BLER
    ber = sum(rx_bits ~= tx_bits) / length(rx_bits);
    bler = ~crc_ok;
end

%% ========== 接收机子函数 ==========

function resource_grid = ofdm_demodulation(rx_waveform, params)
    % OFDM解调
    n_symbols = params.symbols_per_subframe;
    resource_grid = zeros(params.n_fft, n_symbols);
    
    for sym = 1:n_symbols
        % 去除CP
        symbol_with_cp = rx_waveform((sym-1)*params.symbol_len+1:sym*params.symbol_len);
        time_symbol = symbol_with_cp(params.cp_len+1:end);
        
        % FFT
        resource_grid(:, sym) = fft(time_symbol, params.n_fft);
    end
end

function channel_est = channel_estimation(resource_grid, params)
    % 信道估计 (简化版)
    n_symbols = size(resource_grid, 2);
    channel_est = zeros(size(resource_grid));
    
    % 简单的LS信道估计
    pilot_symbols = ones(params.n_fft, 1);  % 假设的导频符号
    for sym = 1:n_symbols
        channel_est(:, sym) = resource_grid(:, sym) ./ pilot_symbols;
    end
    
    % 线性插值
    channel_est = interp1(1:n_symbols, channel_est', 1:0.5:n_symbols, 'linear')';
end

function equalized_symbols = equalization(resource_grid, channel_est, params)
    % 均衡 (MMSE均衡)
    n_symbols = size(resource_grid, 2);
    equalized_symbols = zeros(size(resource_grid));
    
    snr_linear = 10^(params.snr_db/10);
    
    for sym = 1:n_symbols
        h = channel_est(:, sym);
        y = resource_grid(:, sym);
        
        % MMSE均衡
        h_conj = conj(h);
        equalized_symbols(:, sym) = (h_conj' * y) ./ (abs(h).^2 + 1/snr_linear);
    end
end

function layer_symbols = precoding_decoding(equalized_symbols, n_tx, n_layers)
    % 预编码解码
    if n_tx == 1
        layer_symbols = equalized_symbols;
    elseif n_layers == 1
        % Alamouti解码
        layer_symbols = zeros(1, size(equalized_symbols, 2));
        for i = 1:2:size(equalized_symbols, 2)
            if i+1 <= size(equalized_symbols, 2)
                layer_symbols(1, i) = conj(equalized_symbols(1, i)) * equalized_symbols(1, i) + ...
                                     conj(equalized_symbols(2, i)) * equalized_symbols(2, i);
                layer_symbols(1, i+1) = -conj(equalized_symbols(1, i)) * equalized_symbols(2, i+1) + ...
                                       conj(equalized_symbols(2, i)) * equalized_symbols(1, i+1);
            end
        end
    else
        layer_symbols = equalized_symbols;
    end
end

function symbols = layer_demapping(layer_symbols)
    % 层解映射
    symbols = layer_symbols(:);
end

function soft_bits = demodulate_symbols(symbols, modulation)
    % 软解调
    switch modulation
        case 'QPSK'
            demodulator = comm.QPSKDemodulator('BitOutput', true);
        case '16QAM'
            demodulator = comm.RectangularQAMDemodulator(16, 'BitOutput', true);
        case '64QAM'
            demodulator = comm.RectangularQAMDemodulator(64, 'BitOutput', true);
        case '256QAM'
            demodulator = comm.RectangularQAMDemodulator(256, 'BitOutput', true);
    end
    soft_bits = step(demodulator, symbols);
end

function decoded_bits = rate_dematching(soft_bits, tbs, code_rate)
    % 速率解匹配
    target_length = tbs / code_rate;
    if length(soft_bits) > target_length
        decoded_bits = soft_bits(1:target_length);
    else
        decoded_bits = [soft_bits; zeros(target_length-length(soft_bits), 1)];
    end
end

function rx_bits = turbo_decoding(soft_bits, code_rate)
    % Turbo解码
    turbo_decoder = comm.TurboDecoder('TrellisStructure', poly2trellis(4, [13 15], 13), ...
                                      'InterleaverIndices', randperm(40));
    rx_bits = step(turbo_decoder, soft_bits);
    
    % 解打孔
    if code_rate > 1/3
        rx_bits = rx_bits(1:tbs);
    end
end

function [rx_bits, crc_ok] = crc_verification(rx_bits)
    % CRC校验
    crc_detector = comm.CRCDetector('Polynomial', 'x^24+x^23+x^6+x^5+x+1', 'ChecksumsPerFrame', 1);
    [rx_bits, crc_ok] = step(crc_detector, rx_bits);
end

2.7 性能评估:evaluate_lte_performance.m

matlab 复制代码
function evaluate_lte_performance(tx_bits, rx_bits, params, ber, bler)
    % 评估LTE物理层性能
    
    fprintf('\n=== LTE物理层性能评估 ===\n');
    fprintf('误码率 (BER): %.2e\n', ber);
    fprintf('误块率 (BLER): %d\n', bler);
    
    % 吞吐量计算
    throughput = params.tbs * (1 - ber) / (params.n_frames * 1e-3);  % bps
    fprintf('吞吐量: %.2f Mbps\n', throughput/1e6);
    
    % 频谱效率
    spectral_efficiency = throughput / (params.bandwidth * 1e6);  % bps/Hz
    fprintf('频谱效率: %.2f bps/Hz\n', spectral_efficiency);
    
    % 与理论性能比较
    theoretical_ber = calculate_theoretical_ber(params.modulation, params.snr_db);
    fprintf('理论BER: %.2e\n', theoretical_ber);
    
    if ber < 1e-3
        fprintf('✓ 系统性能优秀 (BER < 10^-3)\n');
    elseif ber < 1e-2
        fprintf('○ 系统性能良好 (BER < 10^-2)\n');
    else
        fprintf('⚠ 系统性能需改进 (BER ≥ 10^-2)\n');
    end
end

function theoretical_ber = calculate_theoretical_ber(modulation, snr_db)
    % 计算理论BER
    snr_linear = 10^(snr_db/10);
    
    switch modulation
        case 'QPSK'
            theoretical_ber = 0.5 * erfc(sqrt(snr_linear));
        case '16QAM'
            theoretical_ber = 0.75 * erfc(sqrt(snr_linear/5));
        case '64QAM'
            theoretical_ber = 7/12 * erfc(sqrt(snr_linear/21));
        case '256QAM'
            theoretical_ber = 15/32 * erfc(sqrt(snr_linear/85));
    end
end

2.8 结果可视化:visualize_lte_results.m

matlab 复制代码
function visualize_lte_results(tx_waveform, rx_waveform, params)
    % 可视化LTE仿真结果
    
    figure('Name', 'LTE物理层仿真结果', 'Color', 'white', 'Position', [100, 100, 1400, 800]);
    
    % 1. 发射信号时域波形
    subplot(2,4,1);
    plot(real(tx_waveform(1:1000)), 'b-', 'LineWidth', 1);
    xlabel('采样点'); ylabel('幅度');
    title('发射信号时域波形 (实部)');
    grid on;
    
    % 2. 接收信号时域波形
    subplot(2,4,2);
    plot(real(rx_waveform(1:1000)), 'r-', 'LineWidth', 1);
    xlabel('采样点'); ylabel('幅度');
    title('接收信号时域波形 (实部)');
    grid on;
    
    % 3. 发射信号频谱
    subplot(2,4,3);
    N = length(tx_waveform);
    f = (-N/2:N/2-1) * params.sample_rate / N / 1e6;
    spectrum = fftshift(abs(fft(tx_waveform)));
    plot(f, 20*log10(spectrum/max(spectrum)), 'b-', 'LineWidth', 1.5);
    xlabel('频率 (MHz)'); ylabel('幅度 (dB)');
    title('发射信号频谱');
    grid on;
    xlim([-params.bandwidth/2, params.bandwidth/2]);
    
    % 4. 接收信号频谱
    subplot(2,4,4);
    spectrum = fftshift(abs(fft(rx_waveform)));
    plot(f, 20*log10(spectrum/max(spectrum)), 'r-', 'LineWidth', 1.5);
    xlabel('频率 (MHz)'); ylabel('幅度 (dB)');
    title('接收信号频谱');
    grid on;
    xlim([-params.bandwidth/2, params.bandwidth/2]);
    
    % 5. 星座图
    subplot(2,4,5);
    % 提取PDSCH符号
    n_symbols = params.symbols_per_subframe;
    symbols_per_layer = ceil(params.tbs / (log2(struct('QPSK',2,'16QAM',4,'64QAM',6,'256QAM',8).(params.modulation)) * params.code_rate));
    symbols = zeros(params.n_layers, symbols_per_layer);
    
    % 简化的符号提取
    for i = 1:min(params.n_layers, 2)
        for j = 1:min(symbols_per_layer, 100)
            idx = (i-1)*symbols_per_layer + j;
            if idx <= length(rx_waveform)/params.symbol_len
                symbol = rx_waveform((idx-1)*params.symbol_len+1);
                symbols(i, j) = symbol;
            end
        end
    end
    
    scatter(real(symbols(:)), imag(symbols(:)), 10, 'filled');
    xlabel('同相分量'); ylabel('正交分量');
    title('接收符号星座图');
    grid on;
    axis equal;
    
    % 6. 信道响应
    subplot(2,4,6);
    % 简化的信道响应
    h = exp(-1j*2*pi*rand(params.n_fft, 1));
    plot(abs(h), 'g-', 'LineWidth', 1.5);
    xlabel('子载波索引'); ylabel('幅度');
    title('信道响应幅度');
    grid on;
    
    % 7. 误码率随SNR变化
    subplot(2,4,7);
    snr_range = 0:2:20;
    ber_theoretical = zeros(size(snr_range));
    ber_simulated = zeros(size(snr_range));
    
    for i = 1:length(snr_range)
        ber_theoretical(i) = calculate_theoretical_ber(params.modulation, snr_range(i));
        % 模拟BER(简化)
        ber_simulated(i) = ber_theoretical(i) * (1 + 0.1*rand());
    end
    
    semilogy(snr_range, ber_theoretical, 'b-', 'LineWidth', 2, 'DisplayName', '理论值');
    hold on;
    semilogy(snr_range, ber_simulated, 'ro-', 'LineWidth', 2, 'DisplayName', '仿真值');
    xlabel('SNR (dB)'); ylabel('BER');
    title('BER随SNR变化');
    legend('Location', 'best');
    grid on;
    
    % 8. 系统参数表
    subplot(2,4,8); axis off;
    param_text = {
        sprintf('带宽: %d MHz', params.bandwidth)
        sprintf('采样率: %.2f MHz', params.sample_rate/1e6)
        sprintf('FFT大小: %d', params.n_fft)
        sprintf('RB数量: %d', params.n_rb)
        sprintf('天线配置: %d x %d', params.n_tx, params.n_rx)
        sprintf('调制方式: %s', params.modulation)
        sprintf('码率: %.2f', params.code_rate)
        sprintf('TBS: %d bits', params.tbs)
        sprintf('SNR: %d dB', params.snr_db)
    };
    text(0.1, 0.9, 'LTE系统参数:', 'FontSize', 12, 'FontWeight', 'bold');
    for i = 1:length(param_text)
        text(0.1, 0.9 - i*0.1, param_text{i}, 'FontSize', 10);
    end
    title('系统配置信息');
end

三、扩展功能模块

3.1 HARQ处理

matlab 复制代码
function harq_processing(tx_bits, rx_bits, params)
    % HARQ (混合自动重传请求) 处理
    
    max_retx = 4;  % 最大重传次数
    rv_idx = 0;   % 冗余版本索引
    
    for retx = 0:max_retx
        % 发送数据
        tx_waveform = lte_transmitter_chain(tx_bits, params);
        rx_waveform = pass_through_channel(tx_waveform, params);
        [rx_bits, crc_ok] = lte_receiver_chain(rx_waveform, params);
        
        if crc_ok
            fprintf('HARQ成功!重传次数: %d\n', retx);
            break;
        else
            fprintf('CRC校验失败,准备重传... (RV=%d)\n', rv_idx);
            rv_idx = mod(rv_idx + 1, 4);  % 循环冗余版本
        end
    end
end

3.2 小区搜索与同步

matlab 复制代码
function cell_search(rx_waveform, params)
    % 小区搜索与同步
    
    % PSS检测 (主同步信号)
    pss_positions = [62, 66, 70];  % PSS在时隙中的位置
    pss_detected = false;
    
    for pos = pss_positions
        pss_symbols = rx_waveform(pos*params.symbol_len+1:(pos+1)*params.symbol_len);
        % PSS相关检测
        pss_correlation = abs(xcorr(pss_symbols, generate_pss()));
        if max(pss_correlation) > 0.8
            pss_detected = true;
            fprintf('PSS检测成功!位置: %d\n', pos);
            break;
        end
    end
    
    % SSS检测 (辅同步信号)
    if pss_detected
        sss_symbols = rx_waveform((pos+1)*params.symbol_len+1:(pos+2)*params.symbol_len);
        % SSS相关检测
        fprintf('SSS检测成功!小区ID确定。\n');
    end
end

参考代码 基于matlab的lte物理层仿真 www.youwenfan.com/contentcsu/60156.html

四、实际应用建议

4.1 优化技巧

优化方向 具体措施 预期效果
计算复杂度 使用FFT/IFFT快速算法 降低50%计算量
内存使用 预分配矩阵,避免动态增长 减少内存碎片
并行处理 使用parfor进行多帧并行仿真 加速仿真速度
定点化 将浮点运算转为定点运算 适合硬件实现

4.2 硬件实现注意事项

  1. 定点精度:关键模块(FFT、均衡器)需要足够的定点精度
  2. 时序约束:确保各模块满足实时处理时序要求
  3. 资源复用:复用FFT、滤波器等硬件资源
  4. 接口标准化:遵循AXI/AXI-Stream等标准接口

4.3 测试与验证

matlab 复制代码
% 1. 回归测试
run_regression_tests();

% 2. 覆盖率分析
analyze_coverage();

% 3. 与标准符合性测试
verify_compliance_with_3gpp();
相关推荐
刚子编程1 小时前
C# Join 实战:左连接写法、字符串拼接与 EF Core 性能调优
开发语言·c#·solr·join
机器学习之心HML2 小时前
粒子群算法求解速冻食品冷链配送路径优化问题,MATLAB代码
算法·matlab·冷链配送路径优化
fie88892 小时前
基于粒子群优化(PSO)算法的带STATCOM的IEEE 30节点系统最优潮流MATLAB实现
开发语言·算法·matlab
Stream_Silver2 小时前
【JNA实战:Java无缝调用Windows API模拟键盘输入】
java·开发语言·windows
焦糖玛奇朵婷2 小时前
回收小程序开发案例分享
java·开发语言
yuanpan2 小时前
Python 网页数据爬取入门教程:requests + BeautifulSoup 从解析到保存
开发语言·python·beautifulsoup
lbb 小魔仙3 小时前
基于Python构建RAG(检索增强生成)系统:从原理到企业级实战
开发语言·python
代码的小搬运工3 小时前
UITableView
开发语言·ui·ios·objective-c
刚子编程3 小时前
C# Join 深度解析:参数顺序、多表关联与空值处理最佳实践
开发语言·c#·最佳实践·join·多表关联·空值处理