📄 ofdm_good.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 + -