关注我,追更更多通信仿真代码!
文章目录
- 摘要
- 1 引言
- 2 系统模型与信道估计
- 2.1 OFDM 信号模型
- 2.2 多径信道频域模型
- 2.3 导频结构与 LS 信道估计
- 2.4 频域信道估计算法
- 2.4.1 线性插值
- 2.4.2 高斯核回归
- 2.4.3 截断 RBF 核回归
- 2.5 自适应核宽度选择
- 3 仿真设计与分析
- 3.1 参数设置
- 3.2 结果图分析
- 3.3 部分代码
- 4 总结
摘要
在 OFDM 系统中,相干解调依赖于准确的信道状态信息,因此信道估计的精度直接决定系统性能。本文基于导频辅助的频域信道估计框架,对比研究了三种典型方法:传统线性插值、高斯核回归以及截断 RBF 核回归。其中核回归方法采用自适应带宽选择策略,根据不同信噪比动态优化核宽度。仿真结果表明:核回归方法在中高信噪比区域误码率性能优于线性插值。
1 引言
- 正交频分复用(Orthogonal Frequency Division Multiplexing, OFDM)通过将高速数据流分配到多个正交子载波上传输,有效对抗频率选择性衰落,是 LTE、5G NR 等标准的核心波形技术。在 OFDM 接收机中,为恢复每个子载波上承载的数据符号,接收端必须准确估算各子载波处的信道频域响应(Channel Frequency Response, CFR),这一过程称为信道估计。
- 基于导频(Pilot)的信道估计是工程中最常用的方案:发射端在特定子载波(导频子载波)上插入已知符号,接收端根据这些导频符号的观测值,通过某种算法推算出全部数据子载波上的信道响应。
- 近年来,核回归作为一种经典的机器学习非参数回归方法,因其无需预先训练、能根据数据自适应调整平滑程度,已被引入信道估计领域。典型做法是采用高斯核函数对导频处的原始估计进行加权平均,等效于频域低通滤波,可有效压制噪声。
2 系统模型与信道估计
2.1 OFDM 信号模型
2.2 多径信道频域模型
2.3 导频结构与 LS 信道估计
2.4 频域信道估计算法
2.4.1 线性插值
2.4.2 高斯核回归
2.4.3 截断 RBF 核回归
2.5 自适应核宽度选择
3 仿真设计与分析
3.1 参数设置
| 参数 | 符号 | 取值 |
|---|---|---|
| 载波频率 | f c f_cfc | 3.5 GHz |
| 子载波间隔 | Δ f \Delta fΔf | 15 kHz |
| 资源块数 | N R B N_{\rm RB}NRB | 52 |
| 每资源块子载波数 | N s c R B N_{\rm sc}^{\rm RB}NscRB | 12 |
| 总子载波数 | N NN | 624 |
| 导频间隔 | Δ p \Delta pΔp | 4 |
| 导频数量 | N p N_pNp | 156 |
| 调制方式 | — | QPSK |
| 多径数目 | L LL | 20 |
| 平均时延扩展 | τ r m s \tau_{\rm rms}τrms | 200 ns |
| 每 SNR 点 OFDM 符号数 | N s y m N_{\rm sym}Nsym | 50 |
| 候选核宽度集合 | Σ \SigmaΣ | { 1 , 2 , … , 25 } \{1, 2, \dots, 25\}{1,2,…,25} |
| 截断 RBF 半径 | R RR | 20 |
3.2 结果图分析
可以看到,两种核方法的 BER 在所有 SNR 点上均低于线性插值,验证了核回归在频域信道估计中的有效性。
3.3 部分代码
clear clc close all%---仿真参数---carrierFreq=3.5e9;%载波频率(Hz)pilotSpacing=4;%导频间隔 subcarrierSpacing=15;%子载波间隔(kHz)subcarriersPerRB=12;%每资源块子载波数 numResourceBlocks=52;%资源块数量 totalSubcarriers=numResourceBlocks*subcarriersPerRB;%总子载波数 pilotIndices=(1:pilotSpacing:totalSubcarriers)';%导频位置 numPilots=length(pilotIndices);%---信道参数---numPaths=20;avgDelaySpread=200e-9;%---核宽度候选集(用于自适应选择)---sigmaValues=linspace(1,25,10)';%候选 σ numTests=length(sigmaValues);%---BER 仿真信噪比范围---SNRRange=-5:5:25;BERTrueChannel=zeros(length(SNRRange),1);KBEREstimatedChannel=zeros(length(SNRRange),1);%RBF 核 RKBEREstimatedChannel=zeros(length(SNRRange),1);%高斯核 LinearBER=zeros(length(SNRRange),1);%线性插值%---仿真设置---numTrials=100;%每个核宽度的试验次数(用于初始σ选择) signalToNoiseRatio=10;%用于初始优化的 SNR(若后续自适应,此步可简化) bitsPerPilot=2;modulationOrder=2^bitsPerPilot;%---生成固定 QPSK 导频符号---pilotBits=randi([0,1],numPilots*bitsPerPilot,1);pilotSymbols=qammod(pilotBits,modulationOrder,'UnitAveragePower',true,'InputType','bit');%---初始发送向量(仅导频)用于 σ 初始粗略估计(可选)---txVector=zeros(totalSubcarriers,1);txVector(pilotIndices)=pilotSymbols;%---(可选)初始粗略选择 σ,但后续 BER 循环会自适应,此处可省略,保留原代码风格---%为保持与原代码一致,仍计算一个 initialSigma,但实际在 BER 循环中会重新选 mseValues=zeros(numTrials,numTests);averageMSE=zeros(numTests,1);fortestIndex=1:numTests currentSigma=sigmaValues(testIndex);fortrialIndex=1:numTrials channelResponse=generateRandomChannel(totalSubcarriers,avgDelaySpread,subcarrierSpacing);noiseVariance=db2pow(-signalToNoiseRatio);receivedSignal=channelResponse.*txVector+sqrt(noiseVariance/2)*(randn(totalSubcarriers,1)+1i*randn(totalSubcarriers,1));rawEstimates=receivedSignal(pilotIndices)./pilotSymbols;%使用修正后的 RBF 函数(新函数接口相同) estimatedChannel=performRBFKernelRegression(pilotIndices,rawEstimates,totalSubcarriers,currentSigma);mseValues(trialIndex,testIndex)=mean(abs(estimatedChannel-channelResponse).^2);endaverageMSE(testIndex)=10*log10(mean(mseValues(:,testIndex)));end[~,optimalIndex]=min(averageMSE);initialSigma=sigmaValues(optimalIndex);%仅作备选,实际循环会自适应%---仿真 OFDM 符号传输(RBF 核)---numOFDMSymbols=200;rng(1)%为了自适应 σ,我们在每个 SNR 下独立选择最佳 σ,使用高斯核作为参考(因为其计算准确)%但 RBF 和 Gaussian 使用相同的 σ,所以用 Gaussian 来选 σ 即可forsnrIndex=1:length(SNRRange)SNR=SNRRange(snrIndex);%---自适应选择当前 SNR 下的最优 σ(基于少量符号的 MSE)---%使用高斯核(准确实现)来评估不同 σ 的 MSE,然后 RBF 和 Gaussian 都使用此 σ optSigma=initialSigma;%默认 minMSE=inf;numEvalSymbols=10;%用于 σ 评估的符号数fors=1:numTests mseSum=0;forsymEval=1:numEvalSymbols%产生随机信道和接收信号(仅导频) chEval=generateRandomChannel(totalSubcarriers,avgDelaySpread,subcarrierSpacing);txEval=zeros(totalSubcarriers,1);txEval(pilotIndices)=pilotSymbols;noiseVar=db2pow(-SNR);rxEval=chEval.*txEval+sqrt(noiseVar/2)*(randn(totalSubcarriers,1)+1i*randn(totalSubcarriers,1));rawEval=rxEval(pilotIndices)./pilotSymbols;%使用高斯核估计 estEval=performGaussianKernelRegression(pilotIndices,rawEval,totalSubcarriers,sigmaValues(s));mseSum=mseSum+mean(abs(estEval-chEval).^2);endifmseSum<minMSE minMSE=mseSum;optSigma=sigmaValues(s);end endfprintf('SNR = %d dB, 自适应 σ = %.2f\n',SNR,optSigma);%---正式开始该 SNR 下的 BER 统计(RBF 核)---bitErrorsTrue=0;bitErrorsRBF=0;totalBits=0;forsymbolIndex=1:numOFDMSymbols%生成数据 dataBits=randi([0,1],(totalSubcarriers-numPilots)*bitsPerPilot,1);dataSymbols=qammod(dataBits,modulationOrder,'UnitAveragePower',true,'InputType','bit');txVector=zeros(totalSubcarriers,1);txVector(pilotIndices)=pilotSymbols;dataIndices=setdiff(1:totalSubcarriers,pilotIndices)';txVector(dataIndices)=dataSymbols;%信道和接收 channelResponse=generateRandomChannel(totalSubcarriers,avgDelaySpread,subcarrierSpacing);noiseVariance=db2pow(-SNR);receivedSignal=channelResponse.*txVector+sqrt(noiseVariance/2)*(randn(totalSubcarriers,1)+1i*randn(totalSubcarriers,1));%导频处原始估计 rawChannelEstimates=receivedSignal(pilotIndices)./pilotSymbols;%使用修正后的 RBF 核回归(新实现)和自适应 σ estimatedChannel=performRBFKernelRegression(pilotIndices,rawChannelEstimates,totalSubcarriers,optSigma);%均衡 equalizedSignalTrue=receivedSignal./channelResponse;equalizedSignalRBF=receivedSignal./estimatedChannel;%解调 receivedBitsTrue=qamdemod(equalizedSignalTrue(dataIndices),modulationOrder,'OutputType','bit','UnitAveragePower',true);receivedBitsRBF=qamdemod(equalizedSignalRBF(dataIndices),modulationOrder,'OutputType','bit','UnitAveragePower',true);%统计误比特 bitErrorsTrue=bitErrorsTrue+sum(dataBits~=receivedBitsTrue);bitErrorsRBF=bitErrorsRBF+sum(dataBits~=receivedBitsRBF);totalBits=totalBits+length(dataBits);endKBEREstimatedChannel(snrIndex)=bitErrorsRBF/totalBits;end4 总结
本文针对 OFDM 系统频域信道估计问题,对比了线性插值、高斯核回归与截断 RBF 核回归三种方法。仿真表明,核回归方法在中高信噪比下误码率性能优于线性插值,验证了其有效性。后续可进一步探索核宽度的在线自适应策略,以降低计算开销。
完整仿真代码可见往期文章文末VX公众号(包含往期博客所有代码),所见即所得