📄 ofdm1.m
字号:
for SNR=1:20 %信噪比取值,dB为单位
fl=128; %设置FFT长度
Ns=6; %设置一个帧结构中OFDM符号个数
para=128; %设置并行传播的子载波个数
sr=250000; %设置符号速率
br=sr.*2; %设置每个子载波个数
gl=32; %设置保护时隙长度
Signal=rand(1,para*Ns*2)>0.5;
%产生0,1随机序列,符号个数为para*Ns*2
%for i=1:para
% for j=1:Ns*2
% SigPara(i,j)=Signal(i*j);
for j=1:Ns*2
for i=1:para
SigPara(i,j)=Signal((128*(j-1)+i));
%串并转换,将随机产生的二进制矩阵变换为行数为para,列数为Ns*2的矩阵
end
end
%进行QPSK数据调制,将数据分为两个通道
for j=1:Ns
ich(:,j)=SigPara(:,2*j-1);
qch(:,j)=SigPara(:,2*j); %把128*12变成2个128*6
end
kmod=1./sqrt(2); %kmod=0.707
ich1=ich.*kmod;
qch1=qch.*kmod;
x=ich1+qch1.*sqrt(-1); %产生复信号
y=ifft(x); %通过傅里叶反变换,将频域数据x转换为时域数据y
ich2=real(y); %I信道取变换后的实部
qch2=imag(y); %Q信道取变换后的虚部
%插入保护间隔
ich3=[ich2(fl-gl+1:fl,:);ich2];
qch3=[qch2(fl-gl+1:fl,:);qch2];
%并串转换
ich4=reshape(ich3,1,(fl+gl)*Ns);
qch4=reshape(qch3,1,(fl+gl)*Ns);
%形成复数发射数据
TrData=ich4+qch4.*sqrt(-1); %TrData是一个1*960的矩阵
%信道卷积
%hn=[a1 a2 a3 a4];
%TrData_conv=conv(hn,TrData);
%卷积conv反卷积deconv二维卷积conv2
%complex_TrData=conv(pilot_symbols,TrData)
%接收机
ReData=awgn(TrData,SNR,'measured'); %加入高斯白噪声
%ReData=TrData; %无噪声情况
%接收端
%移去保护时隙
idata=real(ReData);
qdata=imag(ReData);
idata1=reshape(idata,fl+gl,Ns); %串并变换成160*6
qdata1=reshape(qdata,fl+gl,Ns); %串并变换
idata2=idata1(gl+1:gl+fl,:);
qdata2=qdata1(gl+1:gl+fl,:);
%FFT解调
Rex=idata2+qdata2*sqrt(-1);
ry=fft(Rex); %FFT变换
%取出导频符号
ReIChan=real(ry);
ReQChan=imag(ry);
ReIChan=ReIChan/kmod;
ReQChan=ReQChan/kmod;
%QPSK逆映射
for j=1:Ns
RePara(:,2*j-1)=ReIChan(:,j);
RePara(:,2*j)=ReQChan(:,j); %把2个128*6变成128*12
end
ReSig=reshape(RePara,1,para*Ns*2); %并串成1*1536
%符号抽样判决
ReSig=ReSig>0.5;
%误码率表示
bit_errors = find(Signal ~= ReSig) ;
bit_error_count = size(bit_errors, 2) ;
total_bits = size( ReSig, 2) ;
bit_error_rate = bit_error_count/ total_bits;
fprintf ( 'Pe=%f \n',bit_error_rate) ;
%画出误码率的图
x(1,SNR)=SNR;
y(1,SNR)=bit_error_rate;
end
figure(2)
stem(x,y);
%画出原始信号与接收信号
figure(3)
subplot(211),stem(ReSig(1:40)),grid;subplot(212),stem(Signal(1:40)),grid
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -