📄 ofdm.m
字号:
%信道的设置
clear all
clc
case_num=2;%case1 Tmax=410ns speed=3/30/120;case2 Tmax=2510ns
%speed=3/30/120;case3 Tmax=3700ns speed=3/30/120
Speed_kmh=3;
connection='downlink';
Tx_num=1;
Rx_num=1;
Spacing_NodeB=4;
Spacing_UE=0.5;
if connection=='downlink'
NumberOfAntennas_NodeB=Tx_num;
NumberOfAntennas_UE=Rx_num;
elseif connection=='uplink'
NumberOfAntennas_NodeB=Rx_num;
NumberOfAntennas_UE=Tx_num;
end
nd=1;%每次仿真产生一个OFDM符号
ml=2;%调制方式 QPSK调制
iteration=100;%重复100次取均值,因为有噪声的加入
snr_step = 2; % the step of SNR change
down = 0; % the down boundary of SNR range
up = 0; % the up boundary of SNR range
snr_num = fix((up-down)/snr_step)+1; % the number of SNR to calculate
snr_db = [down:snr_step:up];
disp(['SNR: ' num2str(down) ' --- ' num2str(up)]);%显示一个1*4的矩阵,每个分别是...
fftlen=1024;
subcarrier=50*12; %subcarrier需小于fftlen,(采样速率fs=1/Ts=N*f),根据采样定理,只有当频域采样点数N>Nc时,才可恢复原来的信号,否则出现时域混叠.
%Nc*f=OFDM符号的标称带宽
cp=16;%保护间隔的长度,根据不同的case(最大的时延扩展)可确定不同的循环前缀.case1,cp>410ns,取800ns;case2,cp>2510ns,取4000ns;
%case3 cp>3700ns,取5000ns
sample_rate=cp/4000e-9; %800/16=50,4000/16=250;5000/16=312.5
for k=1:snr_num
snr=floor(down)+snr_step*(k-1); %循环一次错误的比特数
for iter=1:iteration
disp(['SNR:' ,num2str(snr),'iteration:',num2str(iter)]); %显示此时的信噪比和重复的次数
err_idealH=0; %理想状况下的错误比特数为0
userdata=rand(1,subcarrier*ml); %产生随机信号
subplot(2,2,1);
plot(userdata);
%QPSK调制
for m=1:subcarrier*nd
modu_data(m)=j^(1+abs(userdata(2*m)-userdata(2*m-1))+userdata(2*m)*2);
end
%串并变换
y=reshape(modu_data,subcarrier,nd); %通过reshape命令进行串并变换
ofdm_in=zeros(fftlen,nd); %清0,加载数据,
ofdm_in(1:subcarrier,:)=y(1:subcarrier,:); %从1到subcarrier行,所有的列的装载数据即是调制后的数据
ofdm_in(subcarrier+1:fftlen,:)=zeros(fftlen-subcarrier,nd); %负频域部分为0,所以频域中间补0等同于后面补0
%做1024点的IFFT运算,完成OFDM调制
yy=ifft(ofdm_in,fftlen)*sqrt(fftlen); %功率归一化,逆FFT变换前面有个系数sqrt(1/N)
yy1=abs(yy);
subplot(2,2,2);
plot(yy1);
%插入循环前缀
ofdm_cp_in=vertcat(yy(fftlen-cp+1:fftlen,:),yy); %vertcat(合并两个矩阵),将OFDM符号的最后CP长度的样点复制到整个OFDM符号的前面构成.从而使得OFDM符号的周期变为cp+fftlen
%并串变换
send(1,:)=reshape(ofdm_cp_in,1,(fftlen+cp)*nd);
send1=abs(send)
subplot(2,2,3);
plot(send1);
%接收端
%串并变换
ry=reshape(send(1,:),(fftlen+cp)*nd,nd);
%去除循环前缀
deofdm_cp_out(1:fftlen,:)=ry(cp+1:cp+fftlen,:); %将串并变换以后形成的数据中的后fftlen长度的数据复制
%作1024点FFT,完成OFDM解调
deofdm_out=fft(deofdm_cp_out,fftlen)/sqrt(fftlen);
outdata=zeros(subcarrier,nd);
outdata(1:subcarrier/2,:)=deofdm_out(1:subcarrier/2,:);
outdata(subcarrier/2+1:subcarrier,:)=deofdm_out(fftlen-subcarrier/2+1:fftlen,:);
%并串变换
out=reshape(outdata,1,subcarrier*nd);
lastout=abs(out)
subplot(2,2,4);
plot(lastout);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -