多载波CDMA技术

在无线环境中,由于存在多径效应的影响,到达接收机的信号由一些不同路径到达的信号混叠而成这些导致了信号的失真,这就是多径干扰。码分多址技术则将窄带信号和扩频码相乘将信号变化为宽带信号后再发射的技术,具有抗多址能力强和软切换等特点。但是随着技术的不断的发展,受制于其本身的特点,CDMA难于实现高速传输,传统的CDMA系统已经无法满足需求了。随着第四代移动通信的发展,以OFDM技术为准的技术利用了多径效应的频域特性,使其频域均衡变得更加容易实现,使整个系统更加适合高速环境下的传输。但是无论是CDMA技术还是OFDM技术,都存在自身的缺陷,所以在现代通信系统中,越来越多的是将两者结合起来,结合各自的优势达到最佳的传输效果,这就是多载波CDMA技术,本章将重点研究OFDM技术和多载波CDMA技术,为多载波系统的单用户检测技术的研究跌点基础。

2.1 OFDM技术

2.1.1 OFDM基本原理

在传统的多址接入方式中,常用的技术是FDM,即频分多址技术。其主要功能就是将整个带宽分为多个频率互不重叠的子信道,然后单独对每个信号进行独立的调制。这种技术的特点是频率上的互不重叠从而防止了信道间干扰,但这降低了频谱利用率,浪费了大量的带宽资源。针对这个问题,为了提高频谱的利用率,可以考虑将频谱进行重叠,但是为了防止互相干扰,必须让每个子信道之间是正交的。从而发展处了OFDM技术,这就是多载波调制技术,即OFDM技术。

在OFDM中,整个带宽被分为N个正交子载波,每一个子载波的数据传输波特率为1/Ts,此外,相邻两个子载波之间的中心频率间隔也为1/Ts,这就实现了子载波的正交性要求。同时,使用OFDM技术,其是将N个子载波进行同时传输,即并行传输的,这样就能降低每个子载波的传输速率。所以OFDM技术可以将高速率传输变为N个低速率传输。这样还大大降低了系统接收机的实现复杂性。此外,OFDM技术也是多载波CDMA技术的基础,因此,在这里首先介绍OFDM技术。

2.1.2 OFDM系统的实现

OFDM技术在接收端进行和发送相反的操作,将接收到的OFDM信号通过FFT傅里叶变换将其变为为频域信号,子载波的幅度和相位被采集出来并转换回数字信号。完整的OFDM系统的物理结构框图如图2.2所示:

2.1.3 OFDM技术中的傅里叶变换的实现

傅里叶变换的主要作用就是将时域和频域进行快速的转换,对于数字信号处理,一般都是用的是离散傅里叶变换,即DFT。离散傅里叶变换过程中,信号在时域和频域上均被抽样。根据其特性,时域上信号的重复,就会导致频域频域的重复。随着数字电子技术的发展,在现代通信系统中,通过是用FFT来进行傅里叶变换,FFT即快速傅里叶变换时一种快速的傅里叶算法,目前已经广泛应用于OFDM系统中。

3.3 多址干扰

CDMA系统在工作中会收到干扰而限制系统自身,这种干扰以多址干扰为主,如何消除这种干扰,能够很大程度上提高系统的性能。所有基于CDMA的系统而言都是相同的,多载波CDMA在实质上也会收到多址干扰的限制。而且其情况比最基本的CDMA系统更为复杂。在本课题所讨论的多载波CDMA系统中,产生多址干扰产生的主要因素为:非同步传输,频率选择性衰落,非正交扩频码,功率控制不完善等

首先,在实际系统中,正交扩频的个数一般都无法满足大用户量的需求,所以在实际中往往使用伪随机正交码代替正交码,伪正交扩频码之间的非正交性会导致多址干扰。此外,功率控制不完善也会带来远近效应。

其次,在多径传播的时候,多径会引起频率选择性衰落,这使得子载波有不同的幅度电平和不同的相移,导致不同的用户之间正交性减弱最后导致其失去正交性,从而导致了多址干扰。尤其在非同步传输的情况下,会导致更为严重的多址干扰问题,同时还会产生比较严重的ICI问题。

再次,系统的同步误差和定时误差,包括帧同步、频率同步、和时钟同步误差等都能带来不同程度的ICI,影响载波间正交性,导致多址干扰。

从以上分析可知,多址干扰的存在将严重影响了多载波CDMA系统的性能,而多用户检测是CDMA系统中可以有效克服多址干扰的一项关键技术,研究用户检测具有十分重要的意思。

Main01.m

clc;

clear;

close all;

N=8

T=1e-3;

Ts=T+1/4*T;

f=(-N:N)/T;

color = ['r','g','b','k','y','m','c','r'];

for k=1:7

y(k,:)     = sinc((f - (k-N/2)/T)*Ts);

plot(f/1000,y(k,:),color(k));

hold on;

end

title('7个载波的OFDM信号的频谱');

Main02.m

clc;

close all;

clear;

N = 10;

for i =2:N

y1(i) = i*i;

y2(i) = (i/2)*log2(i);

end

figure;

plot(y1,'r-*');hold on;

plot(y2,'b-*');hold off;

title('IFFT和IDFT的计算量对比');

grid on;

legend('IDFT运行次数','IFFT运行次数');

Main03.m

clc;

clear;

close all;

tic;

num_data=64000;%仿真数据长度

num_user=1;    %用户个数

snr=[0 1 2 3 4 5 6 7];%SNR

for t=1:length(snr)

    ber(t) = mc_cdma(snr(t),num_user,num_data);

end

% EbNo = 0:5:20;

figure;

semilogy(snr,ber,'b-*');

xlabel('Eb/N0');

ylabel('BER');

title('Performance of MC-CDMA ')

grid on

toc;

mc_cdma.m

function ber = mc_cdma(snr,num_user,num_data)

N = 512;           % number of symbols in a single OFDM symbol

GI = 80;           % guard interval

Mt = 1;             % number of Tx antennas

Mr = 1;             % number of Rx antennas

M = 8;              % max constellation bit number

num_subc = 8;        % number of subcarriers

mod_level = 2;

spreadLength=8;

% snr=0;

en = 10^(snr/10);

sigma = 1/sqrt(2*en);

cSpread=[1 1 1 1 1 1 1 1;1 -1 1 -1 1 -1 1 -1;...

        1 1 -1 -1 1 1 -1 -1;1 -1 -1 1 1 -1 -1 1;...

        1 1 1 1 -1 -1 -1 -1;1 -1 1 -1 -1 1 -1 1;...

        1 1 -1 -1 -1 -1 1 1;1 -1 -1 1 -1 1 1 -1];

multipath = [sqrt(0.1897)  0  sqrt(0.3785) 0 0 sqrt(0.2388) 0 0 0  0 sqrt(0.0951) 0 0 0 0 sqrt(0.06) 0 0 0 0 0 0 sqrt(0.0379)]; %% power

multipath_channel0 = zeros(1,length(multipath));

signal_tx = zeros(num_data*spreadLength/N,N + GI);

for loop_user=1:num_user

    msg    = randint(num_data,1);

    code1  = [];

    trel   = poly2trellis(6,[53 75]);

    code1  = [code1 convenc(msg,trel)];

    code   = code1';

    if loop_user == 1

        msg_user1 = msg;

        code_user1 = code1;

    end

    num_data1   = 2*num_data;

    [iout,qout] = qpsk(code,1,num_data1,mod_level);

    inputData   = iout+i*qout;    %???

    [S]         = mc_spreading(inputData,1,num_data,cSpread(loop_user,:),spreadLength);

    for m=1:num_data*spreadLength/N

        ofdm_symbol((m-1)*(N+GI)+1:m*(N+GI)) = ifft_cp_tx_blk(S((m-1)*N+1:m*N),N,GI)*sqrt(N);

    end

    for p = 1:(num_data*spreadLength/N) 

        multipath_channel(p,:) = multipath.*(randn(1,length(multipath_channel0))+j*randn(1,length(multipath_channel0)))*sqrt(0.5);

        if loop_user==1

            multipath_channel_user1(p,:) = multipath_channel(p,:);

        end

        signal_tx_p         = filter(multipath_channel(p,:),[1],ofdm_symbol((N+GI)*(p-1)+1:(N+GI)*p));% passing through the multipath channel

        signal_tx_loop(p,:) = signal_tx_p;

    end

    signal_tx           = signal_tx + signal_tx_loop;

end

noise     = sigma*(randn(num_data*spreadLength/N,N+GI) + j*randn(num_data*spreadLength/N,N+GI));

signal_rx = signal_tx + noise;

y2 = [];

for q =1:(num_data*spreadLength/N)

    rec_symbol   = [];

    rec_symbol   = [rec_symbol; fft_cp_rx_blk(signal_rx(q,:),N,GI)/sqrt(N)];

    rec_symbol2  = reshape(rec_symbol,Mt*N,1);

    h   = [multipath_channel_user1(q,:),zeros(1,N+GI-length(multipath))];

    Hf1 = fft(h,N);

    for n = 1:N/spreadLength

        y1=0;

        for m = 1:spreadLength

            y1 = y1 + cSpread(1,m)*conj(Hf1((n-1)*spreadLength+m))*rec_symbol2((n-1)*spreadLength+m);

        end

        temp(n) = y1;

    end

    y2 = [y2,temp];

end

y          =  reshape(y2,1,num_data);

idata      =  real(y);

qdata      =  imag(y);

y_demod    =  deqpsk(idata,qdata,1,num_data,mod_level);

y_demod    =  y_demod';

tblen      =  10;

decoded1   =  vitdec(y_demod,trel,tblen,'cont','hard');

[n1,r1]    =  biterr(decoded1(tblen+1:end),msg_user1(1:end-tblen,1));

ber        =  r1;

Main04.m

clc;

clear;

close all;

addpath([pwd '\functions']);

% %EGC

% %EGC

figure;

snr=-6:2:14;

for i=1:length(snr)

    ber1(i)=EGC(snr(i));

end

semilogy(snr,ber1,'kd:','linewidth',1.5);

xlabel('SNR');

ylabel('BER');

title('EGC BER');

hold on;

%MRC

%MRC

figure;

snr=-6:2:14;

for i=1:length(snr)

    ber2(i)=MRC(snr(i));

end

semilogy(snr,ber2,'rd:','linewidth',1.5);

grid on;

xlabel('SNR');

ylabel('BER');

title('MAC BER');

%MMSE

%MMSE

figure;

snr=-6:2:14;

ber3=mmse(snr);

semilogy(snr,ber3,'kd:','linewidth',1.5);

grid on;

xlabel('SNR');

ylabel('BER');

title('MMSE BER');

ber=mmse(snr);

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/108433170