关注我,追更更多通信仿真代码!
文章目录
-
- 摘要
- [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。综合来看,实际系统设计需根据信道特性与复杂度约束,在估计精度与实现代价之间做出权衡。