clear;
clc;
carr=256; %子载波个数
sym_c=10; %每个子载波含有的OFDM符号数
bit_sym=2; %每个符号含有的比特数,QPSK调制
IFFT_n=256; %IFFT点数
r=1/10; %保护间隔和OFDM数据的比例;
SNR=10; %信噪比 dB
%产生信号
sum=carr*sym_c*bit_sym;
colume=sum/(2*carr);
signal=rand(1,sum)>0.5; %初始信号
%QPSK调制,QPSK_sig里面存放的是调制后的信号,数目sumQ
sumQ=sum/2;
imag=sqrt(-1); % 虚部 j
QPSK=[-1+imag,-1-imag,1+imag,1-imag]; %创建QPSK 映射表
SIGNAL=zeros(1,sumQ); %计算并存放调制前的十进制数据
QPSK_sig=zeros(1,sumQ); %存放调制后的QPSK信号
for n=1:sumQ
SIGNAL(n)=signal(2*n-1)*2+signal(2*n); %将二进制换算成十进制
end
for i=1:sumQ
if SIGNAL(i)==0;
QPSK_sig(i)=QPSK(1);
elseif SIGNAL(i)==1;
QPSK_sig(i)=QPSK(2);
elseif SIGNAL(i)==2;
QPSK_sig(i)=QPSK(3);
elseif SIGNAL(i)==3;
QPSK_sig(i)=QPSK(4);
end
end
%串/并转换 计算第i个载波上面的信号to_par(i,:)
colume=sumQ/carr;
for i=1:carr % carr载波个数
for j=1:colume;
to_par(i,j)=QPSK_sig(carr*(j-1)+i);
end
end
colume=sumQ/carr;
% % to_par=reshape(QPSK_sig,carr,colume);
%每个子载波上进行 IFFT变换 (调制后的QPSK信号进行IFFT)
for j=1:colume
y(:,j)=ifft(to_par(:,j));
end
% % y=ifft(to_par);
yr=real(y); %实部
yi=(y-yr)*sqrt(-1)*(-1);
%加入保护间隔
CP_len=r*colume; %保护间隔长度
yr=[yr(:,colume-CP_len+1:colume),yr];
yi=[yi(:,colume-CP_len+1:colume),yi];
% 并/串 转换
% % y_=yr+yi*sqrt(-1); %并联的复信号
% % colume=sum/(2*carr);
% % for i=1:carr % carr载波个数
% % for j=1:colume;
% % y_series(carr*(j-1)+i)=y_(i,j);
% % end
% % end
y_=yr+yi*sqrt(-1);
y_series=reshape(y_,1,(colume+CP_len)*carr);
%加入高斯白噪声
y_s_noi=awgn(y_series,SNR,'measured');
% 串/并 转换
% % for i=1:carr
% % for j=1:colume
% % y_par(i,j)=y_s_noi(carr*(j-1)+i);
% % end
% % end
y_par=reshape(y_s_noi,carr,colume+CP_len);
%去掉保护间隔
y_r=real(y_par);
y_i=(y_par-y_r)*(-1)*sqrt(-1);
y_r=y_r(:,CP_len+1:colume+CP_len);
y_i=y_i(:,CP_len+1:colume+CP_len);
%FFT变换
y_complex=y_r+y_i*sqrt(-1);
% % for i=1:carr
% % y_fft(i,:)=fft(y_complex(i,:));
% % end
for j=1:colume
y_fft(:,j)=fft(y_complex(:,j));
end
%并/串 转换
% % for i=1:carr
% % for j=1:colume
% % y_receive(carr*(j-1)+i)=y_fft(i,j);
% % end
% % end
y_receive=reshape(y_fft,1,sumQ);
%下面注释掉的部分是验证调制后的QPSK和接收到的复信号对比。
% % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% % % % figure(1);
% % % % subplot(2,1,1),stem(QPSK_sig(1:50)),grid minor;
% % % % title('The Original Signal');
% % % % xlabel('x'),ylabel('y');
% % % %
% % % % subplot(2,1,2),stem(y_receive(1:50)),grid minor;
% % % % title('The Final Signal');
% % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% QPSK逆映射
QPSK=[-1+imag,-1-imag,1+imag,1-imag];
Y_r=real(y_receive);
Y_i=(y_receive-Y_r)*(-1)*sqrt(-1);
for i=1:sumQ
if Y_r(i)<0;
Y_r(i)=0;
else
Y_r(i)=1;
end
end
for i=1:sumQ
if Y_i(i)<0;
Y_i(i)=1;
else
Y_i(i)=0;
end
end
for i=1:sumQ
Y(2*i-1)=Y_r(i);
Y(2*i)=Y_i(i);
end
check=signal-Y;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(1);
subplot(3,1,1),stem(signal(1:50)),grid minor;
title('The Original Signal');
xlabel('x'),ylabel('y');
subplot(3,1,2),stem(Y(1:50)),grid minor;
title('The Final Signal');
subplot(3,1,3),stem(check(1:50)),grid minor;
title('发端与收端的误差');
评论1