(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