文档库 最新最全的文档下载
当前位置:文档库 › QAM OFDM

QAM OFDM

(1)mqam.m %测试数据经MQAM调制在AWGN信道中调制解调的仿真程序pack;

Fl=1000;

t1=1;

d=1;

% create mqam signal

% M=4;

% M=16;

% M=32;

M=64;

[x]=qam_gen(M,Fl,t1,d);

x1=real(x);

x2=imag(x);

figure(1);

plot(x1,x2,'or');

axis('square');

grid on;

xlabel('x');

ylabel('y');

title('64QAM星座图');

% generate gauss noise

sgma=0.001;

[gs1,gs2]=gngauss(0,sgma);

%generate QAM test signal

Fl=1000;

Fs=6000;

delta_fc=100;

dela=pi/4;

B=0.2;

N=1000; %数据长度

[I1,Q1]=test_sig(Fl,Fs,x,delta_fc,dela,B);

z=ones(1,floor(Fs/Fl));

X1=x1'*z;

X2=x2'*z;

[r,c]=size(X1);

X1=X1.';

X2=X2.';

X1=reshape(X1,1,r*c);

X2=reshape(X2,1,r*c);

figure(2);

subplot(2,1,1);

plot(X1(1:N));

grid on;

xlabel('数据长度');

ylabel('幅度');

title('16QAM调制信号(同相路)'); subplot(2,1,2);

plot(X2(1:N));

grid on;

xlabel('数据长度');

ylabel('幅度');

title('16QAM调制信号(正交路)');

% QAM+gauss signal

I11=I1+gs1;

Q11=Q1+gs2;

figure(3);

subplot(2,1,1);

plot(I11(1:N));

grid on;

xlabel('数据长度');

ylabel('幅度');

title('接收信号(同相路)');

subplot(2,1,2);

plot(Q11(1:N));

grid on;

xlabel('数据长度');

ylabel('幅度');

title('接收信号(正交路)');

%filtering the received signal

[del_w,I,Q]=feqtq(Fl,Fs,I11,Q11);

t=0:1/Fs:(r*c-1)/Fs;

Z3=(I+j*Q).*exp(-j*del_w*t);

X3=real(Z3);

Y3=imag(Z3);

%h=0.5+0.5*cos(2*pi*Fl*(t-0.5/Fl)); %X1=X1.*h;

%X2=X2.*h;

figure(4);

subplot(2,1,1);

plot(X3(1:N));

grid on;

xlabel('数据长度');

ylabel('幅度');

title('经低通滤波后的接收信号(同相路)');

subplot(2,1,2);

plot(Y3(1:N));

grid on;

xlabel('数据长度');

ylabel('幅度');

title('经低通滤波后的接收信号(正交路)');

%QAM signal demodulation

[y1,y2]=xcjt_qam(Fl,Fs,I,Q,x1,x2);

% demonstrate (compare demodulated QAM and original QAM) z=ones(1,floor(Fs/Fl));

Y1=y1'*z;

Y2=y2'*z;

[r,c]=size(Y1);

Y1=Y1.';

Y2=Y2.';

Y1=reshape(Y1,1,r*c);

Y2=reshape(Y2,1,r*c);

figure(5);

subplot(2,1,1);

plot(Y1(1:N));

grid on;

xlabel('数据长度');

ylabel('幅度');

title('16QAM解调信号(同相路)');

subplot(2,1,2);

plot(Y2(1:N));

grid on;

xlabel('数据长度');

ylabel('幅度');

title('16QAM解调信号(正交路)');

(2)qam_gen.m %产生MQAM信号与信号星座图function [x]=qam_gen(M,fl,t,d)

error(nargchk(1,4,nargin));

if M<=0

error('Wrong parameter, the value of M must be greater than 0') end

if mod(M,4)~=0

error('Wrong parameter, the value of M must be 4,16,32,64')

end

if nargin==1

N=1000;d=1;

elseif nargin==3

d=1;

end

N=fix(fl*t);

for i=1:N

temp=rand; % a uniform R.V. between 0 and 1

dsource(i)=1+floor(M*temp); % a number between 1 and 16, uniform

end;

% mapping to the signal constellation follow

map4 = [ -d d; d d;

-d -d; d -d; ];

map16 = [ -3*d 3*d; -d 3*d; d 3*d; 3*d 3*d;

-3*d d; -d d; d d; 3*d d;

-3*d -d; -d -d; d -d; 3*d -d;

-3*d -3*d;-d -3*d;d -3*d; 3*d -3*d];

map32=[ -3*d 5*d;-d 5*d; d 5*d;3*d 5*d;

-5*d 3*d; -3*d 3*d;-d 3*d; d 3*d;3*d 3*d; 5*d 3*d;

-5*d d; -3*d d;-d d; d d;3*d d; 5*d d;

-5*d -d; -3*d -d;-d -d; d -d;3*d -d; 5*d -d;

-5*d -3*d; -3*d -3*d;-d -3*d; d -3*d;3*d -3*d; 5*d -3*d;

-3*d -5*d;-d -5*d; d -5*d;3*d -5*d];

map64=[-7*d 7*d;-5*d 7*d;-3*d 7*d;-d 7*d;d 7*d;3*d 7*d;5*d 7*d;7*d 7*d;

-7*d 5*d;-5*d 5*d;-3*d 5*d;-d 5*d;d 5*d;3*d 5*d;5*d 5*d;7*d 5*d;

-7*d 3*d;-5*d 3*d;-3*d 3*d;-d 3*d;d 3*d;3*d 3*d;5*d 3*d;7*d 3*d;

-7*d d;-5*d d;-3*d d;-d d;d d;3*d d;5*d d;7*d d;

-7*d -d;-5*d -d;-3*d -d;-d -d;d -d;3*d -d;5*d -d;7*d -d;

-7*d -3*d;-5*d -3*d;-3*d -3*d;-d -3*d;d -3*d;3*d -3*d;5*d -3*d;7*d -3*d

-7*d -5*d;-5*d -5*d;-3*d -5*d;-d -5*d;d -5*d;3*d -5*d;5*d -5*d;7*d -5*d;

-7*d -7*d;-5*d -7*d;-3*d -7*d;-d -7*d;d -7*d;3*d -7*d;5*d -7*d;7*d -7*d];

for i=1:N

if M==4

qam_sig(i,:)=map4(dsource(i),:);

elseif M==16

qam_sig(i,:)=map16(dsource(i),:);

elseif M==32

qam_sig(i,:)=map32(dsource(i),:);

elseif M==64

qam_sig(i,:)=map64(dsource(i),:);

end

end;

x1=qam_sig(:,1).';x2=qam_sig(:,2).';

x=x1+j*x2;

return

(3) gngauss.m %产生高斯信号

function [gsrv1,gsrv2]=gngauss(m,sgma)

if nargin==0

m=0;sgma=1;

elseif nargin==1

sgma=m;m=0;

end;

u=rand;

z=sgma*(sqrt(2*log(1/(1-u))));

u=rand;

gsrv1=m+z*cos(2*pi*u);

gsrv2=m+z*sin(2*pi*u);

(4) test_sig.m %产生测试数据,并经MQAM调制,同相路与正交路分别叠加高斯噪声function [I1,Q1]=test_sig(Fl,Fs,x,delta_fc,dela,B)

error(nargchk(3,6,nargin));

if nargin==3

delta_fc=0;

dela=0;

B=0;

end

if nargin==4

dela=0;

B=0;

end

if nargin==5

B=0;

end

if Fs/Fl~=floor(Fs/Fl)

error('Fs/Fl must be integer!')

return

end

x1=real(x);

x2=imag(x);

z=ones(1,Fs/Fl);

X1=x1'*z;

X2=x2'*z;

[r,c]=size(X1);

X1=X1.';

X2=X2.';

X1=reshape(X1,1,r*c);

X2=reshape(X2,1,r*c);

t=0:1/Fs:(r*c-1)/Fs;

h=0.5+0.5*cos(2*pi*Fl*(t-0.5/Fl+B/Fl));

X1=X1.*h;

X2=X2.*h;

R=(X1+j*X2).*exp(j*2*pi*delta_fc*t+j*dela); I1=real(R);

Q1=imag(R);

return

(5) feqtq.m %对接收信号进行滤波function [del_f,I,Q]=feqtq(Fl,Fs,I1,Q1)

error(nargchk(4,4,nargin));

if Fs/Fl/2~=floor(Fs/Fl/2)

error('Fs/(2*Fl) must be integer!')

end

[r,c]=size(I1);

if c==1

I1=I1.';

Q1=Q1.';

c=r;

r=1;

end

%Fl=5000;

Fd=2*Fl;

a=Fs/Fd;

i1=I1(1:length(I1)-a);

i2=I1(a+1:length(I1));

q1=Q1(1:length(I1)-a);

q2=Q1(a+1:length(I1));

Y1=i2.*q1-q2.*i1;

X1=i1.*i2+q1.*q2;

% LPF 2*del_f

Wp=2*200/Fs;

Ws=2*800/Fs;

[n,Wn]=buttord(Wp,Ws,1,30);

[b,a]=butter(n,Wn);

Y2=filtfilt(b,a,Y1);

X2=filtfilt(b,a,X1);

%Y2=LPF(Y1);

%X2=LPF(X1);

[Y]=mean(Y2);

[X]=mean(X2);

Z1=-Y/X;

del_w=atan(Z1)*Fd;

del_f=del_w/(2*pi);

t=0:1/Fs:(r*c-1)/Fs;

Z=(I1+j*Q1).*exp(-j*del_w*t);

I=real(Z);

Q=imag(Z);

(6) xcjt_qam.m %对滤波后的信号进行MQAM解调

function [y1,y2,pp,dela]=xcjt_qam(Fl,Fs,I,Q,x1,x2)

M1=length(x1);

N=Fs/Fl;

z=ones(1,N);

X1=x1'*z;

X2=x2'*z;

[r,c]=size(I);

X1=X1.';

X2=X2.';

X1=reshape(X1,1,M1*N);

X2=reshape(X2,1,M1*N);

t=0:1/Fs:(r*c-1)/Fs;

% signal with phase offset

r1=I+j*Q;

%

N1=8;

s0=X1(1:M1*N)+j*X2(1:M1*N);

Y(1:M1)=x1(1:M1)+j*x2(1:M1);

p=(-0.5:1/N1:0.5-1/N1);

for i=1:N1

h1=0.5+0.5*cos(2*pi*Fl*(t-0.5/Fl+p(i)/Fl));

s1=s0.*h1(1:M1*N);

a=r1(1:M1*N);

zz(i)=abs(sum(a.*conj(s1)))^2;

end

(7)MQAMsimulation.m %MQAM信号在AWGN信道最佳接收时误码性能仿真值与理论值的比较(以16QAM为例)

clear all;

Fd=1000;

Fs=6*Fd;

M=16; %16QAM

weight=1.1; %随机噪声方差sigma加权值

SNR_dbsim=0:0.5:12; %仿真SNR

SNR_dbthe=0:0.5:12; %理论SNR

N1=5000;

N2=50000; %Monte Carlo仿真次数

%误码情况仿真

for n=1:length(SNR_dbsim)

Eb_N0=10^(SNR_dbsim(n)/10);

sgma=weight*sqrt(1/Eb_N0);

x1=randint(N1,1,M); %生成M进制数据的随机矩阵N1*1

y1=dmodce(x1,Fd,Fs,'qam',M); %MQAM调制

ynoise1=y1+sqrt(Fs/Fd)*sgma*(randn(length(y1),1)+j*randn(length(y1),1));%加噪AWGN

z1=ddemodce(ynoise1,Fd,Fs,'qam',M); %MQAM解调

[number1,pm1(n)]=symerr(x1,z1); %计算误码个数与误码率

x2=randint(N2,1,M); %生成M进制数据的随机矩阵N2*1

y2=dmodce(x2,Fd,Fs,'qam',M); %MQAM调制

ynoise2=y2+sqrt(Fs/Fd)*sgma*(randn(length(y2),1)+j*randn(length(y2),1));%加噪AWGN

z2=ddemodce(ynoise2,Fd,Fs,'qam',M); %MQAM解调

[number2,pm2(n)]=symerr(x2,z2); %计算误码个数与误码率

end;

%理论误码率

for m=1:length(SNR_dbthe)

Eb_N0=10^(SNR_dbthe(m)/10);

pm_theory(m)=4*(1-1/sqrt(M))*(0.5*erfc(sqrt((3*log2(M)*Eb_N0)/(M-1))/sqrt(2)))-4*((1-1/sqrt( M))^2)*((0.5*erfc(sqrt((3*log2(M)*Eb_N0)/(M-1))/sqrt(2)))^2);

pe_theory(m)=pm_theory(m)/log2(M);

end;

semilogy(SNR_dbsim,pm1,'-+',SNR_dbthe,pm2,'-*',SNR_dbthe,pm_theory,'-o');%作图

grid on;

hold on;

xlabel('Eb/No (dB)');

ylabel('SER');

legend('16QAM仿真值,仿真次数5000','16QAM仿真值,仿真次数50000','16QAM理论值'); title('AWGN信道下16QAM误码性能比较');

(8)SERBERforMQAM.m %MQAM信号经AWGN信道最佳接收时的误码性能理论比较(2k

M ,k为偶数)

clc;

M1=4;

M2=16;

M3=32;

M4=64;

for i=1:1:13

realSNR(i)=10^((i-1)*0.1);

Ps4QAM(i)=4*(1-1/sqrt(M1))*(0.5*erfc(sqrt((3*log2(M1)*realSNR(i))/(M1-1))/sqrt(2)))-4*((1-1/ sqrt(M1))^2)*((0.5*erfc(sqrt((3*log2(M1)*realSNR(i))/(M1-1))/sqrt(2)))^2);

Pb4QAM(i)=Ps4QAM(i)/log2(M1);

Ps16QAM(i)=4*(1-1/sqrt(M2))*(0.5*erfc(sqrt((3*log2(M2)*realSNR(i))/(M2-1))/sqrt(2)))-4*((1-1/sqrt(M2))^2)*((0.5*erfc(sqrt((3*log2(M2)*realSNR(i))/(M2-1))/sqrt(2)))^2);

Pb16QAM(i)=Ps16QAM(i)/log2(M2);

%

Ps32QAM(i)=4*(1-1/sqrt(M3))*(0.5*erfc(sqrt((3*log2(M3)*realSNR(i))/(M3-1))/sqrt(2)))-4*((1-1/sqrt(M3))^2)*((0.5*erfc(sqrt((3*log2(M3)*realSNR(i))/(M3-1))/sqrt(2)))^2);

% Pb32QAM(i)=Ps32QAM(i)/log2(M3);

Ps64QAM(i)=4*(1-1/sqrt(M4))*(0.5*erfc(sqrt((3*log2(M4)*realSNR(i))/(M4-1))/sqrt(2)))-4*((1-1/sqrt(M4))^2)*((0.5*erfc(sqrt((3*log2(M4)*realSNR(i))/(M4-1))/sqrt(2)))^2);

Pb64QAM(i)=Ps64QAM(i)/log2(M4);

end

figure(1);

i=0:1:12

% semilogy(i,Ps4QAM,'-+',i,Ps16QAM,'-o',i,Ps32QAM,'->',i,Ps64QAM,'-p');

semilogy(i,Ps4QAM,'-+',i,Ps16QAM,'-o',i,Ps64QAM,'-p');

grid on;

hold on;

legend('4QAM','16QAM','64QAM');

title('AWGN信道下MQAM调制误码性能');

xlabel('Eb/No(dB)');

ylabel('SER');

figure(2);

i=0:1:12

% semilogy(i,Pb4QAM,'-+',i,Pb16QAM,'-o',i,Pb32QAM,'->',i,Pb64QAM,'-p');

semilogy(i,Pb4QAM,'-+',i,Pb16QAM,'-o',i,Pb64QAM,'-p');

grid on;

hold on;

legend('4QAM','16QAM','64QAM');

title('AWGN信道下MQAM调制误比特性能');

xlabel('Eb/No(dB)');

ylabel('BER');

_______________________________________________________________________________ _______________________________________________________________________________ _______________________________________________________________________________

(1)ofdm_signal.m %子载波数64

N ,IFFT点数256,CP长度16,数据符号采用QPSK映射的OFDM信号功率谱

clear all;

Fd=1000; %符号频率

Fs=4*Fd; % 每个符号的采样频率

M=4; % QPSK符号数

Ndata=1024; % 发送数据符号数

Sdata=64; % OFDM每帧的符号数

Slen=256; % IFFT长度

Nsym=Ndata/Sdata; % OFDM的帧数

GIlen=144; %每个CP后面的符号数

GI=16; % 循环前缀CP长度

% 矢量初始化

X=zeros(Ndata,1);

Y1=zeros(Ndata,1);

Y2=zeros(Ndata,1);

Y3=zeros(Slen,1);

z0=zeros(Slen,1);

z1=zeros(Ndata/Sdata*Slen,1);

g=zeros(GIlen,1);

z2=zeros(GIlen*Nsym,1);

z3=zeros(GIlen*Nsym,1);

% 生成M进制的随机整数矢量(M=4)

X = randint(Ndata, 1, M);

Y1 = modmap(X, Fd, Fs, 'psk', M);

% 转化为复值信号

Y2=amodce(Y1,1,'psk');

for j=1:Nsym;

for i=1:Sdata;

Y3(i+Slen/2-Sdata/2,1)=Y2(i+(j-1)*Sdata,1);

end

z0=ifft(Y3);

for i=1:Slen;

z1(((j-1)*Slen)+i)=z0(i,1);

end

for i=1:Slen;

g(i+16)=z0(i,1);

end

for i=1:GI;

g(i)=z0(i+Slen-GI,1);

end

for i=1:GIlen;

z2(((j-1)*GIlen)+i)=g(i,1);

end

end

% OFDM时域波形信号

figure(1);

f = linspace(-Sdata,Sdata,length(z1));

plot(f,abs(z1));

grid on;

hold on;

xlabel('时间');

ylabel('幅度');

title('OFDM时域信号,N=64');

Y4 = fft(z1);

% if Y4 is under 0.01 Y4=0.001

for j=1:Ndata/Sdata*Slen;

if abs(Y4(j)) < 0.01

Y4(j)=0.01;

end

end

Y4 = 10*log10(abs(Y4));

% OFDM功率谱

figure(2);

f = linspace(-Sdata,Sdata,length(Y4));

plot(f,Y4);

% axis([-Slen/2 Slen/2 -20 20]);

axis([-40 40 -20 20]);

xlabel('\omega/\pi');

ylabel('20lg|H(exp(jw))| (dB)');

hold on;

grid on;

title('OFDM信号功率谱,N=64');

(2)ofdm_qpskchannel.m %OFDM-QPSK系统在不同信道(AWGN、AWGN+两径衰落信道、AWGN+三径衰落信道)下的接收端误码性能

close all;clear all; clc; tic ; %计时开始

global CP_len;

global nSubC;

global ifft_len;

global bitPerSymbol;

global symbolPerCarrier;

global s_len;

global fade; %信道衰落

%% 测试参数

CP_len = 16;

nSubC=64;

ifft_len = 256;

bitPerSymbol = 2;

symbolPerCarrier = 50;

% 开始测试

s_len = nSubC*bitPerSymbol* symbolPerCarrier;

SNR = 0:2:20;

ber1 = zeros(1,length(SNR));

ber2 = zeros(1,length(SNR));

ber3 = zeros(1,length(SNR));

for kk = 1:length(SNR)

max = floor((2^kk)/10)+10;

fprintf('仿真信噪比:%d\n', SNR(kk));

fprintf('仿真点数:%d\n', max*bitPerSymbol*symbolPerCarrier*nSubC);

fade = [0]; % 信道参数,AWGN

ber = 0;

for m = 1:max

% 生成用于测试的随机比特

s_in = floor( rand(1, s_len )*2 );

sch = ofdm_mod_eq(s_in);

sch = channel(sch,SNR(kk));

s_out = ofdm_demod_eq(sch);

%计算误比特率

err_count = sum(abs(s_in-s_out));

ber = ber + err_count/s_len;

end

ber1(kk) = ber/max;

fade = [0, 0, 0, 0, 0.4]; % 信道参数,下标为延时点数,值为衰减系数,两径衰落+AWGN ber = 0;

for m = 1:max

% 生成用于测试的随机比特

s_in = floor( rand(1, s_len )*2 );

sch = ofdm_mod_eq(s_in);

sch = channel(sch,SNR(kk));

s_out = ofdm_demod_eq(sch);

%计算误比特率

err_count = sum(abs(s_in-s_out));

ber = ber + err_count/s_len;

end

ber2(kk) = ber/max ;

fade = [0, 0, 0, 0, 0.4, 0.3]; % 信道参数,下标为延时点数,值为衰减系数,三径衰落+AWGN

ber = 0;

for m = 1:max

% 生成用于测试的随机比特

s_in = floor( rand(1, s_len )*2 );

sch = ofdm_mod_eq(s_in);

sch = channel(sch,SNR(kk));

s_out = ofdm_demod_eq(sch);

%计算误比特率

err_count = sum(abs(s_in-s_out));

ber = ber + err_count/s_len;

end

ber3(kk) = ber/max ;

end

figure(1);

semilogy(SNR,ber1,'r-o');

hold on;

semilogy(SNR,ber2,'b-*');

hold on;

semilogy(SNR,ber3,'k-s');

grid on;

xlabel('Eb/No (dB)');

ylabel('BER');

legend('AWGN','两径衰落+AWGN','三径衰落+AWGN');

title('N=64,AWGN与多径信道下OFDM+QPSK系统误码性能');

toc

(3) ofdm_qpskcp.m %OFDM-QPSK系统在不同CP取值时,通过AWGN+三径衰落信道的接收端误码性能

close all;clear all; clc; tic ; %计时开始

global CP_len;

global nSubC;

global ifft_len;

global bitPerSymbol;

global symbolPerCarrier;

global s_len;

global fade; %信道衰落

CP_len = 0;

nSubC = 64;

ifft_len = 256;

bitPerSymbol = 2;

symbolPerCarrier = 50;

fade = [0, 0, 0, 0.4, 0.3]; % 信道参数,下标为延时点数,值为衰减系数,三径衰落+AWGN

s_len = nSubC*bitPerSymbol* symbolPerCarrier;

SNR = 0:2:20;

ber1 = zeros(1,length(SNR));

ber2 = zeros(1,length(SNR));

for kk = 1:length(SNR)

max = floor((2^(kk))/50)+10;

fprintf('仿真信噪比:%d\n', SNR(kk));

fprintf('仿真点数:%d\n', max*nSubC*bitPerSymbol*symbolPerCarrier);

CP_len = 0;

ber = 0;

for m = 1:max

% 生成用于测试的随机比特

s_in = floor( rand(1, s_len )*2 );

sch = ofdm_mod_neq(s_in);

sch = channel(sch,SNR(kk));

s_out = ofdm_demod_neq(sch);

%计算误比特率

err_count = sum(abs(s_in-s_out));

ber = ber + err_count/s_len ;

end

ber1(kk) = ber/max;

fprintf('CP=0 :%f\n',ber1(kk));

CP_len = 16;

ber = 0;

for m = 1:max

% 生成用于测试的随机比特

s_in = floor( rand(1, s_len )*2 );

sch = ofdm_mod_neq(s_in);

sch = channel(sch,SNR(kk));

s_out = ofdm_demod_neq(sch);

%计算误比特率

err_count = sum(abs(s_in-s_out));

ber = ber + err_count/s_len;

end

ber2(kk) = ber/max ;

fprintf('CP=16 :%f\n\n',ber2(kk));

end

figure(1);

semilogy(SNR,ber1,'r-o');

hold on;

semilogy(SNR,ber2,'b-*');

grid on;

xlabel('Eb/No (dB)');

legend('无CP','CP=16');

title('N=64,CP对OFDM+QPSK系统误码性能影响');

toc

(4) ofdm_mod_eq.m % OFDM调制,带均衡

function [s_out] = ofdm_mod_eq( s_in )

global nSubC

global ifft_len;

global symbolPerCarrier;

global bitPerSymbol;

global trainingSymbols;

global trainingSymbols_len;

global CP_len;

global carriers;

len = length(s_in);

SQam = reshape(s_in, nSubC,len/nSubC); %串并转换

PQam = QPSK_mod(SQam);

%% 添加训练序列共4*48 个,使用随机数作为训练序列

tmpTable = [-1,1,i,-i];

trainingSymbols_len = 10;

trainingSymbols = (tmpTable(floor( 4*rand(trainingSymbols_len,nSubC))+1 ))';

PQam = cat(2,zeros(nSubC,1),PQam);

PQam = cat(2,trainingSymbols,PQam);

% 64 个子载波安排,前后8个为留空,中间48 个为有效数据用

carriers = (1: nSubC) + (floor( ifft_len/4) - floor(nSubC/2)); % 坐标:(1 to 50) + 7 --> 8 to 57

conj_carriers = ifft_len - carriers + 2; % 坐标:122 to 73

P_IFFT = zeros(ifft_len,1 + symbolPerCarrier + trainingSymbols_len); % 一个符号块,含4列训练序列,1列0

P_IFFT(carriers,:) = PQam;

P_IFFT(conj_carriers,:)=conj(PQam) ; % 构造共轭矩阵,扩展为128点( RCC算法,ifft 后为实数)

PCh = (ifft( P_IFFT ,ifft_len,1)); % 得到的数据全部为实数,实际上是虚部非常小,因此还要取实部

% 添加CP

PCh2 = cat(1, PCh((ifft_len-CP_len+1):ifft_len,:), PCh);

s_out = reshape(PCh2, 1, (ifft_len+CP_len)*(symbolPerCarrier +trainingSymbols_len + 1)); %并串转换

(5) QPSK_mod.m %QPSK调制函数

function [qam_out] = QPSK_mod(qam_in)

global QamTable

global bitPerSymbol;

QamTable = [ -1-i, 1-i, -1+i, 1+i ];

[ m, n ] = size(qam_in);

qam_out = zeros(m,n/bitPerSymbol);

for k = 1:m

QamTmp = reshape(qam_in(k,:),bitPerSymbol,n/bitPerSymbol)';

QamTmpTmp = bi2de( QamTmp, 'left-msb');

qam_out(k, :) = QamTable( QamTmpTmp+1 );

end

(6) channel.m %信道函数,模拟多径信道,使用滤波器来模拟信道,也可从时域上进行function [s_out] = channel(s_in, SNR)

global fade;

Len = length(s_in);

f_len = length(fade);

sch = s_in;

for m = 1:f_len

sch(1+m:Len) = sch(1+m:Len) + fade(m)*(s_in(1:Len-m));

end

% 高斯信道

Tx_signal_power = var(sch); % 方差

linear_SNR = 10^( SNR /10) ;

noise_sigma = Tx_signal_power / linear_SNR;

noise_scale_factor = sqrt(noise_sigma) ;

noise = randn(1, length(sch) )*noise_scale_factor; %模拟信道噪声,为随机数, 即高斯白噪声

s_out = sch + noise;

(7)ofdm_demod_eq.m %OFDM解调,带均衡

function [s_out] = ofdm_demod_eq(s_in)

global trainingSymbols;

global trainingSymbols_len;

global ifft_len;

global CP_len;

global bitPerSymbol;

global symbolPerCarrier;

global carriers;

global s_len

% 接收,进行串并转换

P_S = reshape(s_in, ifft_len+CP_len, symbolPerCarrier + trainingSymbols_len + 1);

%去CP

PDeCP = P_S(1+CP_len:ifft_len+CP_len,:);

% fft

P_FFT = fft(PDeCP,ifft_len,1);

P_FFT2 = P_FFT(carriers,:);

RxTrainSymbols = P_FFT2(:, (1: trainingSymbols_len));

%RxTrainSymbols = P_FFT2(:, (1: trainingSymbols_len,size(P_FFT2,2)-trainingSymbols_len+1:size(P_FFT2,2));

%信道均衡

% % 原理:寻求1/H,对FFT之后的数据进行频域补偿

% % 1/H = conj(H)/H^2 because H^2 = H * conj(H)

H = RxTrainSymbols./ trainingSymbols;

H_2 = H.^2;

H_2 = sum(H_2,2);

H_C2 = sum(H,2);

H_C2 = conj(H_C2);

H = H_C2./H_2 ; % 1/H = conj(H)/H^2

P_FFT3 = H*ones(1,size(P_FFT2,2)).*P_FFT2 ; %简单线性插值

P_FFT4 = P_FFT2(:,(trainingSymbols_len+2:size(P_FFT3,2)));

SQam = QPSK_demod(P_FFT4);

% 并串转换

s_out = reshape(SQam,1,s_len);

(8)QPSK_demod.m % QPSK解调函数

function [qam_out] = QPSK_demod(qam_in)

global QamTable;

global bitPerSymbol ;

[m,n] = size(qam_in);

qam_out = zeros(m,n*bitPerSymbol);

% 判决

for k = 1:m

delt = abs(reshape(qam_in(k,:), n, 1)*ones(1,4) - ones(n,1)*QamTable); %求最近的点

[tmp, index] = min(delt,[],2); %得到判决值

qam_outTmp = de2bi(index-1,bitPerSymbol,'left-msb');

qam_out(k,:) = reshape(qam_outTmp',1,bitPerSymbol*n);

end

相关文档