第【130】期--OFDM系统中LS、MMSE与DFT信道估计方法的仿真--matlab完整代码

关注我,追更更多通信仿真代码!

文章目录

    • 摘要
    • [1 引言](#1 引言)
    • [2 OFDM系统与信道模型](#2 OFDM系统与信道模型)
      • [2.1 OFDM基本原理](#2.1 OFDM基本原理)
      • [2.2 无线信道模](#2.2 无线信道模)
    • [3 信道估计方法](#3 信道估计方法)
      • [3.1 LS信道估计](#3.1 LS信道估计)
      • [3.2 基于插值的信道估计](#3.2 基于插值的信道估计)
      • [3.3 Comb-DFT信道估计](#3.3 Comb-DFT信道估计)
      • [3.4 MMSE信道估计及平滑退化](#3.4 MMSE信道估计及平滑退化)
    • [4 仿真设计与分析](#4 仿真设计与分析)
      • [4.1 参数设置](#4.1 参数设置)
      • [4.2 仿真结果分析](#4.2 仿真结果分析)
      • [4.3 部分代码](#4.3 部分代码)
    • [5 总结](#5 总结)

摘要

正交频分复用(OFDM)技术因其高频谱效率和较强的抗多径能力,被广泛应用于现代无线通信系统。然而,无线信道的频率选择性和时间选择性会严重影响OFDM系统的解调性能,因此信道估计成为接收端的关键环节。本文围绕OFDM系统中的信道估计问题,研究了几种典型方法:最小二乘(LS)估计、线性插值、样条插值、中值滤波、梳状离散傅里叶变换(Comb-DFT)估计以及最小均方误差(MMSE)估计。基于MATLAB仿真平台,在TDL-E信道和Rayleigh信道下分别设计了三个仿真实验:Comb-DFT与LS线性插值的对比、不同插值方法与导频步长的对比、LS与MMSE的对比。

1 引言

  • 随着无线通信技术的快速发展,人们对高速数据传输的需求日益增长。OFDM作为一种多载波调制技术,将高速数据流分配到多个相互正交的子载波上传输,能够有效对抗频率选择性衰落,并简化接收端均衡。然而,无线信道具有多径效应和多普勒效应,导致接收信号在幅度和相位上发生畸变。为了在接收端正确恢复发送数据,必须对信道进行估计和补偿。

  • 信道估计方法通常分为基于导频的估计和盲估计。基于导频的估计在实际系统中更为常见,其基本思想是在发送端插入已知的导频符号,接收端利用导频位置的信道响应进行估计,再通过插值或变换得到所有子载波上的信道频响。常用的估计准则包括LS和MMSE。LS估计实现简单,但受噪声影响大;MMSE估计利用信道统计信息,性能更优,但计算复杂度高且需要知道噪声功率和信道相关矩阵。此外,插值方法的选择、导频间隔的大小以及时域降噪策略都会影响最终估计性能。

  • 本文基于两个MATLAB仿真实验,研究OFDM系统中的多种信道估计方法。第一个实验针对TDL-E信道,对比Comb-DFT与LS线性插值;第二个程序针对Rayleigh信道,对比LS在不同插值方式(中值、线性、样条)和不同导频步长下的性能,并进一步比较LS与MMSE。通过仿真结果分析各方法的优缺点,为实际系统设计提供依据。

2 OFDM系统与信道模型

2.1 OFDM基本原理

2.2 无线信道模

3 信道估计方法

3.1 LS信道估计

3.2 基于插值的信道估计

3.3 Comb-DFT信道估计

3.4 MMSE信道估计及平滑退化

4 仿真设计与分析

4.1 参数设置

实验一参数设置

参数 取值
使用子载波数 1320
导频间隔 6
采样率 30.72 MHz
子载波间隔 15 kHz
扩展子载波数 6
总子载波数 1332
时域截断长度 58
调制方式 16-QAM
信道模型 TDL-E
时延扩展 100 ns
移动速度 30 km/h
载波频率 4 GHz
K因子 22 dB
SNR范围 0:5:30 dB

实验二参数设置

参数 取值
FFT长度 1024
CP长度 256
使用子载波数 840
调制方式 16-QAM
采样率 20 MHz
信道模型 Rayleigh
路径时延 0 110 190 410 ns
平均路径增益 0 -9.7 -19.2 -22.8 dB
最大多普勒频移 5 Hz
多普勒谱 Jakes
导频步长 16和4
SNR范围 0:5:45 dB
MMSE退化中心 27.5 dB
MMSE退化宽度 2.5 dB

4.2 仿真结果分析

  • 可以看到:
    Comb-DFT通过时域截断有效抑制噪声,在TDL-E信道下性能始终优于LS线性插值,且信噪比越高优势越显著。在Rayleigh信道下,导频步长越小估计越准确,线性插值表现最稳健;MMSE在低信噪比下优于LS,高信噪比下平滑退化为LS。

4.3 部分代码

c 复制代码
clear; close all; clc;

%% 参数
Nused  = 1320;
Sf     = 6;
Fs     = 30.72e6;
Delta_f = 15e3;

% 带扩展的 Comb 数组
N_ext = 6;
Ncomb_ext = Nused + 2*N_ext;     % = 1332 = 6*222
Ng_local = round(144 * Ncomb_ext / 2048);

used_start = N_ext + 1;          % = 7
used_end   = N_ext + Nused;      % = 1326

pilot_in_used = (1:Sf:Nused).';
Npilot        = length(pilot_in_used);
pilot_in_ext  = pilot_in_used + N_ext;
data_in_used  = setdiff((1:Nused).', pilot_in_used);
data_in_ext   = data_in_used + N_ext;

% 线性插值权重
n_vec   = (1:Nused).';
i_left  = floor((n_vec - 1) / Sf) + 1;
i_left  = min(i_left,  Npilot);
i_right = min(i_left + 1, Npilot);
pos_l   = pilot_in_used(i_left);
pos_r   = pilot_in_used(i_right);
denom   = pos_r - pos_l;
denom(denom == 0) = 1;
t_vec   = (n_vec - pos_l) ./ denom;
t_vec(pos_l == pos_r) = 0;
w_r     = t_vec;
w_l     = 1 - t_vec;

% 信道
v_kmh = 30; fc = 4e9;
c = physconst('lightspeed');
fd = (v_kmh*1000/3600)/c*fc;
delay_spread_ns = 100;

tdl = nrTDLChannel;
tdl.DelayProfile        = 'TDL-E';
tdl.DelaySpread         = delay_spread_ns * 1e-9;
tdl.MaximumDopplerShift = fd;
tdl.SampleRate          = Fs;
tdl.NumTransmitAntennas = 1;
tdl.NumReceiveAntennas  = 1;
tdl.NormalizePathGains  = true;

info_tdl = info(tdl);
max_delay_s = max(info_tdl.PathDelays);

Fs_comb = Ncomb_ext * Delta_f;
max_delay_comb_samples = ceil(max_delay_s * Fs_comb);
L_trunc = max_delay_comb_samples + 16;

fprintf('=== 可视化 |S(ω)| 与 BER,TDL-E ===\n');
fprintf('Nused=%d, Sf=%d, Ncomb_ext=%d, L_trunc=%d\n\n', ...
        Nused, Sf, Ncomb_ext, L_trunc);

M = 16; Mod_Order = 4;
K_dB = 22;

%% 理论 BER
function ber = theoretical_ber_tdl_e(EbN0_dB, M, K_dB)
    k = log2(M); L = sqrt(M);
    EbN0 = 10.^(EbN0_dB/10);
    ber = (2/k) * (1 - 1/L) * erfc(sqrt(3 * EbN0 * k / (2 * (M - 1))));
    K = 10^(K_dB/10);
    ber = ber / (1 + 1/K);
end

% BER 曲线

SNRdB = 0:5:30;
nSNR  = length(SNRdB);
BER_comb = zeros(size(SNRdB));
BER_ls   = zeros(size(SNRdB));

MIN_ERRORS   = 100;
MAX_BITS_CAP = 5e7;
rng(42);

BER_pred = theoretical_ber_tdl_e(SNRdB - 10*log10(Mod_Order), M, K_dB);

for i_snr = 1:nSNR
    EsN0_lin = 10^(SNRdB(i_snr)/10);
    err_comb = 0; err_ls = 0; total_bits = 0;

    fprintf('BER SNR = %5.1f dB: ', SNRdB(i_snr));
    tic;

    while (err_comb < MIN_ERRORS || err_ls < MIN_ERRORS) ...
          && total_bits < MAX_BITS_CAP

        data_bits = randi([0 1], length(data_in_used) * Mod_Order, 1);
        data_syms = qammod(data_bits, M, 'InputType', 'bit', ...
                           'UnitAveragePower', true);
        pilot_bits = randi([0 1], Npilot * Mod_Order, 1);
        pilot_syms = qammod(pilot_bits, M, 'InputType', 'bit', ...
                            'UnitAveragePower', true);

        freq_syms = zeros(Ncomb_ext, 1);
        freq_syms(data_in_ext)  = data_syms;
        freq_syms(pilot_in_ext) = pilot_syms;

        x_time = ifft(freq_syms) * sqrt(Ncomb_ext);
        x_cp   = [x_time(end-Ng_local+1:end); x_time];

        reset(tdl);
        y_ch = tdl(complex(x_cp));
        noise = sqrt(1/(2*EsN0_lin)) * ...
                (randn(size(y_ch)) + 1j*randn(size(y_ch)));
        y_rx = y_ch + noise;

        y_time = y_rx(Ng_local+1:end);
        Y_nat  = fft(y_time) / sqrt(Ncomb_ext);

        pilot_syms_nat = freq_syms(pilot_in_ext);
        H_LS_pil = Y_nat(pilot_in_ext) ./ pilot_syms_nat;

        if any(~isfinite(H_LS_pil))
            continue;
        end

        % Comb-DFT
        H_comb = zeros(Ncomb_ext, 1);
        H_comb(pilot_in_ext) = H_LS_pil;
        slope_L = H_LS_pil(2) - H_LS_pil(1);
        H_comb(1) = H_LS_pil(1) - slope_L;
        slope_R = H_LS_pil(end) - H_LS_pil(end-1);
        H_comb(Ncomb_ext - 5) = H_LS_pil(end) + slope_R;

        h_comb = ifft(H_comb) * sqrt(Ncomb_ext);
        h_trunc = zeros(Ncomb_ext, 1);
        h_trunc(1:L_trunc) = h_comb(1:L_trunc) * Sf;
        H_est_full = fft(h_trunc) / sqrt(Ncomb_ext);
        H_est_comb = H_est_full(used_start:used_end);

        % LS + 线性插值
        H_est_ls = w_l .* H_LS_pil(i_left) + w_r .* H_LS_pil(i_right);

        % 均衡器
        Y_data_nat  = Y_nat(data_in_ext);
        tx_syms_nat = freq_syms(data_in_ext);
        tx_bits_used = qamdemod(tx_syms_nat, M, 'OutputType', 'bit', ...
                                'UnitAveragePower', true);

        H_d = H_est_comb(data_in_used);
        X_eq = conj(H_d) .* Y_data_nat ./ (abs(H_d).^2 + 1/EsN0_lin + eps);
        X_eq(~isfinite(X_eq)) = 0;
        rx = qamdemod(X_eq, M, 'OutputType', 'bit', 'UnitAveragePower', true);
        err_comb = err_comb + sum(tx_bits_used ~= rx);

        H_d = H_est_ls(data_in_used);
        X_eq = conj(H_d) .* Y_data_nat ./ (abs(H_d).^2 + 1/EsN0_lin + eps);
        X_eq(~isfinite(X_eq)) = 0;
        rx = qamdemod(X_eq, M, 'OutputType', 'bit', 'UnitAveragePower', true);
        err_ls = err_ls + sum(tx_bits_used ~= rx);

        total_bits = total_bits + length(tx_bits_used);
    end

    BER_comb(i_snr) = err_comb / total_bits;
    BER_ls(i_snr)   = err_ls   / total_bits;

    fprintf('t=%.1f 秒 | Comb: %.3e | LS: %.3e', ...
            toc, BER_comb(i_snr), BER_ls(i_snr));
    if err_ls > 0 && err_comb > 0
        fprintf(' | Comb 相对 LS: %+.2f dB\n', ...
                10*log10(BER_ls(i_snr)/BER_comb(i_snr)));
    else
        fprintf('\n');
    end
end

5 总结

本文围绕OFDM系统中的信道估计问题,系统研究了LS、线性插值、样条插值、中值滤波、Comb-DFT及MMSE等多种典型方法,并在TDL-E与Rayleigh两类信道下通过MATLAB仿真进行了对比分析。结果表明:Comb-DFT凭借时域截断有效抑制噪声,在TDL-E信道下性能始终优于LS线性插值,且信噪比越高优势越明显;在Rayleigh信道下,导频步长越小估计越准确,线性插值表现最稳健,MMSE在低信噪比下优于LS,高信噪比下平滑退化为LS。综合来看,实际系统设计需根据信道特性与复杂度约束,在估计精度与实现代价之间做出权衡。

相关推荐
weixin_307779136 小时前
C++代码实现MATLAB中的pade函数功能
开发语言·c++·算法·matlab
slandarer1 天前
MATLAB | R2026b 更新了哪些有趣的新东西
开发语言·数据库·matlab
BT-BOX2 天前
MATLAB R2025B版本下载安装详细图文教程~
matlab
通信仿真爱好者2 天前
第【129】期--基于 RLS 自适应天线阵列波束成形与干扰抑制性能研究--matlab完整代码
matlab·rls·自适应波束成形·干扰抑制
宁静致远20212 天前
在VScode中使用MATLAB
vscode·matlab
88号技师2 天前
2026年9月SCI-天气状态蚂蚁优化算法Weather State Ants Optimizer-附Matlab免费代码
开发语言·算法·matlab·优化算法
weixin_307779139 天前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
菜鸟~noob2339 天前
【太空电子战】从CCS到Meadowlands:反通信系统的二十年演进史【含matlab代码】
开发语言·matlab
菜鸟~noob23310 天前
【太空电子战】Meadowlands作战验收:美国太空军可逆干扰能力的里程碑【含matlab代码】
matlab·电子战