?? ofdm1.m
字號:
%清空工作區中的所有變量
clear;
%參數設定:
%仿真運行的信噪比點數
M=5;
%各點的信噪比
SNs=[2,4,6,8,10];%(dB)
%鏈路級數據包的大小
Lp=4984;%(bits)
%仿真運行的結束條件:
%各點運行的最大總數據包數量
Ps=[5000,5000,5000,5000,5000]/1000;
%各點運行的誤數據包范圍
Pes=50*[100,100,100,100,100]/1000;
%比特速率
Tb=22.5*10^(-6)*3/4984;%(s)
%采樣間隔
Ts=20*10^(-6)/2048;%(S)
%符號時間
T_symbo=22.5*10^(-6);
%%%%%%%%%%%%%%%設置結果存儲參數:
%各信噪比點的總數據包數目
Ps_run_s=zeros(1,M);
%各信噪比點的總比特數
Bits_run_s=zeros(1,M);
%各信噪比點的總錯誤數據包數目
Ps_err_s=zeros(1,M);
%各信噪比點的總錯誤比特數
Bits_err_s=zeros(1,M);
%各信噪比點的誤包率
P_err_rate_s=zeros(1,M);
%各信噪比點的誤碼率
Bit_err_rate_s=zeros(1,M);
%訓練序列
train_seq=[ones(1,Lp+8)];
%各信噪比點的誤包位置記錄
%P_err_position_1/2/3/.../M
%各信噪比點的誤碼位置記錄
%Bit_err_position_1/2/3/...M
%設置產生隨機數的種子
rand('state',sum(100*clock));
randn('state',sum(7*clock));
%使用循環,以運行M個信噪比點
for I=1:M
%初始化:
%發送的數據包數量
Ps_Tx=0;
%錯誤的數據包數量
Ps_Rx_err=0;
%發送的總比特數
Bits_Tx=0;
%錯誤的比特數目
Bits_Rx_err=0;
%該仿真點的信噪比
SN=SNs(I);
%該仿真點最多運行的數據包數目
P_max=Ps(I);
%該仿真點最多運行的錯誤數據包數目
Pe_max=Pes(I);
%錯誤數據包的位置
eval(['P_err_position_' num2str(I) '=[];']);
%錯誤比特的位置
eval(['Bit_err_position_' num2str(I) '=[];']);
%使用循環,以運行最多P_max個數據包
for II=1:P_max
%產生1個長為Lp的數據包:
P_Tx=(rand(1,Lp)>0.5);
block_index=II;
%接口2(4QAM 調制):
Qam_out=qpsk(interleav_out);
%接口2.1(OFDM模塊):
signal=ofdm(Qam_out);%信號進行ofdm調制
%得到要對信道進行抽樣的沖激序列,在每個符號的中間位置抽樣
train_ofdm_out=[zeros(1,256),zeros(1,1024),1,zeros(1,1023),zeros(1,256),zeros(1,1024),1,zeros(1,1023),zeros(1,256),zeros(1,1024),1,zeros(1,1023)];%ofdm(train_seq);%訓練序列進行IFFT變換
%判斷當前數據包是否是第一個數據包
if II==1
previous_block=zeros(1,length(signal));
previous_train=zeros(1,length(train_ofdm_out));
end
%基帶頻譜測試儀
%bspectrum(Ofdm_out,Ts);
%接口3(信道模塊):
%信號通過多經瑞利信道
mul_railay_out_signal=mul_ralay_channel(previous_block,signal,Ts,block_index);%
%訓練序列過多經瑞利信道
mul_railay_out_train=mul_ralay_channel(previous_train,train_ofdm_out,Ts,block_index);
%為得到準確的信道沖激響應函數而對信道函數進行重新排序
temp1=mul_railay_out_train(1:2304);%第一個符號對應的信道估計序列
temp2=mul_railay_out_train(2305:4608);%第二個符號對應的信道估計序列
temp3=mul_railay_out_train(4609:6912);%第三個符號對應的信道估計序列
mul_railay_out_train=[temp1(1:256),temp1(1281:2304),temp1(257:1280),temp2(1:256),temp2(1281:2304),temp2(257:1280),temp3(1:256),temp3(1281:2304),temp3(257:1280)];
%信號經過AWGN信道
channel_out=myawgn(mul_railay_out_signal,SN);
%接口4(IOFDM模塊):
deofdm_out=deofdm(channel_out);
h=deofdm(mul_railay_out_train);
%接口4.1(均衡模塊):
%equal_out=equal(deofdm_out,h);
%接口4.2(解調模塊):
deqam_out=deqpsk(deofdm_out,h,SN);
%接口5(解交織模塊):
deinter_out= de_interleaving( deqam_out ,interleave_table);
%接口5.1(viterbi譯碼模塊):
P_Rx= soft_viterbi(deinter_out);
%接口6(虛擬儀表):
% sigcon(P_Rx);
%置當前包為前一個數據包
previous_block=signal;
previous_train=train_ofdm_out;
%統計錯誤的比特數、錯誤比特位置、數據包數、錯誤包位置
Bit_compare_temp=(P_Rx~=P_Tx);
%誤比特
Bits_Rx_err=Bits_Rx_err+sum(Bit_compare_temp)
eval(['Bit_err_position_' num2str(I) '=[Bit_err_position_' num2str(I) ','...
'Bits_Tx+find(Bit_compare_temp==1)];']);
%誤包
if (sum(Bit_compare_temp))~=0
Ps_Rx_err=Ps_Rx_err+1;
eval(['P_err_position_' num2str(I) '=[P_err_position_' num2str(I) ','...
'1+Ps_Tx];']);
end
%更新已運行的數據包數目和比特數目
I
Ps_Tx=Ps_Tx+1
Bits_Tx=Bits_Tx+Lp;
%檢查誤包率是否達到結束條件
if Ps_Rx_err>=Pe_max
break;
end
end
%記錄該信噪比點的仿真結果
%總數據包數目
Ps_run_s(I)=Ps_Tx;
%總比特數
Bits_run_s(I)=Bits_Tx;
%錯誤數據包數目
Ps_err_s(I)=Ps_Rx_err;
%錯誤比特數目
Bits_err_s(I)=Bits_Rx_err;
%誤包率
P_err_rate_s(I)=Ps_Rx_err/Ps_Tx;
%誤碼率
Bit_err_rate_s(I)=Bits_Rx_err/Bits_Tx
p=polyfit(SNs,Bit_err_rate_s,4);
xi=0:0.1:10;
f=polyval(p,xi);
plot(xi,f);
xlabel('SNR');
ylabel('BER');
title('4QAM性能');
eval(['save(''err_p_position_' num2str(I) '.mat'',''P_err_position_' num2str(I) '''' ')']);
eval(['save(''err_b_position_' num2str(I) '.mat'',''Bit_err_position_' num2str(I) '''' ')']);
save('data.mat','Ps_run_s','Bits_run_s','Ps_err_s','Bits_err_s','P_err_rate_s','Bit_err_rate_s');
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -