📄 ofdmnew2.m
字号:
%506*2*128=129536,纠错码,三种信道num =1310ratio =0.0101,SNR=10
%506*2*128=129536,纠错码,三种信道num =0ratio =0,SNR=20
%数据调制采用QPSK
clear;
clc;
%***********************参数设置部分***************************
SNR=20; %信噪比,单位dB
fl=128; %设置FFT长度(FFTlength)
Ns=506; %设置一个帧结构中OFDM信号的个数
para=128; %设置并行传输的子载波个数
sr=250000; %设置符号速率(symbolrate)
bt=sr.*2; %设置每个子载波的比特率(bitrate)
gl=32; %设置保护时隙的长度(guardlength)
%************************发送端部分****************************
signal=randint(1,para*Ns*2); %产生0、1随机数列,符号个数为para*2*Ns(子信道个数*调制水平*每个子信道中有用符号个数)
for l=1:para*Ns*2
signal2(l,1)=signal(1,l);
end
n=1022;
e=n/2;
code1 = encode(signal2,n,Ns*2,'cyclic/binary');
for i=1:para
for j=1:n
sigpara(i,j)=code1(((i-1)*n+j),1); %串并转换,将随机产生的二进制矩阵变换为行数为para,列数为2*Ns的矩阵
end
end
%进行QPSK调制,将数据分为两个通道
for j=1:e
ich(:,j)=sigpara(:,2*j-1);
qch(:,j)=sigpara(:,2*j);
end
kmod=1./sqrt(2);
ich1=ich.*kmod;
qch1=qch.*kmod;
x=ich1+qch1.*sqrt(-1);
y=ifft(x);
ich2=real(y);
qch2=imag(y);
%插入保护间隔
ich3=[ich2(fl-gl+1:fl,:);ich2];
qch3=[qch2(fl-gl+1:fl,:);qch2];
%并串转换
ich4=reshape(ich3,1,(fl+gl)*e);
qch4=reshape(qch3,1,(fl+gl)*e);
%形成复数发射数据
Trdata=ich4+qch4.*sqrt(-1);
%*************************信道*********************
%Redata=Trdata; %无噪信道的理想情况
%加性白高斯信道
Redata=awgn(Trdata,SNR,'measured');
%*************************信道(瑞利信道)*********************
%c = Rayleighchan;
%y=filter(c,Trdata);
%Redata = awgn(y,SNR,'measured');
%*************************信道(莱斯信道)*********************
%c=ricianchan;
%y=filter(c,Trdata);
%Redata = awgn(y,SNR,'measured');
%*************************接收端部分*******************************
%移去保护时隙
idata=real(Redata);
qdata=imag(Redata);
idata1=reshape(idata,fl+gl,e);
qdata1=reshape(qdata,fl+gl,e);
idata2=idata1(gl+1:gl+fl,:);
qdata2=qdata1(gl+1:gl+fl,:);
%FFT
Rex=idata2+qdata2*sqrt(-1);
ry=fft(Rex);
ReI=real(ry)/kmod;
ReQ=imag(ry)/kmod;
%QPSK逆映射
for j=1:e
Repara(:,2*j-1)=ReI(:,j);
Repara(:,2*j)=ReQ(:,j);
end
[a,b]=size(Repara);
%符号抽样判决
for i=1:a
for j=1:b
if Repara(i,j)>0.5
Resig1(i,j)=1;
else
Resig1(i,j)=0;
end
end
end
for i=1:para
for j=1:n
Resig((i-1)*n+j)=Resig1(i,j); %并串转换,将行数为para,列数为2*Ns的矩阵变为行数为1,列数为para*Ns*2的矩阵
end
end
for l=1:para*n
signal3(l,1)=Resig(1,l);
end
code2 = decode(signal3,n,Ns*2,'cyclic/binary');
for l=1:para*Ns*2
signal4(1,l)=code2(l,1);
end
%***************************结果*********************************************
[num ratio]=symerr(signal,signal4) %误码率比较,num表示错误码元个数,ratio表示错误码元比率
%***************************绘图*********************************
subplot(211)
stem(signal4(1:20));
grid;
subplot(212)
stem(signal(1:20));
grid;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -