%%实现SC和OFDM两种情况下的MMSE 均衡适合初学者 %% Yuan@FD clear;clc;
%已知信道A的参数
ChannelA=[0.04;-0.05;0.07;-0.21;-0.5;0.72;0.36;0.0;0.21;0.03;0.07]; ChannelB=[0.74;-0.42;0.083;0.49;-0.12;0.01]; %设置基本参数
N=1024; %载波总数
VC=0; %虚拟子载波数量 S=N-VC; %数据子载波数量 M=4; %采用QPSK CP=length(ChannelA)-1; %循环前缀
Itr=100; %仿真大循环次数 SNR_dB=0:1:16; %信噪比
bErr=zeros(length(SNR_dB),Itr); % 初始化比特误码率 bErr4SC=zeros(length(SNR_dB),Itr); % 初始化比特误码率 ChAInFreq=fft(ChannelA,N); %已知信道的频域信息
for index=1:length(SNR_dB) forloopNum=1:Itr
% 产生信号 SignalDate=randint(S,1);
ModData=pskmod(SignalDate,M);
SignalSeq=[zeros(VC/2,1);ModData;zeros(VC/2,1)];
%对于OFDM,先ifft变换 Signal2ifft=ifft(SignalSeq,N);
%插入循环前缀为了消除ISI
Signal2Tr=[Signal2ifft(N-CP+1:N);Signal2ifft]; Signal2Tr4SC=[SignalSeq(N-CP+1:N);SignalSeq];
%经过信道,添加白噪声
Signal2Re=filter(ChannelA,1,Signal2Tr);
Signal2Re4SC=filter(ChannelA,1,Signal2Tr4SC); % Signal2Re=Signal2Tr;
Signal2Get=awgn(Signal2Re,SNR_dB(index)- db(std(Signal2Re)));
Sg2Get4SC=awgn(Signal2Re4SC,SNR_dB(index)- db(std(Signal2Re4SC)));
%去掉循环前缀,对于OFDM,采用fft变换得到待分析信号
Signal2RemoveCP=Signal2Get(CP+1:N+CP);
%对于SC,先FFT,均衡,然后IFFT
Sg2RemoveCP4SC=Sg2Get4SC(CP+1:N+CP); Sg4SC2FFT=fft(Sg2RemoveCP4SC);
Signal2analyse=fft(Signal2RemoveCP,N);
%采用MMSE进行均衡,信道一样,均衡参数Ck一样
Ck=conj(ChAInFreq)./(conj(ChAInFreq).*ChAInFreq+10^-(SNR_dB(index)/10));
SeqHat=Signal2analyse.*Ck;
SeqHat4SC=Sg4SC2FFT.*Ck;
DataHat=SeqHat(VC/2+1:VC/2+S);
%对于SC,再经过IFFT然后解调映射 DataHat4SC=ifft(SeqHat4SC);
%对于数据子载波上的信号进行解调,得到估计信号,计算误比特率 % ReceivedDate=pskdemod(DataHat,M); ReceivedDate=pskdemod(DataHat,M);
ReceivedDate4SC=pskdemod(DataHat4SC,M);
[nErrbErr(index,loopNum)] = symerr(ReceivedDate,SignalDate);
[nErr1 bErr4SC(index,loopNum)] = symerr(ReceivedDate4SC,SignalDate); end end
f1 = figure(1);
semilogy(SNR_dB,mean(bErr'),'b->') xlabel('SNR in dB'); ylabel('Bit Error Rate') grid on hold on
semilogy(SNR_dB,mean(bErr4SC'),'g-*')