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

📄 ofdm_transmission3_wzy.m

📁 自己写的一个OFDM发送接收的程序
💻 M
字号:
% ----------------------------------------------------------------------------
%          This M-script is used to simulate the OFDM signal
%          from generation to transmission through wireless
%          channel and receiving.
%          Anthor :   WeiZiyuan
% ----------------------------------------------------------------------------
clear all;close all;echo off;tic;
% ----------------------------------------------------------------------------
% ----
%                      Parameter Definition
% ----------------------------------------------------------------------------
Fd    = 1;                            % symbol rate (1Hz)
Fs    = 1*Fd;                         % number of sample per symbol
M     = 16;                           % kind(range) of symbol (0,1,-M-1)
Sym_data_len = 128;                   % Number of data symbol per frame to ifft
All_data_len = Sym_data_len*4;        % all transmitted data symbol 
FFT_len  = Sym_data_len*1;            % symbol length for IFFT 
CP_len    =0;                         % CP_len length
Nsym  = All_data_len/Sym_data_len;    % number of frames -> Nsym frame
S_CP_len = FFT_len + CP_len;          % symbol with GI insertion  S_CP_len = FFT_len + CP_len
% ----------------------------------------------------------------
%                        Vector Initialization
% ----------------------------------------------------------------
X  = zeros(All_data_len,1);
Y1 = zeros(All_data_len,1);
Y2 = zeros(All_data_len,1);
Y3 = zeros(FFT_len,1);
z0 = zeros(FFT_len,1);
z1 = zeros(Nsym*FFT_len,1);
Y3_stall=zeros(Nsym*FFT_len,1);
g  = zeros(S_CP_len,1);
z2 = zeros(S_CP_len*Nsym,1);
z3 = zeros(S_CP_len*Nsym,1);
% ----------------------------------------------------------------
%                        Constellaiton Mapping 
% ----------------------------------------------------------------
X = randint(All_data_len, 1, M);% 产生调制星座映射的All_data_len个调制点,范围是M
Y2=modulate(modem.qammod(M),X); %用X序列对M-QAM星座图进行调制

scatterplot(Y2,Fd,0,'r*');grid on;%切记:scatterplot前不要加figure命令,否则看不到星座
title('TX M-QAM Constellation');

% ----------------------------------------------------------------
%                        Generate OFDM symble last for 'Nsym' Frames
% ----------------------------------------------------------------
Tx_spectrum = zeros(size(Y3));
for Num_frame=1:Nsym;
    for i=1:Sym_data_len;
        Y3(i+FFT_len/2-Sym_data_len/2,1)=Y2(i+(Num_frame-1)*Sym_data_len,1);
        Tx_spectrum = Tx_spectrum + abs(Y3);
    end
    z0=ifft(Y3);                                            %其实是一个过采样,只不过本程序是在两边添加的0点,而书上是在中部添加的零   
    Y3_stall((Num_frame-1)*FFT_len+1:Num_frame*FFT_len,1)=Y3(:,1);        %保存调制信号到一个矩阵中,其实没有大用处,对后面程序无影响
    z1((Num_frame-1)*FFT_len+1:Num_frame*FFT_len,1)=z0(:,1);              %z1就是连续的不含循环前缀的Nsym个OFDM符号
    g(1:CP_len,1)=z0(FFT_len-CP_len+1:FFT_len,1);
    g(CP_len+1:S_CP_len,1)=z0(:,1);                         %这两句实现的是下两个for循环的作用,即在得到的ifft序列前加循环前缀
    z2((Num_frame-1)*S_CP_len+1:Num_frame*S_CP_len,1)=g(:,1);             %z2就是得到的连续的包含循环前缀的Nsym个OFDM符号    
end
% graph on time domain
figure;
f = linspace(-Sym_data_len,Sym_data_len,length(z1));
plot(f,abs(z1).^2);
title('The time domin of TX signal ');
% graph on frequence domain of TX OFDM symbol
figure;
pwelch(z2,[],[],[],[]);
title('The frequence of TX signal ');

% calculate the PAR(dB) (WZY)
MAX = max(abs(z2).^2);
EVERAGE=sum(abs(z2).^2)/length(z2);
TX_PAR=10*log10(MAX/EVERAGE);
disp('The PAR(dB) value of the Transmitted OFDM symbol(with out any PAR reduce carried out) is ')
disp(TX_PAR),disp('(dB)');
%end of calculate the PAR (WZY)
%
PAPR=0:0.4:7;
for m=1:length(PAPR)
    Big_num=0;
    for i=1:length(z2)
        feng=abs(z2(i))^2/EVERAGE;
        feng_log=10*log10(feng);
        if feng_log>PAPR(m)
           Big_num=Big_num+1; 
        end
    end
    store(m)=Big_num/length(z2);         
end
%store_tmp=20*log10(store);
semilogy(PAPR,store);hold on;
axis([0 10 0.001 1]);
semilogy(PAPR,store,'r*');
figure;
plot(PAPR,store,'ro');
axis([0 10 0 1]);
%
% ----------------------------------------------------------------
%                        Go through the channel
% ----------------------------------------------------------------   
z2_noisy = awgn(z2,20,'measured');
figure;
pwelch(z2_noisy,[],[],[],[]);
title('The frequence of RX signal ');
% ----------------------------------------------------------------
%                        Receiving OFDM Symbol
% ----------------------------------------------------------------   
Y4 = fft(z2_noisy,FFT_len); 

scatterplot(Y4);
title('TX M-QAM Constellation with noise');
simulation_time = toc

⌨️ 快捷键说明

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