程序说明:
主程序:
① plotber-L.m文件
给定snr=20条件下,设定多径数L从1变到300,
调用以snr、L为输入、ber为输出的ofdm主函数(ofdm16qam.m文件、ofdmqpsk.文件),
计算单一条件下的多次循环求取平均值,
根据不同L下的ber画出ber-L曲线。
for L=1:300
SNR=20; %给定snr=20条件下
ber(L)=0;
for times=1:5 %多次循环取平均
ber(L)=ber(L)+ofdm16qam(SNR,L);
end
ber(L)=ber(L)/5;
end
for l=1:300
snr=20;
BER(l)=0;
for timess=1:5 %多次循环取平均
BER(l)=BER(l)+ofdmqpsk(snr,l);
end
BER(l)=BER(l)/5;
end
figure(1);
plot(ber,'r')
semilogy(ber,'r') %取对数
hold on;
plot(BER,'b');
semilogy(BER,'b');
② plotber-snr.m文件
给定L=6条件下,设定信噪比snr从1变到30,
调用以snr、L为输入、ber为输出的ofdm主函数(ofdm16qam.m文件、ofdmqpsk.文件),
计算单一条件下的多次循环求取平均值,
根据不同snr下的ber画出ber-snr曲线。
for SNR=1:30
L=6; %给定L=6条件下
ber(SNR)=0;
for times=1:50 %多次循环取平均
ber(SNR)=ber(SNR)+ofdm16qam(SNR,L);
end
ber(SNR)=ber(SNR)/50;
end
for snr=1:30
l=6; %给定L=6条件下
BER(snr)=0;
for timess=1:50 %多次循环取平均
BER(snr)=BER(snr)+ofdmqpsk(snr,l);
end
BER(snr)=BER(snr)/50;
end
figure(1);
plot(ber,'r');
semilogy(ber,'r'); %取对数
hold on;
plot(BER,'b');
semilogy(BER,'b');
主函数:
① ofdmqpsk.m文件
包括参数设置、初始信号生成、串并转换、调制解调、ifft和fft、插入保护间隔和去除保护间隔、添加信道噪声、频域均衡、计算误码率等模块。
function [ ber ] = ofdmqpsk( snr,L ) %输入snr,L,返回ber值
%UNTITLED3 此处显示有关此函数的摘要
% 此处显示详细说明
carrier=1024;%载波数
numb_ifft=1024;%fft点数
symb_ofdm=6;%每个载波的符号数
bit_symb=2;%每个符号所含比特数
numb_cp=256;%保护间隔的长度:1/4
%----------------------------------------发射部分--------------------------
%--------------------------------------------------------------------------
%--------产生OFDM信号--------------
signal=round(rand(1,carrier*symb_ofdm*bit_symb));
%---------串并变换----------------
signal_r=reshape(signal,carrier,symb_ofdm*bit_symb);
%-------QPSK调制-----------------
for k=1:carrier
for n=1:bit_symb*symb_ofdm/2 %每两个比特分成一组00 01 10 11
imp=signal_r(k,2*n);
rlp=signal_r(k,2*n-1);
if(imp==0)&&(rlp==0)
d(k,n)=exp(i*5*pi/4); %00 相位5*pi/4
end
if(imp==0)&&(rlp==1)
d(k,n)=exp(i*7*pi/4); %10 相位7*pi/4
end
if(imp==1)&&(rlp==0)
d(k,n)=exp(i*3*pi/4); %01 相位3*pi/4
end
if(imp==1)&&(rlp==1)
d(k,n)=exp(i*pi/4); %11 相位pi/4
end
end
end
signal_qpsk=d/sqrt(10); %经过qpsk调制后的信号
%-------------插入导频信号--------------------
pilot_r=round(rand(1,carrier)); %生成二进制随机导频序列 1行1024列
pilot=reshape(pilot_r,carrier,1); %1024行1列
for p=1:carrier %将0变为-1,
if(pilot(p,:)==0)
pilot(p,:)=-1;
end
end
for q=1:symb_ofdm %每隔一列原信号符号插入一列导频信号
signal_pilot(:,2*q-1)=pilot;
signal_pilot(:,2*q)=signal_qpsk(:,q);
end
%-----------------IFFT------------------------
signal_ifft=ifft(signal_pilot); %ifft变换
%--------------------插入保护时隙----------------
signal_cp((1+numb_cp:numb_ifft+numb_cp),:)=signal_ifft((1:numb_ifft),:);
signal_cp((1:numb_cp),:)=signal_ifft((numb_ifft-numb_cp+1:numb_ifft),:); %在原信号阵列最前插入256行保护间隔,这256行信号等于原信号的最后256行信号
%---------------------并串转换------------------------------
signal_tr=reshape(signal_cp,1,(numb_ifft+numb_cp)*symb_ofdm*bit_symb); %变成串行信号发射
%--------------------------------------------------------------------------
%-------------------------------------生成频率选择性信道--------------------
h=(randn(L,1)+1i*randn(L,1))/sqrt(2)/sqrt(L); %生成L行1列的信道序列
H(L,symb_ofdm)=0; %考虑到多径时延效应,生成延时矩阵
for x=1:symb_ofdm
H(x,x:L)=h(1:L+1-x,1);
end
H=H';
%----------------------------------------接收部分--------------------------
%------------------------串并变换------------------------
signal_trr=reshape(signal_tr,carrier+numb_cp,symb_ofdm*bit_symb); %将接收信号变为并行信号以便后续操作
%------------------------信号经过信道----------------------------
signal_re(2*(carrier+numb_cp+L-1),1)=0;%通过信道后的信号空矩阵
signal_rre(2*(carrier+numb_cp+L-1),symb_ofdm)=0;%加噪声后的信号空矩阵
for a=1:symb_ofdm %由于多径时延,在这里分别考虑每列符号
if(L>=symb_ofdm)
signal_re(1:carrier+numb_cp+L-1)=conv(signal_trr(:,2*a-1),H(1:L,a));%导频信号通过信道,卷积
signal_re(carrier+numb_cp+L:2*(carrier+numb_cp+L-1))=conv(signal_trr(:,2*a),H(1:L,a));%原信号通过信道,卷积
end
if(L<symb_ofdm)
signal_re(1:carrier+numb_cp+L-1)=conv(signal_trr(:,2*a-1),h);%导频信号通过信道,卷积
signal_re(carrier+numb_cp+L:2*(carrier+numb_cp+L-1))=conv(signal_trr(:,2*a),h);%原信号通过信道,卷积
end
%这里导频信号与原信号分开,便于后续频域均衡
SNR_d=10^(snr/10);
Ps=mean((abs(signal_re)).^2); %计算功率
Pn=Ps/SNR_d;
z=sqrt(Pn/2)*(randn(size(signal_re))+1i*(randn(size(signal_re)))); %生成同维噪声
signal_re=signal_re+z;
signal_rre(:,a)=signal_re;
%经过信道且添加噪声后的信号 2570行,前256+1024行为导频信号,中间多出5行为信道与信号卷积后多出的信号,后256+1024行为原信号,最后5行为信道与信号卷积后多出的信号
end
%-----------------------去除循环前缀-------------------------------
signal_ncp(2*carrier,symb_ofdm)=0; %空矩阵
signal_ncp(1:carrier,:)=signal_rre((1+numb_cp):(carrier+numb_cp),:); %去掉循环前缀的导频信号
signal_ncp((carrier+1):(2*carrier),:)=signal_rre((carrier+numb_cp+L+numb_cp):(2*(carrier+numb_cp+L-1)-L+1),:); %去掉循环前缀的原信号
%-------------------------FFT---------------------------------
signal_fft(2*carrier,symb_ofdm)=0;
signal_fft(1:carrier,:)=fft(signal_ncp(1:carrier,:)); %导频信号fft
signal_fft(carrier+1:2*carrier,:)=fft(signal_ncp(carrier+1:2*carrier,:)); %原信道fft
%-------------------------导频位置信道响应的LS估计------------------------
LS(carrier,symb_ofdm)=0;
for v=1:symb_ofdm
LS(:,v)=signal_fft(1:carrier,v)./pilot;
end
%----------------------均衡,还原信号---------------------------
signal_LS=signal_fft(carrier+1:2*carrier,:)./LS;
signal_LS=signal_LS*sqrt(2);
%-------------------------QPSK解调-----------------------------
r_signal_really(carrier,symb_ofdm)=0;
i_signal_really(carrier,symb_ofdm)=0;
for o=1:carrier
for j=1:symb_ofdm
r_signal_really(o,j)=real(signal_LS(o,j));
i_signal_really(o,j)=imag(signal_LS(o,j)); %根据极性判断恢复原信号
if(r_signal_really(o,j)<=0) %3*pi/4 5*pi/4
r_signal_really(o,j)=0;
else %pi/4 7*pi/4
r_signal_really(o,j)=1;
end
if(i_signal_really(o,j)<=0) %5*pi/4 7*pi/4
i_signal_really(o,j)=0;
else %pi/4 3*pi/4
i_signal_really(o,j)=1;
end
signal_really(o,2*j-1)=r_signal_really(o,j);
signal_really(o,2*j)=i_signal_really(o,j); %将每两比特为一组的信号拆分恢复
end
end
%-----------------------------并串变换-----------------------------
signal_final=reshape(signal_really,1,carrier*symb_ofdm*bit_symb); %恢复串行信号
%-------------------计算误比特率BER-------------------------------------
bit_error=signal_final-signal;
te=sum(abs(bit_error)); %计算误码个数
ber=te/(carrier*symb_ofdm*bit_symb); %计算误码率
end
② ofdm16qam.m文件
包括参数设置、初始信号生成、串并转换、调制解调、ifft和fft、插入保护间隔和去除保护间隔、添加信道噪声、频域均衡、计算误码率等模块。
function [ ber ] = ofdm16qam(snr,L)
%UNTITLED3 此处显示有关此函数的摘要
% 此处显示详细说明
carrier=1024;%载波数
numb_ifft=1024;%fft点数
symb_ofdm=6;%每个载波的符号数
bit_symb=4;%每个符号所含比特数
numb_cp=256;%保护间隔的长度:1/4
%----------------------------------------发射部分--------------------------
%--------------
- 1
- 2
前往页