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

📄 ofdm_good.m

📁 这个程序用于生成OFDM信号和它的频谱
💻 M
字号:
% Faculty of Engineering, University of Fukui. 2003/11/11
% coded by Sokthai Chan (sokthai@msn.com)
% OFDM signal and its spectrum ( Guard Interval insertion )

clear all;

Fd=1;             % symbol rate (1Hz) 符号速率
Fs=1*Fd;          % number of sample per symbol   每符号的采样数
M=4;              % kind(range) of symbol (0,1,2,3)

Ndata=1024;       % all transmitted data symbol      %所有待传输的数据符号,*4=4096个比特
Sdata=64;         % 64 data symbol per frame to ifft %每帧用于计算IFFT的数据符号,即数据子载波数
Slen=128;         % 128 length symbol for IFFT       %IFFT长度,即子载波数
Nsym=Ndata/Sdata; % number of frame -> Nsym frame    %总帧数
GIlen=144;        % symbol with GI insertion         %插入GI后的符号长度=128+16
GI=16;            % guard interval length            %GI的长度

% vector initialization
X=zeros(Ndata,1);%总的4进制数据符号
Y1=zeros(Ndata,1);%IQ两列的形式表示的总的数据符号 1024行2列
Y2=zeros(Ndata,1);%将IQ两列转换成星座点 1024行1列
Y3=zeros(Slen,1); %OFDM的128个子载波
z0=zeros(Slen,1);  %128*1 单帧IFFT的结果
z1=zeros(Ndata/Sdata*Slen,1); % 128*16=2048行,所有帧的IFFT结果
g=zeros(GIlen,1);  %128+16=144 单帧IFFT的结果加上循环前缀
z2=zeros(GIlen*Nsym,1); %144*16=2304,所有帧的g
z3=zeros(GIlen*Nsym,1); %未用到

% random integer generation by M kinds 
X = randint(Ndata, 1, M); %产生4进制符号 1024*1

% digital symbol mapped as analog symbol
Y1 = modmap(X, Fd, Fs, 'qask', M);  %将4进制符号映射成IQ两列   1024*2

% covert to complex number
Y2=amodce(Y1,1,'qam'); %将IQ两列转换成星座点 1024*1

for j=1:Nsym;%一共有16帧

    for i=1:Sdata; %每帧64个数据符号
        Y3(i+Slen/2-Sdata/2,1)=Y2(i+(j-1)*Sdata,1); %将Y2中每64个点放到Y3的33~96中
    end

    z0=ifft(Y3); %Y3在初始化时是128*1,加入的Y2的64个点相当于加到64个数据载波上,位于OFDM的33~96子载波
    
    for i=1:Slen; %z0为128点
        z1(((j-1)*Slen)+i)=z0(i,1); %将各帧的z0保存到z1中
    end

    %
    for i=1:Slen;
        g(i+16)=z0(i,1); %g相当于将z0后移16  g:144*1
    end
    
    for i=1:GI;%16点
        g(i)=z0(i+Slen-GI,1);    %放入循环前缀,为z0的最后16个点
    end

    for i=1:GIlen; %加入GI后,总长为16+128=144个点
        z2(((j-1)*GIlen)+i)=g(i,1);%将各帧的g保存到z2中
    end
    
end

%==============画16个符号的图
% graph on time domain
figure(1); %时域波形图
subplot(3,1,1);
f = linspace(-Sdata,Sdata,length(z1));%在-64~64范围内均匀划分z1=2048个点
plot(f,abs(z1));
title('16个OFDM符号的时域波形\幅度谱\对数幅度谱'); 

  Y4 = fft(z1); %对OFDM时域波形做FFT变换,Y4为频域点 2048个点=时域波形z1的点数
                %Y4求出来为实数值!!!!!

% if Y4 is under 0.01 Y4=0.001 %限定频域点的最小值
for j=1:Ndata/Sdata*Slen;
if abs(Y4(j)) < 0.01
    Y4(j)=0.01;
end
end

%figure(2);%幅度谱
subplot(3,1,2);
f = linspace(-Sdata,Sdata,length(Y4));%在-64~64范围内均匀划分z1=2048个点
plot(f,Y4);
%plot(f,fftshift(Y4));
axis([-Slen/2 Slen/2 -10 10]);% -64~64,
%title('16个OFDM符号的幅度谱'); 

Y4 = 10*log10(abs(Y4)); %取为对数

% graph on frequency domain
%figure(3);%对数幅度谱
subplot(3,1,3);
f = linspace(-Sdata,Sdata,length(Y4));%在-64~64范围内均匀划分z1=2048个点
plot(f,Y4);
axis([-Slen/2 Slen/2 -20 20]);% -64~64,
%title('16个OFDM符号的对数幅度谱'); 

%===========画1个符号的图
figure(2); %时域波形图
subplot(3,1,1);
f = linspace(-Sdata,Sdata,length(z0));%在-64~64范围内均匀划分z1=2048个点
plot(f,abs(z0));
title('最后1个OFDM符号的时域波形\幅度谱\对数幅度谱'); 

  Y4 = fft(z0); %对OFDM时域波形做FFT变换,Y4为频域点 2048个点=时域波形z1的点数
                %Y4求出来为实数值!!!!!

% if Y4 is under 0.01 Y4=0.001 %限定频域点的最小值
for j=1:length(z0);
if abs(Y4(j)) < 0.01
    Y4(j)=0.01;
end
end

%figure(2);%幅度谱
subplot(3,1,2);
f = linspace(-Sdata,Sdata,length(Y4));%在-64~64范围内均匀划分z1=2048个点
plot(f,Y4);
%plot(f,fftshift(Y4));
axis([-Slen/2 Slen/2 -3 3]);% -64~64,
%title('最后1个OFDM符号的幅度谱'); 

Y4 = 10*log10(abs(Y4)); %取为对数

% graph on frequency domain
%figure(3);%对数幅度谱
subplot(3,1,3);
f = linspace(-Sdata,Sdata,length(Y4));%在-64~64范围内均匀划分z1=2048个点
plot(f,Y4);
axis([-Slen/2 Slen/2 -20 20]);% -64~64,
%title('最后1个OFDM符号的对数幅度谱'); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -