📄 ofdm_signal(2).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 )
%
% 本例没有做解调等仿真差错概率的工作,仅仅构建了时域的OFDM符号
%(子载波上都采用QAM调制),然后通过FFT求得时域信号的频谱并绘图
clear all;
Fd=1; % symbol rate (1Hz)
Fs=2*Fd; % number of sample per symbol
M=4; % kind(range) of symbol (0,1,2,3) 其实可以用Matlab自带的QAM调制器qaskenco
Ndata=1024; % all transmitted data symbol 要仿真的符号数:2^10
Sdata=64; % 64 data symbol per frame to ifft 每组符号数(这个frame好像是子载波数的意思?)
Slen=Sdata*Fs/Fd; % 128 length symbol for IFFT IFFT的块长为128 ???
Nsym=Ndata/Sdata; % number of frame -> Nsym frame 组数
GI=16; % 16, guard interval length 保护间隔的长度=GIlen-Slen
GIlen=Slen+GI; % symbol with GI insertion 插入保护间隔后的符号长
% vector initialization
X=zeros(Ndata,1);
Y1=zeros(Ndata,1);
Y2=zeros(Ndata,1);
Y3=zeros(Slen,1);
z0=zeros(Slen,1);
z1=zeros(Ndata/Sdata*Slen,1); %每帧数据用128点,故有如此多个点
g=zeros(GIlen,1);
z2=zeros(GIlen*Nsym,1); %插入保护间隔之后的全部数据长
z3=zeros(GIlen*Nsym,1);
% random integer generation by M kinds
X = randint(Ndata, 1, M); % Ndata列向量,元素取值为0~M-1(信源符号)
% digital symbol mapped as analog symbol 把数字符号映射成为调制后的模拟符号:M个星座点的QAM信号
Y1 = modmap(X, Fd, Fs, 'qask', M); %这里也确定了采样速率
% covert to complex number
Y2=amodce(Y1,1,'qam'); % 1表示用一倍频采样
for j=1:Nsym; % 对每帧(组)数据进行每帧仿真
for i=1:Sdata
%Y3构成IFFT的一个符号帧。它中间元素是数据,两边是0
Y3(i+Slen/2-Sdata/2,1)=Y2(i+(j-1)*Sdata,1); %右边是一次取一帧数据,为什么只有64个?
%Y3(:,1)=Y2(i+(j-1)*Sdata,1);
%Y3([i:Sdata/2 Slen-Sdata/2+1:Slen],1)=Y2(i+(j-1)*Sdata,1);%2倍频采样
end
z0=ifft(Y3);
% for i=1:Slen;
% z1(((j-1)*Slen)+i)=z0(i,1);%把前面得到的每帧数据依次存放在z1中
% end
z1((j-1)*Slen+1:j*Slen)=z0; %取代从这里倒数第一个for,最后的z1就是所有的信号IFFT的结果
g(1:GI) = z0(Slen-GI+1:Slen); %代替下面第二个for
g(GI+1:GI+Slen) = z0(1:Slen); %代替下面第一个for,获取加入CP后的一个符号
z2((j-1)*GIlen+1:j*GIlen)=g; %代替下面第三个for, 把带有CP的符号放入z2中
end
%加上保护间隔的一个帧的符号
% for i=1:Slen
% g(i+GI)=z0(i,1); % g的前面GI个位置空了出来,用来在下面存放循环前缀
% end
% for i=1:GI %因为:Slen+GI==GIlen;可以用一次赋多个值的方式来代替循环
% g(i)=z0(i+Slen-GI,1); %当前帧的循环前缀CP
% end
%
%
% for i=1:GIlen %GIlen是加上CP后的一个帧宽
% z2((j-1)*GIlen+i)=g(i,1); %这样后z2就是只有循环前缀的、跟
% end
%end %end for j
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% graph on time domain
figure(1);
f = linspace(-Sdata,Sdata,length(z1)); %产生在-Sdata到Sdata之间(含)的length(z1)个数
plot(f,abs(z1)); %z1是时域上的信号,通过ifft得到
Y4 = fft(z1); %z1是ifft后的所有信号
% if Y4 is under 0.01 Y4=0.01 把绝对值低于0.01的都强制置为0.01?
for j=1:(Ndata/Sdata)*Slen;
if abs(Y4(j)) < 0.01
Y4(j)=0.01;
end
end
Y4 = 10*log10(abs(Y4));
% graph on frequency domain
figure(2);
f = linspace(-Sdata,Sdata,length(Y4));
plot(f,Y4);
axis([-Slen/2 Slen/2 -20 20]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -