⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdm1.m

📁 matlab环境中ofdm基本原理的源程序
💻 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 + -