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