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

📄 ofdm.m

📁 ofdm系统的FFT滤波器 及完成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 + -