天天看點

QPSK/OFDM多徑時變信道仿真

文章目錄

    • 1.原理相關
    • 2.公式推導
    • 3.仿真實作與分析

此篇為信号通過多徑時變信道仿真,基礎篇可參考:

QPSK基礎與多徑信道Matlab仿真

OFDM基礎與多徑信道Matlab仿真

1.原理相關

多徑信道:信号通過多條路徑抵達接收端,由散射等引起,是時延。

時變信道:信道狀态随時間變化與發送序列對應,分為慢衰落信道和快衰落信道,由運動引起,是時變。

2.公式推導

  • 首先看通過時不變信道的卷積推導
  • 再類比推導時變信道的卷積方法
    QPSK/OFDM多徑時變信道仿真
QPSK/OFDM多徑時變信道仿真

3.仿真實作與分析

  • QPSK調制+時變信道+誤碼率仿真
close all;clc;
%% 參數設定
SNR=1:20;                             %信噪比變化範圍
snr=10.^(SNR/10);                     %将信噪比轉化成直角坐标
M=64;
N=100;
pathnum=3;
l_cp=pathnum+1;
w=zeros(2*M,N);
ww=zeros(2*M,N);
%% 初始序列生成qpsk調制
for ii=1:length(SNR)
    a=randi([0 1],1,2*M*N);
    a2= reshape(a,log2(4),[])';
    a10= bi2de(a2);
    xt=pskmod(a10,4,pi/4);
    x=reshape(xt,M,N);                  %M×N
    x1=zeros(M+l_cp,1);
    x2=zeros(M,1);
    for jj=1:N
        h=channel_generation(pathnum,M) %信道設定
        x2=x(:,jj);
        x1=[x2(M-l_cp+1:M);x2];         %+cp x1=[M+1_cp×1]
        %% 時變多徑信道
        yqq=zeros(M,1);
        yqql=zeros(M,1);
        cw3=1;
        for cw1=1:M
            cw2=cw3;
            for cw4=pathnum:-1:1
                yqq(cw1)=x1(cw2+2)*h(cw4,cw1);
                yqql(cw1)=yqql(cw1)+yqq(cw1);
                cw2=cw2+1;
            end
            cw3=cw3+1;
        end                             %經過時變信道+去cp
        %% 均衡矩陣
        H=zeros(M,M);
        for iv=1:M
            H1=zeros(1,M);
            H1(1)=h(1,iv);
            jv=2;
            for kv=M:-1:M-pathnum+2
                H1(kv)=h(jv,iv);
                jv=jv+1;
            end
            H(iv,:)=circshift(H1,iv-1); %每次求出一行(均按第一行形式)在循環移位
        end
        %% awgn
        [m,n]=size(yqql);
        N0=1/2/snr(ii);
        N0_dB=10*log10(N0);
        ni=wgn(m,n,N0_dB);
        ys=yqql+ni;
        
        %% 檢測解調
        %  %迫0均衡
        x_dect=pinv(H)*ys;               %均衡 Y=H·X→X=invH×Y  inv(A)*B=B/A;inv(B)*A=B\A
        xxx=reshape(x_dect,[],1);        %并串變換
        yj=pskdemod(xxx,4,pi/4);
        De_data1 = reshape(yj,[],1);
        De_data2 = de2bi(De_data1,2);
        w(:,jj)= reshape(De_data2',[],1);
        % MMSE均衡
        [nn,mm]=size(H*H');
        W=H'*pinv(H*H'+1/SNR(ii)*eye(nn,mm));
        wx_dect=W*ys;
        wwx=reshape(wx_dect,[],1);       %并串變換
        wyj=pskdemod(wwx,4,pi/4);
        wDe_data1 = reshape(wyj,[],1);
        wDe_data2 = de2bi(wDe_data1,2);
        ww(:,jj)= reshape(wDe_data2',[],1);
    end
    q=reshape(w,1,2*M*N);
    [number1,BER_ZF(ii)] = symerr(a,q);    %計算錯誤比特數和誤碼率
    wq=reshape(ww,1,2*M*N);
    [number1,BER_MMSE(ii)] = symerr(a,wq); %計算錯誤比特數和誤碼率
end
BER_ZF
BER_MMSE
%% 繪制圖形
figure;
semilogy(SNR,BER_ZF,'-r*');hold on;
semilogy(SNR,BER_MMSE,'-g*');hold on;
% text(10,0.01,'MMSE');
axis([-1,20,10^-4,1]);
title('誤碼性能分析');
xlabel('信噪比SNR(dB)');ylabel('誤碼率BER');
           

運作結果:

QPSK/OFDM多徑時變信道仿真
  • OFDM調制+時變信道+誤碼率仿真
close all;clc;
%% 參數設定
SNR=1:20;                   %信噪比變化範圍
snr=10.^(SNR/10);           %将信噪比轉化成直角坐标
M=64;%Nfft
N=100; %符号數
pathnum=2 ;
l_cp=pathnum+1;                       %保護間隔長度
BER_S=zeros(1,length(SNR));           %誤碼率
BER_Ss=zeros(1,length(SNR));          %誤碼率
%H=[];y6=[];y_dect=[];
%w=zeros(2*M,N);
ws=zeros(2*M,N);
%% 初始序列生成qpsk調制
for ii=1:length(SNR)
    a=randi([0 1],1,2*M*N);
    a2= reshape(a,log2(4),[])';
    a10= bi2de(a2);
    xt=pskmod(a10,4,pi/4);
    x=reshape(xt,M,N);              %M×N
    x1=zeros(M+l_cp,1);
    x2=zeros(M,1);
    for jj=1:N
        
        h=channel_generation(pathnum,M) %信道設定
        
        %         hh=(randn(pathnum,1)+1i*randn(pathnum,1))*sqrt(1/2/pathnum);
        %         for tcv=1:M
        %             h(:,tcv)=hh;
        %         end                             %時不變信道信道設定-測試Y和H的生成
        
        x2=x(:,jj);
        x2i=ifft(x2)*sqrt(M);%ifft
        x1=[x2i(M-l_cp+1:M);x2i];              %+cp x1=[M+1×1]
        %% 時變多徑信道
        yqq=zeros(M,1);
        yqql=zeros(M,1);
        cw3=1;
        for cw1=1:M
            cw2=cw3;
            for cw4=pathnum:-1:1
                yqq(cw1)=x1(cw2+2)*h(cw4,cw1);
                yqql(cw1)=yqql(cw1)+yqq(cw1);
                cw2=cw2+1;
            end
            cw3=cw3+1;
        end                                         %經過時變信道+去cp
        %% 均衡矩陣
        H=zeros(M,M);
        for iv=1:M
            H1=zeros(1,M);
            H1(1)=h(1,iv);
            jv=2;
            for kv=M:-1:M-pathnum+2
                H1(kv)=h(jv,iv);
                jv=jv+1;
            end
            H(iv,:)=circshift(H1,iv-1); %每次求出一行(均按第一行形式)在循環移位
        end
        %% awgn
        [m,n]=size(yqql);
        N0=1/2/snr(ii);
        N0_dB=10*log10(N0);
        ni=wgn(m,n,N0_dB);
        ys=yqql+ni;
        
        %% 檢測解調
        %% 均衡1(相位)
        % HH=fft(h,M)  ;
        % y6= fft(ys)/sqrt(M);
        % y_dect=y6.*conj(HH);                      %信道估計+均衡
        % y7=reshape(y_dect,[],1);                 %并串變換
        % yj=pskdemod(y7,4,pi/4);                  %qpsk解調
        % De_data1 = reshape(yj,[],1);
        % De_data2 = de2bi(De_data1,2);
        % w(:,jj)= reshape(De_data2',[],1);      %轉換同輸入a形式,便于誤碼率計算
        %% 均衡2 Y=Hd*H*Hid*X+Hd*N
        [sss,sssss]=size(H);
        % fft(H(:,1));
        dftmtx(sss);
        
        Hs=dftmtx(sss)*H*dftmtx(sss)'
        y6s= fft(ys)/sqrt(M);
        
        y_dects=pinv(Hs)*y6s;                         % 均衡*HS^-1
        
        y7s=reshape(y_dects,[],1);
        yjs=pskdemod(y7s,4,pi/4);
        De_data1s = reshape(yjs,[],1);
        De_data2s = de2bi(De_data1s,2);
        ws(:,jj)= reshape(De_data2s',[],1);
    end
    
    qs=reshape(ws,1,2*M*N);
    [number1,BER_Ss(ii)] = symerr(a,qs);   %計算錯誤比特數和誤碼率
end
BER_Ss
%% 繪制圖形
figure
semilogy(SNR,BER_Ss,'-g*');hold on;
%text(10,0.01,'MMSE');
axis([-1,20,10^-4,1]);
title('誤碼性能分析');
xlabel('信噪比SNR(dB)');ylabel('誤碼率BER');
           
channel_generation為時變信道産生函數。最終當信道變化慢時信道矩陣Hs理應仍為對角矩陣,但本程式結果并不明顯,并且誤碼率變化好像也有悖理論分析,仍需學習糾正完善。
兩種仿真非常類似,隻是OFDM多了其應有的部分,H與Y輸出的方式是相同的。

相關博文

  1. QPSK基礎與多徑信道Matlab仿真
  2. OFDM基礎與多徑信道Matlab仿真

繼續閱讀