请教下OFDM系统在matlab上的仿真程序!

请教下OFDM系统在matlab上的仿真程序!,第1张

%实现OFDM传输的仿真程序

para=128; %并行子信道的个数

fftlen:128; %FFT的长度

paradata=reshape(seldata,para,nd

*m1);

%QPSK调制

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

kmod=1/sqrt(2);

ichl=ich.*kmod;

qchl=qch.*kmod;

%In叩(离散傅里叶反变换)

X=ichl+qchl.*i:

y=ifft(x);

ich2=real(y);

qch2=imag(y);

%插入保护间隔

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

fftlen2=fftlen+gilen;

%衰减计算

spow=suln(ich3.2+qch3.“2)/nd./para;

attn=0.郑敬5*spow*sr/br*10.“(.ebn0/10);扒档

attn=sqrt(attn);

%高斯自信道

[ich4,qeh4]=eomb(ich3,qch3,attn);

%接收部分

%去除保护间隔

[ieh5,,qeh5]=girem(ich4,qch4,fftlen2,gilen,

nd);

%FFr(离散傅里叶变换)

IX=ich5+qch5.*i:

ry=fit(Ⅸ);

ich6=real(ry);

qch6=imag(ry);

%春丛乱QPSK解调

ieh7=ich6./kmod;

qch7=qch6./kmod;

[derrtxtata]=qpskdemod(ich7,qch7,para,nd,m1);

%并串变换

demodatal=reshape(demodata,I,para*nd*rnl);

%比特误码率(BER)

bit—errors=find(seldata~=demodatal);

bit—error—count 2 size(bit—e/TOES,2);

total—bits=size(demodatal,2);

bit—error—rate=bit—error—count/total—bits;

fprintf(7%f\n’,bit—eITor—rate)

%end offile

程序运行结果,输出误码率为:

>>0.037109

%------------------------------------------

% EE359 final project, Fall 2002

% Channel estimation for a MIMO-OFDM system

% By Shahriyar Matloub

%------------------------------------------

clear all

%close all

i=sqrt(-1)

Rayleigh=1

AWGN=0% for AWGN channel

MMSE=0% estimation technique

Nsc=64% Number of subcarriers

Ng=16 % Cyclic prefix length

SNR_dB=[0 5 10 15 20 25 30 35 40] % Signal to noise ratio

Mt=2 % Number of Tx antennas

Mr=2 % Number of Rx antennas

pilots=[1:Nsc/Ng:Nsc] % pilot subcarriers

DS=5 % Delay spread of channel

iteration_max=200

%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Channel impulse response %

%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if (Rayleigh)

N=50

fm=100

B=20e3

fd=(rand(1,N)-0.5)*2*fm

theta=randn(1,N)*2*pi

c=randn(1,N)

c=c/sum(c.^2)

t=0:fm/B:10000*fm/B

Tc=zeros(size(t))

Ts=zeros(size(t))

for k=1:N

Tc=c(k)*cos(2*pi*fd(k)*t+theta(k))+Tc

Ts=c(k)*sin(2*pi*fd(k)*t+theta(k))+Ts

end

r=ones(Mt*Mr,1)*(Tc.^2+Ts.^2).^0.5

index=floor(rand(Mt*Mr,DS)*5000+1)

end

MEE1=zeros(1,length(SNR_dB))

MEE2=zeros(1,length(SNR_dB))

for snrl=1:length(SNR_dB)

snrl

estimation_error1=zeros(Mt*Mr,Nsc)

estimation_error2=zeros(Mt*Mr,Nsc)

R1=besselj(0,2*pi*fm*(Nsc+Ng)/B)

sigma2=10^(-SNR_dB(snrl)/10)

aa=(1-R1^2)/(1-R1^2+sigma2)

bb=sigma2*R1/(1-R1^2+sigma2)

for iteration=1:iteration_max

%iteration

if AWGN==1

h=ones(Mt*Mr,1)

else

phi=rand*2*pi

h=r(index+iteration)*exp(j*phi)

%h=rand(Mt*Mr,DS)

h=h.*(ones(Mt*Mr,1)*(exp(-0.5).^[1:DS]))

h=h./(sqrt(sum(abs(h).^2,2))*ones(1,DS))

end

CL=size(h,2) % channel length

data_time=zeros(Mt,Nsc+Ng)

data_qam=zeros(Mt,Nsc)

data_out=zeros(Mr,Nsc)

output=zeros(Mr,Nsc)

for tx=1:Mt

data_b=0*round(rand(4,Nsc)) % data

data_qam(tx,:)=j*(2*(mod(data_b(1,:)+data_b(2,:),2)+2*data_b(1,:))-3)+...

2*(mod(data_b(3,:)+data_b(4,:),2)+2*data_b(3,:))-3

for loop=1:Mt

data_qam(tx,pilots+loop-1)=(1+j)*(loop==tx) % pilots

end

data_time_temp=ifft(data_qam(tx,:))

data_time(tx,:)=[data_time_temp(end-Ng+1:end) data_time_temp]

end

for rx=1:Mr

for tx=1:Mt

output_temp=conv(data_time(tx,:),h((rx-1)*Mt+tx,:))

output(rx,:)=output_temp(Ng+1:Ng+Nsc)+output(rx,:)

end

np=(sum(abs(output(rx,:)).^2)/length(output(rx,:)))*sigma2

noise=(randn(size(output(rx,:)))+i*randn(size(output(rx,:))))*sqrt(np)

output(rx,:)=output(rx,:)+noise

data_out(rx,:)=fft(output(rx,:))

end

%%%%%%%%%%%%%%%%%%%%%%

% Channel estimation %

%%%%%%%%%%%%%%%%%%%%%%

H_act=zeros(Mt*Mr,Nsc)

H_est1=zeros(Mt*Mr,Nsc)

H_est2=zeros(Mt*Mr,Nsc)

i=1

for tx=1:Mt

for rx=1:Mr

H_est_temp=data_out(rx,pilots+tx-1)./data_qam(tx,pilots+tx-1)

%H_est_temp2=aa*abs(H_est_temp1)+bb*abs(H_est2((rx-1)*Mt+tx,:))

h_time=ifft(H_est_temp)

h_time=[h_time zeros(1,Nsc-length(h_time))]

H_est1((rx-1)*Mt+tx,:)=fft(h_time)

H_est2((rx-1)*Mt+tx,:)=((aa*abs(H_est1((rx-1)*Mt+tx,:))+bb*abs(H_est2((rx-1)*Mt+tx,:)))...

.*H_est1((rx-1)*Mt+tx,:))./abs(H_est1((rx-1)*Mt+tx,:))

if (tx>1)

H_est1((rx-1)*Mt+tx,:)=[H_est1((rx-1)*Mt+tx,Nsc-tx+2:Nsc) H_est1((rx-1)*Mt+tx,1:Nsc-tx+1)]

H_est2((rx-1)*Mt+tx,:)=[H_est2((rx-1)*Mt+tx,Nsc-tx+2:Nsc) H_est2((rx-1)*Mt+tx,1:Nsc-tx+1)]

end

H_act((rx-1)*Mt+tx,:)=fft([h((rx-1)*Mt+tx,:) zeros(1,Nsc-CL)])

error1=(abs(H_act((rx-1)*Mt+tx,:)-H_est1((rx-1)*Mt+tx,:)).^2)

error2=(abs(H_act((rx-1)*Mt+tx,:)-H_est2((rx-1)*Mt+tx,:)).^2)

%error=(abs(H_act((rx-1)*Mt+tx,:)-H_est((rx-1)*Mt+tx,:)).^2)./(abs(H_act((rx-1)*Mt+tx,:)).^2)

estimation_error1((rx-1)*Mt+tx,:)=estimation_error1((rx-1)*Mt+tx,:)+error1

estimation_error2((rx-1)*Mt+tx,:)=estimation_error2((rx-1)*Mt+tx,:)+error2

%subplot(Mt*Mr,3,i),plot([0:Nsc-1],abs(H_act((rx-1)*Mt+tx,:)))i=i+1

%subplot(Mt*Mr,3,i),plot([0:Nsc-1],abs(H_est((rx-1)*Mt+tx,:)))i=i+1

%subplot(Mt*Mr,3,i),plot([0:Nsc-1],abs(error))i=i+1

end

end

end

estimation_error1=estimation_error1/iteration_max

estimation_error2=estimation_error2/iteration_max

%estimation_error=min(estimation_error,10*iteration_max*ones(size(estimation_error)))

%for i=1:Mt*Mr

%subplot(Mt*Mr,2,2*i-1),plot([0:Nsc-1],estimation_error1(i,:))

%subplot(Mt*Mr,2,2*i),plot([0:Nsc-1],estimation_error2(i,:))

%end

MEE1(snrl)=sum(sum(estimation_error1))/(Mt*Mr*Nsc)

MEE2(snrl)=sum(sum(estimation_error2))/(Mt*Mr*Nsc)

end

plot(SNR_dB,10*log10(MEE1))

hold on

plot(SNR_dB,10*log10(MEE2),'r')

%H_act=fft([h_zeros(1,Nsc-CL)]).'

error1=(abs(H_act-H_est1).^2)./(abs(H_act).^2)

error2=(abs(H_act-H_est2).^2)./(abs(H_act).^2)

%%%%%%%%%

% Plots %

%%%%%%%%%

fig=4

i=1

subplot(fig,1,i),plot([0:length(H_act)-1],abs(H_act)) i=i+1

subplot(fig,1,i),plot([0:length(H_est1)-1],abs(H_est1)) i=i+1

subplot(fig,1,i),plot([0:length(H_est2)-1],abs(H_est2)) i=i+1

subplot(fig,1,i),plot([0:length(error1)-1],error1) i=i+1

subplot(fig,1,i),plot([0:length(error2)-1],error2)

function ms_error=MMSE_MSE_calc(X,H,Y,Rgg,variance)

%This function generates mean squared error for the the MMSE estimator..

%EVALUATION OF Hmmse

%Hmmse=F*Rgg*inv(Rgy)*Y

u=rand(64,64)

F=fft(u)*inv(u)%The 64 X 64 twiddle factor matrix..

I=eye(64,64)

Rgy=Rgg * F'* X'

Ryy=X * F * Rgg * F' *X' + variance * I

for i=1:64

yy(i,i)=Y(i)

end

Gmmse=Rgy * inv(Ryy)* Y

Hmmse=fft(Gmmse)

ms_error_mat=mean(((abs(H)-abs(Hmmse))/abs(H)).^2)

for i=1:64

if(ms_error_mat(i)~=0)

ms_error=ms_error_mat(i)

end

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12293054.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存