基于OFDM+16QAM的通信链路matlab仿真

目录

一、理论基础

二、核心程序

三、仿真结论


一、理论基础

       在通信系统中,信道所能提供的带宽通常比传送一路信号所需的带宽要宽得多。如果一个信道只传送一路信号是非常浪费的,为了能够充分利用信道的带宽,就可以采用频分复用的方法。
OFDM主要思想是:将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。正交信号可以通过在接收端采用相关技术来分开,这样可以减少子信道之间的相互干扰(ISI) 。每个子信道上的信号带宽小于信道的相关带宽,因此每个子信道上可以看成平坦性衰落,从而可以消除码间串扰,而且由于每个子信道的带宽仅仅是原信道带宽的一小部分,信道均衡变得相对容易。在向B3G/4G演进的过程中,OFDM是关键的技术之一,可以结合分集,时空编码,干扰和信道间干扰抑制以及智能天线技术,最大限度的提高了系统性能。包括以下类型:V-OFDM, W-OFDM, F-OFDM, MIMO-OFDM,多带-OFDM。
        OFDM中的各个载波是相互正交的,每个载波在一个符号时间内有整数个载波周期,每个载波的频谱零点和相邻载波的零点重叠,这样便减小了载波间的干扰。由于载波间有部分重叠,所以它比传统的FDMA提高了频带利用率。
        在OFDM传播过程中,高速信息数据流通过串并变换,分配到速率相对较低的若干子信道中传输,每个子信道中的符号周期相对增加,这样可减少因无线信道多径时延扩展所产生的时间弥散性对系统造成的码间干扰。另外,由于引入保护间隔,在保护间隔大于最大多径时延扩展的情况下,可以最大限度地消除多径带来的符号间干扰。如果用循环前缀作为保护间隔,还可避免多径带来的信道间干扰。
        在OFDM系统的发射端加入保护间隔,主要是为了消除多径所造成的ISI。其方法是在OFDM符号保护间隔内填入循环前缀,以保证在FFT周期内OFDM符号的时延副本内包含的波形周期个数也是整数。这样时延小于保护间隔的信号就不会在解调过程中产生ISI。由于OFDM技术有较强的抗ISI能力以及高频谱效率,2001年开始应用于光通信中,相当多的研究表明了该技术在光通信中的可行性。

        IEEE 802.11a或标准称之为IEEE 802.11a-1999,是802.11原始标准的一个修订标准,于1999年获得批准。802.11a的传输技术为多载波调制技术。802.11a标准是已在办公室、家庭、宾馆、机场等众多场合得到广泛应用的802.11b无线联网标准的后续标准。它工作在5GHzU-NII频带,物理层速率可达54Mb/s,传输层可达25Mbps。可提供25Mbps的无线ATM接口和10Mbps的以太网无线帧结构接口,以及TDD/TDMA的空中接口;支持语音、数据、图像业务;一个扇区可接入多个用户,每个用户可带多个用户终端。IEEE 无线网络标准,指定最大 54Mbps 的数据传输速率和 5GHz 的工作频段。

        OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,实际上OFDM是MCM(Multi Carrier Modulation),多载波调制的一种。通过频分复用实现高速串行数据的并行传输, 它具有较好的抗多径衰落的能力,能够支持多用户接入。OFDM技术由MCM(Multi-Carrier Modulation,多载波调制)发展而来。OFDM技术是多载波传输方案的实现方式之一,它的调制和解调是分别基于IFFT和FFT来实现的,是实现复杂度最低、应用最广的一种多载波传输方案。

      OFDM主要思想是:将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。正交信号可以通过在接收端采用相关技术来分开,这样可以减少子信道之间的相互干扰(ISI) 。每个子信道上的信号带宽小于信道的相关带宽,因此每个子信道上可以看成平坦性衰落,从而可以消除码间串扰,而且由于每个子信道的带宽仅仅是原信道带宽的一小部分,信道均衡变得相对容易。

       OFDM是一种特殊的多载波传输方案。OFDM应用DFT和其逆变换IDFT方法解决了产生多个互相正交的子载波和从子载波中恢复原信号的问题。这就解决了多载波传输系统发送和传送的难题。应用快速傅里叶变换更使多载波传输系统的复杂度大大降低。从此OFDM技术开始走向实用。但是应用OFDM系统仍然需要大量繁杂的数字信号处理过程,而当时还缺乏数字处理功能强大的元器件,因此OFDM技术迟迟没有得到迅速发展。

        OFDM采用BPSK、QPSK、16QAM、64QAM4种调制方式。按照星座图,将每个子信道上的数据,映射到星座图点的复数表示,转换为同相Ich和正交分量Qch。以16QAM星座为例,bits_per_symbol=4,则每个OFDM符号的每个子信道上有4个二进制数{d1,d2,d3,d4},共有16种取值,对应星座图上16个点,每个点的实部记为Qch。为了所有的映射点有相同高的平均功率,输出要进行归一化,所以对应BPSK,PQSK,16QAM,64QAM,分别乘以归一化系数系数1,, , .输出的复数序列即为映射后的调制结果。

        对上一步得到的相同分量和正交分量按照(Ich+Qch*i)进行IFFT运算。并将得到的复数的实部作为新的Ich,虚部作为新的Qch。

         在实际运用中, 信号的产生和解调都是采用数字信号处理的方法来实现的, 此时要对信号进行抽样, 形成离散时间信号。 由于OFDM信号的带宽为B=N·Δf, 信号必须以Δt=1/B=1/(N·Δf)的时间间隔进行采样。 采样后的信号用sn,i

       t=1/B=1/(N·Δf)的时间间隔进行采样。 采样后的信号用sn,i表示, i = 0, 1, …, N-1,则有

       

        从该式可以看出,它是一个严格的离散反傅立叶变换(IDFT)的表达式。IDFT可以采用快速反傅立叶变换(IFFT)来实现 

         由IFFT运算后的每个符号的同相分量和正交分量分别转换为串行数据,并将符号尾部G长度的数据加到头部,构成循环前缀。如果加入空的间隔,在多径传播的影响下,会造成载波间干扰ICI。保护见个的长度G应该大于多径时的扩张的最大值。

二、核心程序

..............................................................
rand('state',sum(100*clock));%?
N_DBPS = 96;
N_SPF = 20;  % Number of OFDM symbols per fram 
frame_num = 10;
N_DBPF = N_DBPS * N_SPF - 6;   % Data bits per frame,minus the 6 tail bits to return the convolutional encoder to the "zero state"
fprintf('\nFrame size is %d OFDM symbols, and %d bits\n ',N_SPF, N_DBPF);
T_sym = 4 * 1e6;           % OFDM symbol period is 4us
fc = 5.2e9;                % Carrier frequency 5.2GHz
v = 2.7e3/3600;            % Vehicle speeed, 2.7km/h
f_max = v/3e8*fc;          % Maximum Dopper frequency, 13Hz 
T_start = rand(1) * 10^(-6);                    % A random starting time for simulation
channel_option = 1;
channel_response = channel_model(channel_option,f_max,frame_num,T_sym,T_start);   % Channel response of multipath Rayleigh fading channel during the simulation
                                                                                  % Assuming the channel response is invariant during one frame
pilot_sym = pilot_generator(128);               % Generate the pilot symbols, all in BPSK modulation
pilot_syms=pilot_sym';
pilot_syms=pilot_syms(:)';

for snr = 0:2:40
    nframe = 0;
    nerror = 0;
    while nframe < frame_num
        [nframe,snr,frame_num]
        %======================
        %      Transmitter
        %======================
        info_bits = round(rand(1, N_DBPF));     % Generate the information bites randomly
        tail = zeros(1,6);                      % Tail bits for convolutional encoder
        info_bits = [info_bits tail];           % Append the tail bits to the infomation bits
        trl = poly2trellis(7,[133 171]);        % Trellis structure of convolutional encoder,
                                                % Constraint length K = 7,generator polynomial in octal g0 = 133, g1 = 171
        code_bits = convenc(info_bits, trl);    % Convolutional encoder,rate R = 1/2
        TX = tx_16qam_mod(code_bits); % 16-QAM modulation
        if nframe==1
        figure(1)
        a=real(TX);
        b=imag(TX);
        plot(a,b,'bx')
        end
        pilot_num = 1;               % The start number of the cyclic pilot symbols 
        tx = tx_fre_to_time(TX,N_SPF,pilot_syms,pilot_num);    % Serial to parallel,Add pilot symbols, IFFT ( Oversampling),Add cyclic prefix                                      
        %======================
        %     Channel
        %======================
        temp_channel = channel_response(:,nframe+1).'; % Channel response at the current frame
        ry = channel_multipath(tx,temp_channel);      % Multi-path channel
        ry = awgn(ry,snr);                            % Add addictive white gaussian noise
        %======================
        %      Receiver
        %======================
        [RY,R_pilot] = ry_time_to_fre(ry,N_SPF,temp_channel); % Recover the time signal to frequency symbols of each subcarrier and Channel Equalization
        if nframe==1
        figure(2)
        a=real(RY);
        b=imag(RY);
        plot(a,b,'bx')
        axis([-2 2  -2 2]);
         end
        
        Rcode_bits = ry_16qam_demod(RY);                        % Demodulate the received symbols
        dec_bits = ry_sovadec(Rcode_bits, trl, N_DBPF,N_DBPF);  % Soft output viterbi decoding, out = ln( p(info_bits(i)=1)/p(info_bits(i)=0));
        %======================
        %   Error detection
        %======================      
        for i = 1:N_DBPF
            if dec_bits(i) >= 0
                hard_det(i) = 1;                                % hard_det refers to the hard decision   
            else 
                hard_det(i) = 0;
            end
            if hard_det(i) ~= info_bits(i)
                nerror = nerror+1;
            end
        end
        nframe = nframe + 1;
    end
    
    BER([snr/2+1]) = nerror/(frame_num * N_DBPF);
    fprintf('\nSNR is %1.2f dB, BER is %e\n ',snr,BER);
end

figure;
semilogy(0:2:40,BER,'b-o');
grid on

xlabel('SNR');
ylabel('error');
up136

三、仿真结论

 

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/130170345
今日推荐