OFDM通信系统与QPSK系统性能比较

  正交频分复用(OFDM) 是第四代移动通信的核心技术。本文首先简要介绍了OFDM基本原理,并对OFDM的系统框架进行了分析,其中包括调制、解调以及IFFT、FFT的数学模型实现。接着重点用MATLAB语言实现了整个系统基于QPSK调制技术的计算机仿真,分析该系统的信噪比及PAPR的分布。最后对QPSK调制解调系统进行了仿真,对两种系统的性能进行了比较。仿真结果表明:OFDM频带利用率高,误码率高,功率利用率下降,而QPSK频带利用率低,误码率低,功率利用率升高。

  

OFDM的全称为Orthogonal Frequency Division Multiplexing,意为正交频分复用。OFDM的思想可以追溯到20世纪60年代,当时人们对多载波调制做了许多理论上的工作,论证了在存在符号间干扰的带限信道上采用多载波调制可以优化系统的传输性能。进入20世纪90年代,由于数字信号处理技术和大规模集成电路技术的进步,OFDM技术在高速数据传输领域受到了人们的广泛关注。现在OFDM已经在欧洲的数字音视频广播(如DAB和DVB)、欧洲和北美的高速无线局域网系统(如HIRERLAN2、IEEE802.11a)、高比特率数字用户线(如ADSL、VDSL)以及电力线载波通信中得到了广泛的应用。

OFDM通信技术是多载波传输技术的典型代表。多载波传输把数据流分解为若干个独立的子比特率,每个子数据流将具有低得多的比特速率,用这样低比特率形成的低速率多状态符号去调制相应的子载波,就构成了多个低速率符号并行发送的传输系统。OFDM是多载波传输方案的实现方式之一,利用快速傅里叶逆变换(IFFT)和快速傅里叶变换(FFT)来分别实现调制和解调,是实现复杂度最低、应用最广的一种多载波传输方案。

    1. 正交调制解调

OFDM是一种特殊的多载波传送方案,单个用户的信息流被串/并变换为多个低速率码流,每个码流都用一条载波发送。OFDM弃用传统的用带通滤波器来分隔子载波频谱的方式,改用跳频方式选用那些即便频谱混叠也能够保持正交的波形,因此,OFDM既可以当作调制技术,也可以当作复用技术。OFDM增强了抗频率选择性衰落和抗窄带干扰的能力。为了提高频谱利用率,OFDM方式中各个子载波频谱有1/2重叠,但保持相互正交,在接收端通过相关解调分离出各个子载波,同时消除码间干扰的影响。

OFDM是一种多载波调制技术,其原理是用N个子载波把整个信道分割成N个子信道,即将频率上等间隔的N个子载波信号调制并相加后同时发送,实现N个信道并行传输信息。这样每个符号的频谱只占用信道带宽的1/N,且使各子载波在OFDM符合周期T内保持频谱的正交性。即满足:

%main_OFDM.m

%OFDM通信系统的仿真设计,包括QPSK或QAM数字调制、IFFT、

%保护间隔、高斯信道建模、FFT、解调、计算信噪比及PAPR

clear all;

%+++++++++++++++++++++++++++++++++++++++++++++++++

%seq_num

%SNR_Pre                设定用于仿真的信噪比的初值

%interval_SNR           设定用于仿真的信噪比间隔

%frame_num           每一个信噪比下仿真的数据的帧数

%Pe                 用于计算出现的误比特数

%N                   子载波数

%+++++++++++++++++++++++++++++++++++++++++++++++++

N=64;

SNR_Pre=1;

interval_SNR =1;

Pe=zeros(1,20);

 

%发射机

frame_num =5000;

for SNR_System=SNR_Pre:interval_SNR:20

      counter=0;

    for seq_num=1:frame_num

        %+++++++++++++++输入数据++++++++++++

        datain=randint(1,N);

        %+++++++++++++++++++++++++++++++++++

        

        %++++++++++++++QPSK调制++++++++++++++

       qpskin=reshape(datain,2,[]);%将生成序列变成两行

       qpskflection=(ones(2,N/2)).*(-1);

       qpskflection=qpskflection.^qpskin;%0--1;1---1

       qpskflection(2,:)=j*qpskflection(2,:);

       qpskout=sum(qpskflection);

        %+++++++++++++++++++++++++++++++++++++++

       

        %++++++++++++++++扩展++++++++++++++++++

        ifftin=zeros(1,N);

        ifftout=zeros(1,N);

       for k=1:N  %将输入的N/2点扩展为共轭对称的N点

             if (33>k>=1)

                if(k==1)

                    ifftin(1)=qpskflection(1,1);

                else

                    ifftin(k)=qpskout(k);

                end

            else

                if(k==33)

                    ifftin(k)=(-1)*j*qpskflection(2,1);

                else

                    ifftin(k)=conj(qpskout(N+2-k));

                end

            end

       end

            %+++++++++++++++++++++++++++++++++++++

           

            %+++++++++++++++++IFFT+++++++++++++++++

            ifftout=ifft(N*ifftin);

          %+++++++++++++++++++++++++++++++++++++++ 

      

         %+++++++++++++++加入保护间隔++++++++++++++++++++

         clength=N+N/16;

         PVout=zeros(1,clength);

         col=(N-N/16+1):(N);

         PVout=[ifftout(col),ifftout];

         %++++++++++++++++++++++++++++++++++++++++++++++++

       

         %+++++++++++++++++高斯白噪声信道+++++++++++++++++

         gsrv=awgn(PVout,SNR_System,'measured');

         %+++++++++++++++++++++++++++++++++++++++++++++++++

       

      %接收机

%+++++++++++++++++++++去保护间隔++++++++++++++++++++++++

      movep=zeros(1,N);

      length=(N/16+1):(N+N/16);

      movep=gsrv(length);

      %++++++++++++++++++++++++++++++++++++++++++++++++++++++

      %+++++++++++++++++++++FFT++++++++++++++++++++++++++++

      fftout=(fft(movep))/N;

      %++++++++++++++++++++++++++++++++++++++++++++++++++++++

     

%+++++++++++++++QPSK解调++++++++++++++++++++++++++++

      %outsign=qpskout(fftout,count,k);

      count=1;

      K=1;

      %判决门限取0

    if((fftout(K))>=0)

        outsign(count)=0;

        count=count+1;

    else

        outsign(count)=1;

        count=count+1;

    end

        if((fftout(N/2+1))>0)

            outsign(count)=0;

            count=count+1;

        else

        outsign(count)=1;

        count=count+1;

        end

    for K=2:N/2

        realpart=real(fftout(K));

        imagpart=imag(fftout(K));

        if(realpart>=0)

            outsign(count)=0;

            count=count+1;

        else

            outsign(count)=1;

            count=count+1;

        end

        if(imagpart>=0)

            outsign(count)=0;

            count=count+1;

        else

            outsign(count)=1;

            count=count+1;

        end

    end

      %+++++++++++++++++++++++++++++++++++++++++++++++

        

      %++++++++++++++++++计算误码率++++++++++++++++++++++++

       for k=1:N

        if(outsign(k)~=datain(k))

            counter=counter+1;

        end

    end

  end

  Pe(SNR_System)=counter/(N*frame_num);

end

     %画图

       figure

       plot(Pe,'b');

       xlabel('信噪比');

       ylabel('误码率');

       title('不同信噪比下的误码率');

       grid on;

 

%********************** preparation part ***************************

para=64;   % Number of parallel channel to transmit (points)

fftlen=64; % FFT length

nd=1;       % Number of information OFDM symbol for one loop

ml=2;       % Modulation level : QPSK

gilen=8;   % Length of guard interval (points)

 

%**************************Data generation ****************************

seldata=rand(1,para*nd*ml)>0.5;  %  rand : built in function

 

%****************** Serial to parallel conversion ***********************

paradata=reshape(seldata,para,nd*ml); %  reshape : built in function

 

%************************** QPSK modulation *************************

[ich,qch]=qpskmod(paradata,para,nd,ml);

kmod=1/sqrt(2); %  sqrt : built in function

ich1=ich.*kmod;

qch1=qch.*kmod;

 

%******************* IFFT ************************

x=ich1+qch1.*i;

y=ifft(x);      %  ifft : built in function

ich2=real(y);   %  real : built in function

qch2=imag(y);   %  imag : built in function

 

%********* Gurad interval insertion **********

[ich3,qch3]= giins(ich2,qch2,fftlen,gilen,nd);

fftlen2=fftlen+gilen;

N=fftlen2*nd*ml;

y=ich3+qch3*i;

 

N=64;

fs=10240000;  % Symbol rate

df = fs/N;

f1 = 0:df:(N-1)*df;

y1=ich3+qch3*i;

z1 = fft(y1,N);

figure;

plot(f1,abs(z1),'r--');

xlabel('f');ylabel('幅度谱');

legend('原信号');

 

N=64;

fs=10240000/2;  % Symbol rate

df = fs/N;

f2 = 0:df:(N-1)*df;

y2=ich+qch*i;

z2 = fft(y2,N);

figure;

plot(f2,abs(z2),'r--');

xlabel('f');ylabel('幅度谱');

legend('QPSK后的信号');

 

N=fftlen2;

fs=10240000/2/64;  % Symbol rate

df = fs/N;

f3 = 0:df:(N-1)*df;

y3=ich3+qch3*i;

z3 = fft(y3,N);

figure;

plot(f3,abs(z3),'r--');

xlabel('f');ylabel('幅度谱');

legend('OFDM后的信号');

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值