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

📄 ofdm_signal(2).m

📁 ofdm信号调制的matlab代码实现
💻 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 + -