基于OFDM系统频域导频的LS与MMSE信道估计算法的MATLAB仿真

发布于:2025-07-08 ⋅ 阅读:(17) ⋅ 点赞:(0)

本代码核心程序来自《MIMO-OFDM Wireless Communications with MATLAB》,但书上存在一些代码错误,经过调试优化后完成信道仿真。
存在的问题:

  • LS信道估计对噪声非常敏感,接收信号 YYY 通常包含加性高斯白噪声(AWGN),这使得估计的信道响应 H^LS\hat{H}_{\text{LS}}H^LS 也带有噪声分量;在低信噪比(SNR)环境下,噪声的影响尤为显著,导致每个子载波上的估计值出现随机波动。这种随机性在频域上表现为信道估计曲线的“上下起伏”。 简而言之,代码参数设置原因,LS在低信噪比情况下的表现情况较差。
  • 信道随机生成,需要在调试时按照需求设置; 在无线通信中,尤其是在多径信道环境下,信道的频率响应 H(f)H(f)H(f) 并不是平坦的,而是随着频率变化而波动。这种现象称为频率选择性衰落。具体来说:多径传播导致不同路径的信号到达接收端时存在时间延迟,这些延迟在频域上表现为干涉效应,使得信道响应在不同子载波上出现明显的幅度和相位变化。LS信道估计通过公式 H^LS=YX\hat{H}_{\text{LS}} = \frac{Y}{X}H^LS=XY(其中 YYY 是接收信号,XXX 是发送信号)独立地计算每个子载波的信道响应,因此它会直接反映出这种频率选择性,导致估计结果呈现上下起伏。
  • 通信系统参数需要继续调试,例如导频间隔与子载波个数的选择;

代码结构:

%% 主程序
% 参数设置
params = setParameters();

% 生成导频序列
[X_pilot] = generateTxPilotData(params);

% 生成发送序列
[X_Tx] = generateTxSymbol(params, X_pilot);

% 生成信道冲激响应以及信道的频率响应
[channelImpulse, channelFreq] = generateChannel(params);

% 经过信道
Y_Rx = passThroughChannel(X_Tx, channelFreq, params);

% LS信道估计
channelEstimate_LS = LS_estimateChannel(Y_Rx, X_pilot, params);
% MMSE信道估计
channelEstimate_MMSE = MMSE_estimateChannel(Y_Rx, X_pilot, channelImpulse,params);

% 均衡
[equalizedZf_LS] = zFequalize(Y_Rx, channelEstimate_LS);
[equalized_MMSE] = mmseEqualization(Y_Rx, channelEstimate_MMSE, params.noiseVariance);

% 估计结果分析
analyzeResults(X_Tx, equalizedZf_LS,equalized_MMSE,channelEstimate_LS,channelEstimate_MMSE,channelFreq ,params);

代码分块(核心):
需要全部代码随时cue Me…,因为还在调试

% 1. 参数设置部分
function params = setParameters()
    %% 设置仿真参数
    % @brief 定义系统仿真参数
    % @return params 参数结构体
    params.subCarrierNum = 256;        % FFT长度(单个OFDM符号长度)
    params.PilotGap = 8;               % 导频间隔
    params.insertOption = 'line';      % LS信道估计插值模式{'line','spline'}
    params.PilotNum = params.subCarrierNum / params.PilotGap;      % 导频数量
    params.PilotLoc = 1 : params.PilotGap : params.subCarrierNum;  % 根据导频间隔确定导频位置
    params.snrDb = 10;                 % 信噪比(dB)
    params.channelLength = 3;          % 信道长度(多径数量)
    % params.noiseVariance = 0.1;        % 噪声方差(用于MMSE)
    params.noiseVariance = 1 / (2 * 10^(params.snrDb/10));  %可以选择写死调试
end
2. LS信道估计核心程序
function [H_LS]=LS_CE(Y,Xp,pilot_loc,Nfft,Nps,int_opt)
%% 最小二乘信道估计
% @参数列表
% @Y : 接收到的频域信号序列
% @Xp : 导频信号
% @pilot_loc : 导频位置
% @Nfft : FFT大小
% @Nps : 导频间隔大小  (范围1~NFFT-1)
% @int_opt : 'line' or 'spline'
% #H_LS : 输出的信道估计值
%% 代码部分
    Np = Nfft / Nps;
    k = 1 : Np;
    LS_est(k) = Y(pilot_loc(k))./Xp(k);% 最小二乘信道估计原理公式
    % 这一步是原理公式,但只能得到到频点的信道估计值
    if lower(int_opt(1)) == 'l'
        method = 'linear';
    else 
        method = 'spline';
    end
    % 那么为了得到非到频点的信道估计值,就需要进行插值,这里提供的两种插值模式{"线性插值","样条插值"};
    % 线性插值:一次多项式(每段直线),误差较大,尤其当数据波动明显时;
    % 样条插值:分段低次多项式(例如三次),误差较小能更好拟合复杂曲线趋势;
    %% 线性/非线性插值部分
    H_LS = interpolate(LS_est,pilot_loc,Nfft,method);
end
function [H_interpolated] = interpolate(H,pilot_loc,Nfft,method)
%% 参数列表
    % @H : 用导频序列求到的信道估计值
    % @pilot_loc : 导频序列的位置
    % @Nfft : FFT大小
    % @method : 'linear'/'splinear'
    % #H_interpolated : 插值后信道估计值
%% 代码部分
% 边界扩展处理:  <注意点>
%     实际系统中,导频可能不会覆盖频域的最左端(子载波 1)或最右端(子载波Nfft)。
% 如果直接插值,边界处的信道响应会因缺乏参考点而误差较大。因此代码首先对边界进行外推(Extrapolation):
    if pilot_loc(1) > 1
        slope = (H(2) - H(1)) / (pilot_loc(2) - pilot_loc(1));  % 前两个导频的斜率
        H = [H(1) - slope*(pilot_loc(1) - 1) H];                % 对1号载波位置的信道估计值外推
        pilot_loc = [1 pilot_loc];                              % 将补充上的1号载波标记为导频位置
    end
    % 这一过程就是补足边界条件,为后续插值提供完整的初始数据;
    
    if pilot_loc(end) < Nfft
       slope = (H(end) - H(end - 1)) / (pilot_loc(end) - pilot_loc(end - 1));
       H = [H H(end) + slope*(Nfft-pilot_loc(end))];
       pilot_loc = [pilot_loc,Nfft];
    end
    
    if lower(method(1))=='l'
        H_interpolated = interp1(pilot_loc,H,1:Nfft);
    else 
        H_interpolated = interp1(pilot_loc,H,1:Nfft,'spline');
    end
    %这一步就是插值函数,通过内置函数,补足Nfft个频点的信道估计值即可
end
3. MMSE信道估计代码
function [H_MMSE] = MMSE_CE(Y,Xp,pilot_loc,Nfft,Nps,h,SNR)
    %% MMSE信道估计技术
    % Inputs:
    %   @Y = 接收到的频域序列
    %   @Xp = 导频信号
    %   @pilot_loc = 导频位置
    %   @Nfft = FFT大小
    %   @Nps = 导频间隔
    %   @h = 信道冲激响应
    %   @SNR = 信噪比[dB]
    % output:
    %   #H_MMSE = MMSE信道估计值
    
    % 核心是通过导频信号和信道统计特性(如延迟扩展)优化 LS(最小二乘)估计结果,降低噪声对信道估计的影响;
    %% 代码实现部分
    %% 输入参数与 LS 初始估计
    snr = 10 ^ (SNR/10);  %信噪比转为功率表达式
    Np = Nfft/Nps;        %根据信噪比间隔判接收频域序列经历多少个不同的信道
    H_tilde = Y(pilot_loc)./Xp;   %LS信道估计值
    %% 信道统计特性提取(延迟扩展)
    %从信道冲激响应(CIR)h中提取统计特性,主要是 RMS 延迟扩展tau_rms,用于构建信道协方差矩阵;
    %   --tau_rms反映信道的多径时延扩散程度,越大表示信道频率选择性越强(频域相关性越低);
    %   --通过冲激响应的自相关计算延迟的一阶矩(平均延迟)和二阶矩(延迟平方平均),最终得到tau_rms;
    tau_rms = calculate_rms_delay(h, 1); % RMS延迟扩展(信道频率选择性的度量)
    %% 信道频域相关函数构建
    % 求解线性变量W;
    % W = RHH(~)RH(~)H(~);
    % RH(~)H(~) = RHH + SNR_eye;
    % RHH = RHH(~)
    % W = RHH*inv(RHH+SNR_eye);
    %% 构建全频域信道与导频位置信道的互相关矩阵RHH(~)
    % 假设信道的频域相关性服从指数模型(常见于多径信道),相关函数与子载波间隔df和延迟扩展tau_rms相关;
    % K1-K2表示全频域子载波与导频子载波的索引差,通过该差值和相关因子j*2pi*tau_rms*df计算频域相关性;
    df = 1 / Nfft;                              % 1/(ts*Nfft),子载波间隔(频域分辨率)
    j2pi_tau_df = 1i * 2 * pi * tau_rms * df;   % 频域相关系数因子
    K1 = repmat((0 : Nfft - 1).',1,Np);         % 全频域子载波索引(列重复Np次)
    % 将向量复制成1xNp大小的规格
    K2 = repmat(pilot_loc - 1,Nfft,1);                 % 导频子载波索引(行重复Nfft次)
    %K2 = repmat(0:Np-1,Nfft,1);                 % 导频子载波索引(行重复Nfft次)
    rf = 1 ./ (1 + j2pi_tau_df * Nps * (K1 - K2));     %Eq(6.17a)
    % rf = 1 ./ (1 + j2pi_tau_df * (K1 - K2));     %Eq(6.17a)
    %% 导频位置信道协方差矩阵构建
    % 构建导频位置信道的自协方差矩阵RH(~)H(~)(记为Rpp),包含信道自身相关性和噪声项。
    K3 = repmat((pilot_loc - 1).',1,Np);
    K4 = repmat((pilot_loc - 1),Np,1);
    % K3 = repmat((0:Np-1).',1,Np);
    % K4 = repmat((0:Np-1),Np,1);
    rf2 = 1 ./ (1+j2pi_tau_df * Nps * (K3 - K4));      %Eq(6.17a)
    % rf2 = 1 ./ (1+j2pi_tau_df * (K3 - K4));      %Eq(6.17a)
    Rhp = rf;
    Rpp = rf2 + eye(Np) ./ snr;   % 修改点******
    % eye为单位矩阵函数
    epsilon = 1e-6; % 小正则化参数,可调整
    H_MMSE = transpose(Rhp * inv(Rpp + epsilon * eye(Np)) * H_tilde.');
end
%% 计算最大拓展延迟RMS
function tau_rms = calculate_rms_delay(h, Ts)
    % 计算RMS延迟扩展
    % 输入:
    %   h: 信道冲激响应 (复数向量)
    %   Ts: 采样间隔 (秒),默认为1
    % 输出:
    %   tau_rms: RMS延迟扩展 (秒)
    if nargin == 1
        Ts = 1; % 默认采样间隔为1
    end
    power = abs(h).^2; % 计算每条路径的功率
    power = power / sum(power);% 归一化功率
    % 计算延迟向量 (以采样点为单位)
    tau_samples = 0:length(h) - 1;
    % 转换为秒,采样率不一定为1,工程中要将采样序列转为时间序列
    tau = tau_samples * Ts;
    % 计算平均延迟
    mean_tau = sum(power .* tau);
    % 计算延迟平方的平均
    mean_tau_squared = sum(power .* tau.^2);
    % 确保mean_tau是标量
    mean_tau = mean_tau(:);  % 将mean_tau转换为列向量
    mean_tau = mean_tau(1);  % 取第一个元素(确保是标量)
    % 计算RMS延迟扩展 - 使用标量平方
    tau_rms = sqrt(mean_tau_squared - mean_tau * mean_tau);  % 使用mean_tau*mean_tau代替mean_tau^2
end

在不同信噪比下的运行结果:
在这里插入图片描述
信道冲激响应长度: 3 符号
ZF均衡后的符号误差(LS): 0.184372
MMSE均衡后的符号误差(MMSE): 0.114428
LS信道估计导频点位置的信道估计值: 0.94424+0.047112i 1.2705+0.11081i 0.93957-0.068216i 0.79366+0.10866i 1.3269-0.10943i 1.0002-0.16785i 0.97263+0.15794i 0.9575-0.094971i 1.1264+0.14521i 0.78977-0.024217i 1.0492+0.055393i 0.89572-0.096208i 0.65286+0.17238i 1.1023-0.2091i 0.84727+0.023505i 1.1778-0.12166i 1.4842-0.089663i 1.1624-0.077077i 1.1826-0.010807i 1.3656-0.081241i 0.8655-0.12418i 1.0113-0.31734i 1.0653-0.2251i 1.0699-0.14603i 1.2222-0.033002i 0.8785-0.43615i 0.81694+0.071999i 0.93701-0.11256i 1.0901-0.028226i 0.91848-0.012873i 0.93695+0.26533i 0.71827+0.04757i;
LS与实际信道估计误差为: 0.052065
MMSE信道估计导频点位置的信道估计值: 1.0889+0.069146i 1.0754+0.050961i 1.0614+0.034737i 1.0465+0.020507i 1.0308+0.0086645i 1.0141-6.2677e-05i 0.99696-0.0047518i 0.98059-0.0045254i 0.96672+0.0011208i 0.95766+0.011915i 0.95591+0.02641i 0.96346+0.041764i 0.98101+0.053953i 1.0072+0.05853i 1.0384+0.051804i 1.0694+0.032034i 1.0945+0.00013081i 1.109-0.040444i 1.1104-0.084574i 1.0985-0.12678i 1.0755-0.16244i 1.0447-0.18844i 1.0097-0.2032i 0.97408-0.20634i 0.94095-0.19815i 0.9133-0.17943i 0.89406-0.15155i 0.88604-0.11673i 0.89157-0.078161i 0.91205-0.039939i 0.94749-0.0067442i 0.99623+0.016751i;
MMSE与实际信道估计误差为: 0.008312
在这里插入图片描述
信道冲激响应长度: 3 符号
ZF均衡后的符号误差(LS): 0.014217
MMSE均衡后的符号误差(MMSE): 0.010382
LS信道估计导频点位置的信道估计值: 1.0207-0.0091123i 0.93649+0.063623i 1.0352+0.15915i 1.0415+0.0012994i 1.0197+0.020206i 1.0408-0.082487i 0.92156+0.0027354i 0.94274+0.031761i 1.0219+0.036632i 0.95213-0.030361i 0.94984-0.058406i 1.1063-0.026811i 0.97291+0.073524i 1.0409-0.0040111i 0.97303+0.069189i 1.0155+0.049488i 1.0738-0.042274i 1.0627-0.054576i 0.99932-0.030358i 1.1282+0.0073592i 1.0048-0.034712i 1.0269-0.00024577i 1.0848-0.054455i 0.94948-0.022319i 0.93786-0.066691i 0.94399-0.083129i 0.97589-0.00069853i 0.97798-0.030244i 0.88274-0.088493i 0.9478-0.05137i 0.98883+0.0078182i 0.91949-0.023863i;
LS与实际信道估计误差为: 0.004545
MMSE信道估计导频点位置的信道估计值: 0.99339+0.028721i 1.0051+0.048146i 1.0221+0.050265i 1.0329+0.037488i 1.0308+0.018935i 1.0171+0.0050184i 0.99937+0.0013817i 0.98564+0.0066136i 0.97941+0.015036i 0.97913+0.021681i 0.98129+0.025248i 0.98405+0.027256i 0.98816+0.029092i 0.9952+0.029971i 1.0052+0.027468i 1.0157+0.019784i 1.0236+0.0074492i 1.0272-0.0070645i 1.027-0.021313i 1.0243-0.034395i 1.0197-0.046636i 1.0128-0.05803i 1.0029-0.067253i 0.99086-0.07236i 0.97907-0.072441i 0.96977-0.068506i 0.9636-0.062615i 0.95943-0.056053i 0.9558-0.048194i 0.95269-0.036985i 0.95221-0.020557i 0.95789+0.0012279i;
MMSE与实际信道估计误差为: 0.000647
在这里插入图片描述
信道冲激响应长度: 3 符号
ZF均衡后的符号误差(LS): 0.001923
MMSE均衡后的符号误差(MMSE): 0.002060
LS信道估计导频点位置的信道估计值: 1.0379+0.079542i 1.113+0.075283i 1.1284+0.024911i 1.1288+0.030373i 1.1267-0.051346i 1.0898-0.076303i 1.0837-0.091511i 1.0368-0.091083i 0.98761-0.12015i 0.92973-0.11217i 0.95843-0.044572i 0.8963-0.050557i 0.90128-0.020877i 0.94438+0.0031101i 0.96528+0.019332i 0.96111+0.063506i 0.98472+0.06172i 1.019+0.027992i 1.0041+0.00061434i 1.0336-0.06292i 1.0114-0.0026669i 1.0001-0.080249i 0.95986-0.077646i 0.92068-0.067193i 0.89747-0.038176i 0.89289-0.042488i 0.9036+0.015966i 0.8706+0.084641i 0.93256+0.12048i 0.94632+0.11556i 1.014+0.11724i 1.0129+0.15026i;
LS与实际信道估计误差为: 0.000712
MMSE信道估计导频点位置的信道估计值: 1.0373+0.077844i 1.1155+0.071439i 1.1255+0.030372i 1.136+0.014086i 1.1365-0.03997i 1.0961-0.069441i 1.0708-0.083241i 1.0415-0.10072i 0.99531-0.11842i 0.93657-0.088888i 0.93646-0.053176i 0.91542-0.049021i 0.90189-0.0022701i 0.93024+0.021111i 0.93795+0.021679i 0.94753+0.044542i 0.9887+0.050446i 1.015+0.023002i 1.0245-0.0051865i 1.0114-0.035626i 1.0052-0.036216i 1.0052-0.072484i 0.9576-0.089304i 0.92357-0.06985i 0.90747-0.045005i 0.89663-0.023737i 0.87932+0.0076291i 0.88261+0.07011i 0.93371+0.11099i 0.97123+0.12201i 1.0038+0.12991i 1.0119+0.14788i;
MMSE与实际信道估计误差为: 0.000423
在这里插入图片描述
信道冲激响应长度: 3 符号
ZF均衡后的符号误差(LS): 0.000184
MMSE均衡后的符号误差(MMSE): 0.000278
LS信道估计导频点位置的信道估计值: 1.0449+0.076425i 1.0722+0.049928i 1.0882+0.021405i 1.0969-0.006437i 1.0787-0.039332i 1.0507-0.070514i 1.0251-0.086535i 0.98339-0.08265i 0.96138-0.080517i 0.9361-0.058856i 0.9072-0.017961i 0.91957+0.010981i 0.91293+0.033468i 0.93515+0.054574i 0.97812+0.08078i 0.99961+0.086914i 1.0255+0.064999i 1.0533+0.035752i 1.0652+0.018551i 1.0753-0.013095i 1.0619-0.046071i 1.0409-0.058056i 1.0021-0.081023i 0.98573-0.077866i 0.95622-0.060097i 0.93007-0.031619i 0.90075-0.017675i 0.9063+0.020588i 0.93541+0.061296i 0.93899+0.072498i 0.97325+0.091302i 1.0104+0.083875i;
LS与实际信道估计误差为: 0.000074
MMSE信道估计导频点位置的信道估计值: 1.0443+0.076354i 1.0729+0.049324i 1.0875+0.023119i 1.0937-0.0089614i 1.0817-0.0444i 1.0561-0.068461i 1.0243-0.084582i 0.98724-0.082582i 0.96121-0.073291i 0.92989-0.059406i 0.90839-0.019898i 0.918+0.0097942i 0.91874+0.032039i 0.93526+0.063555i 0.96889+0.079955i 1.0014+0.079154i 1.0324+0.067221i 1.0524+0.041818i 1.0622+0.020607i 1.0726-0.011708i 1.0566-0.045175i 1.0384-0.06466i 1.0064-0.079243i 0.97942-0.075166i 0.9499-0.065694i 0.93161-0.042932i 0.91185-0.01919i 0.90716+0.027405i 0.93287+0.057683i 0.9457+0.073012i 0.97182+0.096569i 1.0085+0.082914i;
MMSE与实际信道估计误差为: 0.000041
在这里插入图片描述
信道冲激响应长度: 3 符号
ZF均衡后的符号误差(LS): 0.000016
MMSE均衡后的符号误差(MMSE): 0.000018
LS信道估计导频点位置的信道估计值: 1.0955+0.053271i 1.1047+0.027314i 1.1086-0.0028219i 1.1003-0.032996i 1.0795-0.062558i 1.0594-0.080433i 1.0308-0.087946i 1.0043-0.085435i 0.97888-0.080488i 0.96579-0.061319i 0.95295-0.046334i 0.95366-0.029685i 0.95279-0.015822i 0.9642-0.0011528i 0.96979+0.0025144i 0.98185+0.0024056i 0.99358-0.0043596i 0.99132-0.012206i 0.98758-0.021471i 0.9794-0.029344i 0.96725-0.032185i 0.94871-0.026537i 0.93542-0.014911i 0.9232-0.00045126i 0.92156+0.028188i 0.92239+0.050833i 0.93758+0.073121i 0.96078+0.094032i 0.98419+0.10394i 1.0165+0.10654i 1.0485+0.09823i 1.0749+0.081423i;
LS与实际信道估计误差为: 0.000006
MMSE信道估计导频点位置的信道估计值: 1.0956+0.053701i 1.1037+0.027301i 1.1079-0.0034485i 1.1008-0.035478i 1.0825-0.061552i 1.0586-0.079345i 1.0307-0.087686i 1.0046-0.086768i 0.98033-0.07811i 0.96394-0.062177i 0.95487-0.045295i 0.95232-0.029356i 0.95315-0.014417i 0.96201-0.0020975i 0.9713+0.0020461i 0.98184+0.0040136i 0.99132-0.0039735i 0.99116-0.01375i 0.98768-0.021626i 0.9795-0.028904i 0.9658-0.032679i 0.94887-0.027523i 0.93597-0.016048i 0.92358+0.00096617i 0.91997+0.026124i 0.92508+0.050016i 0.9377+0.074694i 0.96035+0.093145i 0.98577+0.10411i 1.0166+0.10807i 1.0472+0.098513i 1.0749+0.080896i;
MMSE与实际信道估计误差为: 0.000003
在这里插入图片描述
信道冲激响应长度: 3 符号
ZF均衡后的符号误差(LS): 0.000002
MMSE均衡后的符号误差(MMSE): 0.000001
LS信道估计导频点位置的信道估计值: 1.0024+0.048009i 1.0191+0.038327i 1.03+0.023346i 1.0336+0.0058239i 1.0296-0.011086i 1.0189-0.024429i 1.0035-0.031823i 0.98636-0.031914i 0.97047-0.024491i 0.95879-0.01069i 0.95364+0.0073773i 0.95629+0.026784i 0.9668+0.044334i 0.98399+0.057041i 1.0056+0.062534i 1.0285+0.059547i 1.0494+0.048009i 1.0652+0.029159i 1.0735+0.0053526i 1.0727-0.020295i 1.0628-0.044344i 1.045-0.063523i 1.0215-0.075274i 0.99553-0.078008i 0.97047-0.071508i 0.94964-0.056809i 0.93565-0.036069i 0.93017-0.012304i 0.93356+0.011098i 0.94489+0.030922i 0.96212+0.044545i 0.98236+0.050371i;
LS与实际信道估计误差为: 0.000000
MMSE信道估计导频点位置的信道估计值: 1.0025+0.048027i 1.019+0.038503i 1.0298+0.023203i 1.0336+0.0056639i 1.0296-0.011267i 1.019-0.024526i 1.0037-0.031852i 0.98653-0.031854i 0.9706-0.024385i 0.95888-0.010537i 0.95367+0.0075484i 0.95626+0.026956i 0.96672+0.044493i 0.98386+0.057161i 1.0054+0.062612i 1.0283+0.059574i 1.0492+0.047979i 1.0651+0.029081i 1.0733+0.0052362i 1.0726-0.020453i 1.0628-0.044517i 1.045-0.063698i 1.0216-0.075428i 0.99567-0.078122i 0.97065-0.071558i 0.94981-0.056774i 0.9358-0.035974i 0.93023-0.012125i 0.93354+0.011263i 0.94469+0.031073i 0.96199+0.044361i 0.98243+0.050351i;
MMSE与实际信道估计误差为: 0.000000


网站公告

今日签到

点亮在社区的每一天
去签到