%%% wh@cqu.edu.cn
clear;clc;close all;
%系统基本参数
N=64; %子载波数目
CP = 16; %循环前缀长度
M = 100; %实际使用子载波数目
Symbol_len = N+CP; %OFDM符号长度=子载波数目+循环前缀长度
%CP N CP N ... CP N CP N
Symbol_nums = 100; %仿真的一帧OFDM符号个数
Frame_len=Symbol_nums*Symbol_len; %帧长度
mod_type =2; %一个qpsk符号2bit
rand('state',sum(100*clock)); %产生一个随机数种子,供后面的randn函数调用。
SNRindB=0:2:16; %定义一个数组,分别是0 2 4...16,单位是dB,代表分别在这些信噪比下依次进行OFDM调制、解调仿真
for di = 1:length(SNRindB)
%仿真数据,一帧有Symbol_nums个OFDM符号,一个符号实际使用M个载波,每个载波用QPSK调制传输2个bit
%所以这里要产生Symbol_nums*M*2 bits 数据
Frame_bitlen = Symbol_nums*M*mod_type;
Infobits=zeros(1,Frame_bitlen); %初始化一维数组,长度为Frame_bitlen
Infobits=Inf_Bit_Get(Frame_bitlen); %随机产生一帧需要传输的bit数据,长度为Frame_bitlen
%基带子载波上QPKS调制
inf_mod_temp = modulation(Infobits, mod_type); %把bit用QPSK调制,调制后inf_mod为QPSK星座映射后的复数数据
inf_mod = zeros(1,length(inf_mod_temp));
%%%%%%频域添加高斯噪声,等效于最后的时域信号去通过一个高斯信道
for kk=1:length(inf_mod_temp)
%randn产生一个方差为1的标准高斯分布,我们这里乘以系数得到对应信噪比下的高斯噪声,这里由于我们QPSK调制后是符号,添加噪声的
%时候也是在I和Q两路同时添加
inf_mod(kk) = inf_mod_temp(kk);%+sgma*randn+j*sgma*randn;
end;
%%%%%%
%基带OFDM多载波调制
nTemp = zeros(1,N); %一个符号的频域包含N载波,需要把待调制的数据添加到其中的低频M个子载波
nTemp_t = zeros(1,N); %一个符号的时域,其等效为一个符号频域做IFFT
nTemp_t_cp = zeros(1,N+CP); %包含循环前缀的时域
info_t = zeros(1,Frame_len); %初始化一个数组,用来装一帧时域数据,长度为Frame_len
for ii = 1:Symbol_nums
%0子载波未用,并且频域高频子载波也没有用,总共512子载波,实际之用了300个,分布在0频左右各150个。
%放M/2个QPSK符号到频域1....M/2子载波上,
nTemp(2:M/2+1)=inf_mod((ii-1)*M+1:(ii-1)*M+M/2);
%放M/2个QPSK符号到频域-1....-M/2子载波上
nTemp(N-((M/2)-1):N) = inf_mod((ii-1)*M+1+M/2:(ii-1)*M+M);
%调制得到一个符号的时域信号
nTemp_t = ifft(nTemp);
%为了抗多径衰老,添加循环前缀
nTemp_t_cp = [nTemp_t(N+1-CP:N),nTemp_t];
%把第ii个符号的时域信号放到总的输出时域信号上
info_t((ii-1)*Symbol_len+1:(ii-1)*Symbol_len+Symbol_len)=nTemp_t_cp;
end;
%%%%%%
len1 = length(info_t);
rec_info_pro = zeros(1,len1);
SNR=exp(SNRindB(di)*log(10)/10); %这个表达式把信噪比由对数比转换为功率比
Ec=1; %我们采用QPSK调制,并且每个QPSK符号功率归一化为1,因此QPSK符号能量为1
Eb=Ec/mod_type; %由于每个QPSK含I和Q两+路,每路包含1bit,那么bit能量为符号能量的一半
N0 = Eb/SNR ; %这里得到高斯噪声的单边功率谱密度
sgma = sqrt(N0/2); %高斯噪声服从高斯分布,通过N0来得到高斯分布的方差
%%%%%
for iii = 1:len1
rec_info_pro(iii)=info_t(iii)+(sgma*randn+j*sgma*randn)/sqrt(N);
end;
%%%%%
%%%%%%
%基带OFDM多载波解调
recv_info_t = rec_info_pro; %接受的时域信号,这里我们假设完全同步,并且只是通过的高斯信道
recv_Infobits = zeros(1,Frame_bitlen); %定义一个数组用来存放QPSK解调后的bits
recv_inf_mod = zeros(1,length(inf_mod)); %定义一个数组用来存放OFDM解调后的QPSK符号
%%%%
recv_nTemp = zeros(1,N); %接收符号的频域包含N载波
recv_nTemp_t = zeros(1,N); %接收符号的时域
recv_nTemp_t_cp = zeros(1,N+CP); %包含循环前缀的时域
for ii = 1:Symbol_nums
%得到解调后的第ii个符号的时域数据,含CP,长度为N+CP
recv_nTemp_t_cp = recv_info_t((ii-1)*Symbol_len+1:(ii-1)*Symbol_len+Symbol_len);
%得到解调后的第ii个符号的时域数据,去掉CP后,长度为N
recv_nTemp_t = recv_nTemp_t_cp(CP+1:N+CP);
%用fft来解调时域信号,得到频域子载波上的QPSK符号数据
recv_nTemp = fft(recv_nTemp_t);
%由于我们只用了300个子载波,所以我们只取实际使用的300个子载波上的QPSK符号数据
recv_inf_mod((ii-1)*M+1:(ii-1)*M+M/2) = recv_nTemp(2:M/2+1);
recv_inf_mod((ii-1)*M+1+M/2:(ii-1)*M+M) = recv_nTemp(N-((M/2)-1):N);
end;
%recv_Infobits = demodulation(recv_inf_mod,2);
%QPSK解调最终得到数据bits
recv_Infobits=demodulation(recv_inf_mod,mod_type);
%%5%误码率测试模块,测试OFDM时域信号通过了高斯信道后解调得到的bits和发送的bits之间的误码率
ber(di)=0;
ltemp = length(recv_Infobits);
errtemp = 0;
for ll=1:ltemp
if (Infobits(ll)) ~= (recv_Infobits(ll))
errtemp=errtemp+1;
end;
end;
ber(di)=errtemp/ltemp;
end;
figure; %产生新窗口图形
semilogy(SNRindB,ber,'*'); %画出仿真得到的OFDM+QPSK在高斯信道下的解调误码率
%%%%下面部分是画出一个理论的QPSK解调误码率曲线。任何一本书都有关于QPSK在高斯信道下的解调误码率理论公式,请参考
SNRindB2=0:0.1:10;
for i=1:length(SNRindB2)
SNR=exp(SNRindB2(i)*log(10)/10);
% theoretical error rate
theo_err_prb(i)=qfunc(sqrt(2*SNR)); %%%杨鸿文版本P201,Q(x)=1/2erfc(x/sqrt(2))
end;
hold
semilogy(SNRindB2,theo_err_prb); %画出理论计算QPSK在高斯信道下的解调误码率 绘制半对数坐标图形,其y轴取以10为底的对数
grid on; %显示网格线 x轴为线性坐标
xlabel('Eb/N0 (dB)');ylabel('probability of bit error');
%最后通过比较,可以看到在高斯信道下,我们仿真得到的误码率和理论计算的误码率曲线是一致的,说明我们的仿真程序是正确的。
%另外这里强调下,在高斯信道下,OFDM和一般数字通信的误码率是一致的。OFDM最强大的是抗多径衰落,在多径和衰落信道下,其
%性能才能体现。
legend('OFDM+ QPSK Monte Carlo','QPSK theoretical'); %添加图例
%%%%%%%随着信噪比的增大,ofdm解调误码率以及qpsk解调误码率均下降
%%%%%%%误码率和信噪比的关系与调制方式,传输信道,编码方式都有关。
%%%%%%%调制方式BPSK 加性高斯白噪声信道AWGN 未编码 误码率为Pb=1/2erfc(sqrt(Eb/N0))=Q(sqrt(2r))
%%%%%%%调制方式QPSK 一样 一样
%%%%%%%误码率与BPSK一样,前提是QPSK与BPSK的输入二进制信息速率相同,二者的发送功率相同,加性噪声的单边功率谱密度N0
%%%%%%%相同的条件下,二者的平均误比特率是相同的。
%%%%%%%当MPSK及MQAM的频带利用率相同时,在M>4的情况下,MOAM的误比特率小于MPSK。
%%%%%%%在该程序上做一些改变,变成BPSK调制,得出的结论:与QPSK的误比特率是一样的
w=abs();
plot
- 1
- 2
- 3
前往页