A voir également:
- Programmes en matlab sur le SNR
- Programmes au démarrage windows 10 - Guide
- Mettre en veille des programmes - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Comment programmer un mail sur gmail - Guide
- Comment savoir quels sont les programmes inutiles sur mon pc ? - Guide
2 réponses
ce programme sous Matlab peut vous aider (simulation d'un rs:ofdm codée par rs /ber en fonction de Eb/N0)
et la prochaine fois je vous donne snr)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% start_simulateur.m %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%---------------récupération des paramètres du GUI----------------%
% codage de canal
%----------------%
%code_rate_RS=188/204; % utilise ligne 224
code_rate_RS=1 %rate_RS=188/204; ou 1 :(pas de codage) % sinon utlise 227
code_rate_conv=1;% Taux de code 0.5; 2/3; 3/4; 5/6; 7/8; 1(pas de code).
%type_decodage= 'soft'; % Type de d´ecodage : ’soft’ ou ’hard’.
type_decodage='hard';
entrelac_conv =0;% get(handles.check_entrelac_conv,’Value’); % 1=entrelacement
%entrelac_RS =1;%get(handles.check_entrelac_RS,’Value’); % 0: pas d’entrelacement.
% canal
%------%
%caract_canal=[str2num(get(handles.edit_tmax,’String’)),str2num(get(handles.edit_trms,’String’))];
ntau_max=2*390; %en nano-secondes
ntau_rms=2*50;
caract_canal= [ntau_max ntau_rms] ; % valeur numérique pour canal expon sinon A, B, ...
%long_prefixe =0;% sans cyclique préfixe.
long_prefixe =800e-9; % Longueur du préfixe cyclique.
vect_Eb_N0_dB=[0:2:20]; % Vecteur contenant les Eb/N0.
numfig=1;
vitesse= 0; %v/3.6; vitesse de déplacement (entre en km/h)
%SIR_dB=10;
%vect_interferences=[1 , SIR_dB, 0];
%flag_interf=1;
%type_interf=1;
vect_interferences=zeros(1,3);
flag_interf=0;
type_interf=0;
val_offset_freq=0;
%str2num(get(handles.edit_offset,’String’))*1000; %offset fr´equentiel (entr´e en kHz)
% diversité
%----------%
Nt=1; %str2num(get(handles.edit_Nt,’String’)); % Nombre d’antennes `a l’´emetteur.
Nr=1; %str2num(get(handles.edit_Nr,’String’)); % Nombre d’antennes au r´ecepteur.
% estimation
blind=1; %get(handles.check_blind,’Value’); % Blind à l´emetteur (1) ou non (0).
%-----------%
vect_erreurs_canal=zeros(1,3);
%if (get(handles.radio_estimation,’Value’)==1)
nb_blocs_pilotes= 1;% str2num(get(handles.edit_nb_blocs_pilotes,’String’));
if (nb_blocs_pilotes<=0)
str_error_1='Le nombre de blocs pilotes doit être >=1.'
str_error_2=' Modifiez le paramètre et relancez.';
errordlg(strcat(str_error_1,str_error_2));
end
vect_estimation_canal=zeros(1,3);
% modulation
%-----------%
N= 64; % Nombre de porteuses 16,..64,..,128,..,256,..,512,..1024.
choix_const=2;% Nb. de bits par constellation : 1,2,4,6 ou 8.
vect_reduction_calculs(1)=1; % Taux de r´eduction calculs. ex : 2 calcul d’une porteuse sur 2
%num_poids=1; % =get(handles.popup_poids,’Value’);
%switch num_poids
% case Le critère utilisé pour le calcul des poids de beamforming
%type_poids='sum-ber';
%type_poids='max-mse';
%type_poids='sum-mse'; % sum-mse; prd-mse ; max-mse = min-snr
type_poids='hrm-snr';
%case 2 % prd-snr ; sum-ber ;hrm-sin
%type_poids='prd-mse';
%case 3
%case 4
%type_poids='prd-snr';
%case 5
%case 6
%
% data
%------%
%if (get(handles.check_taille_paquets_aleat,’Value’))
taille_paquets_aleat=0;
taille_paquets=376;
%affichage =get(handles.check_affichage,’Value’); % Affichage des figures (1 ou 0).
affichage=1;
%---------------programmation d´efensive----------------%
if ((code_rate_conv*code_rate_RS)<1 & taille_paquets_aleat)
str_error_1= 'Un code correcteur et une taille de paquets al´eatoire est incompatible. ';
str_error_2=' Modifiez un des deux param`etres et relancez.';
errordlg(strcat(str_error_1,str_error_2));
break;
end
if ((Nt<=0)|(Nr<=0))
str_error_1='Il faut au moins une antenne au récepteur et une antenne `a l’’émetteur ! ';
str_error_2=' Modifiez les param`etres en cons´equence et relancez.';
errordlg(strcat(str_error_1,str_error_2));
break;
end
if (code_rate_RS~=1 & (taille_paquets~=376 | choix_const~=2 | N~=64))
str_error_1='Le codage de R-S n’’est implémenté que pour des paquets de 376 blocs QPSK sur 64 porteuses. ';
str_error_2=' Modifiez les param`etres n´ecessaires et relancez.';
errordlg(strcat(str_error_1,str_error_2));
break;
end
if (code_rate_RS==1 & entrelac_RS)
str_error_1='L’’entrelacement externe sans codage de R-S n’’a aucune utilité et n’’est pas implémenté. ';
str_error_2='Il ne sera par cons´equent pas pris en compte dans la simulation. Pressez OK et enter pour continuer.';
warndlg(strcat(str_error_1,str_error_2));
end
%end programmation défensive.
global s2 s4 s16 s64 s256 c2 c4 c16 c64 c256 surech_fact Ts nu delai_echant Tn tps_idle fe ...
val_correlation_emis val_correlation_recept sync_freq sync_temp;
%val_correlation_emis=str2num(get(handles.edit_correlation_emis,’String’));
%val_correlation_recept=str2num(get(handles.edit_correlation_recept,’String’));
val_correlation_emis=0;val_correlation_recept=0;
%sync_temp=get(handles.check_sync_temp,’Value’);
%sync_freq=get(handles.check_sync_freq,’Value’);
%chargement des matrices de Gray
load const2; % BPSK.
load const4; % QPSK.
load const16; % 16-QAM.
%load const64; % 64-QAM.
%load const256; % 256-QAM.
%qlq paramètres non spécifiés par le GUI :
Pt=1;
surech_fact = 3; % Facteur de suréchantillonnage.
param_nyquist = [ 3*surech_fact 0.25]; % Paramètres du Nyquist (demi-long + roll-off).
tblen = 50; % Mémoire de d´ecodage.
constlen = 7; % Longueur du code correcteur (K).
codegen = [133 171]; % Polynomes générateurs.
long_delai_echant = 0; % Délai d’échantillonnage.
fe = 60e6; % Fréquence d’échantillonnage.
Tn=surech_fact/fe;
delai_echant=round(long_delai_echant/Tn);
nu=round(long_prefixe/Tn);
Ts=(N+nu)*Tn;
R_Mbits_s_sans_code=(choix_const*N/((N+nu)*Tn))/1e6;
R_Mbits_s=code_rate_conv*code_rate_RS*R_Mbits_s_sans_code
% T=(N+nu)/N*Tn;
% Tg=(nu-1)*Tn;
% delta_f=1/(N*Tn)
% B_MHz=(1/Tn)/1e6; %environ
fprintf( '\n paquets :'); %nb_paquets=10;
%---------------appel du simulateur----------------%
matrice_resultats=zeros(nb_paquets,length(vect_Eb_N0_dB));
if (taille_paquets_aleat)
% La taille des paquets est une variable uniforme comprise entre 48 et 480 bytes.
% un nombre de bytes aléatoire :
nb_bytes = generateur_nb_unif([1 nb_paquets],48,480);
% ce qui correspond `a une taille de paquet :
vect_taille_paquets=ceil(nb_bytes./((N*choix_const)/8));
else
vect_taille_paquets=taille_paquets*ones(1,nb_paquets);
end
start_time = clock;
rand('state',sum(100*clock));
for num_paquet=1:nb_paquets
if (num_paquet>1)
affichage=1; %on affiche que pour le premier paquet
end
if flag_interf
% hypothèse de 25% d’occupation pour le canal.
if (mod(num_paquet,4)==0)
if (type_interf==1)
vect_interferences(1)=1;
else
vect_interferences(1)=2;
end
else
vect_interferences(1)=0;
end
end
affichage =0;%get(handles.check_affichage,’Value’); % Affichage des figures (1 ou 0).
[matrice_resultats(num_paquet,:),MSE(num_paquet,:)]=simulateur(Nt,Nr,Pt,vect_Eb_N0_dB,...
N,vect_taille_paquets(num_paquet),param_nyquist,choix_const,...
caract_canal,entrelac_conv,entrelac_RS,type_poids,type_decodage,...
constlen,vitesse,codegen,tblen,code_rate_conv,code_rate_RS,vect_erreurs_canal,blind,...
vect_reduction_calculs,vect_interferences,vect_estimation_canal,affichage,val_offset_freq);
fprintf( ' %d , ',num_paquet);
%for num_Eb=1:length(vect_Eb_N0_dB)
%fprintf('Eb/N0 : %d dB | BER : %d || ',vect_Eb_N0_dB(num_Eb),squeeze(matrice_resultats(num_paquet,num_Eb)));
%end
%if affichage
% close all;
%end
end
stop_time = clock;
elapsed_time = etime(stop_time,start_time);
fprintf('\n \n Durée de la simulation : %g seconds\n',elapsed_time);
if (taille_paquets_aleat) %moyenne pond´er´ee
for num_paquet=1:length(vect_taille_paquets)
matrice_resultats(num_paquet,:)=matrice_resultats(num_paquet,:)*vect_taille_paquets(num_paquet);
end
vect_resultats=sum(matrice_resultats,1)/sum(vect_taille_paquets);
else %simple moyenne
vect_resultats=mean(matrice_resultats,1);
end
fprintf('\n\n moyenne sur %d paquets ( %d blocs ou %d bits ) :\n ',length(vect_taille_paquets),...
sum(vect_taille_paquets),sum(vect_taille_paquets)*choix_const*N);
for num_Eb=1:length(vect_Eb_N0_dB)
fprintf('Eb/N0 : %d dB | BER : %d | ',vect_Eb_N0_dB(num_Eb),squeeze(vect_resultats(num_Eb)));
fprintf(' \n ');
end
% avec code RS
%semilogy(vect_Eb_N0_dB,vect_resultats,'ko--'); z1=[vect_Eb_N0_dB' vect_resultats'];save codeRS1.dat z1 -ascii;
%sans code RS
semilogy(vect_Eb_N0_dB,vect_resultats,'bs--');z1=[vect_Eb_N0_dB' vect_resultats'];save codeRS0.dat z1 -ascii;
xlabel('Eb/N0 (dB)');
ylabel('BER');
legend('sans RS', 'avec RS');
grid on; hold on
%title('Moyenne des résultats');
if (vect_estimation_canal(1)>=1)
vect_MSE=mean(MSE,1);
if (vitesse>0 & vect_taille_paquets(1)>1)
fprintf('\n\n moyenne des MSE’’s (estimation initiale): \n ');
else
fprintf('\n\n moyenne des MSE’’s : \n ');
end
for num_Eb=1:length(vect_Eb_N0_dB)
fprintf('Eb/N0 : %d dB | MSE : %d || ',vect_Eb_N0_dB(num_Eb),vect_MSE(num_Eb));
end
end
fprintf('\n\n\n');
%affichage :
%-------------------------------------------------------------%
if affichage
numfig=numfig+1;
figure(numfig);
set(numfig,'name','Profil de puissance')
t=0:1/fe:caract_canal(1)/1e9;
tau_rms=caract_canal(2)/1e9;
PP=exp(-(t/tau_rms)); %cf. article : "channel and interference mode..."
%normalisation :
PP=PP/norm(PP);
plot(t,PP);
title('Profil de puissance');
xlabel('temps (s)');
ylabel('puissance');
set(1,'name','Moyenne des résultats');
%----------------------------------------------------------------------
end
%clear all;
et la prochaine fois je vous donne snr)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% start_simulateur.m %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%---------------récupération des paramètres du GUI----------------%
% codage de canal
%----------------%
%code_rate_RS=188/204; % utilise ligne 224
code_rate_RS=1 %rate_RS=188/204; ou 1 :(pas de codage) % sinon utlise 227
code_rate_conv=1;% Taux de code 0.5; 2/3; 3/4; 5/6; 7/8; 1(pas de code).
%type_decodage= 'soft'; % Type de d´ecodage : ’soft’ ou ’hard’.
type_decodage='hard';
entrelac_conv =0;% get(handles.check_entrelac_conv,’Value’); % 1=entrelacement
%entrelac_RS =1;%get(handles.check_entrelac_RS,’Value’); % 0: pas d’entrelacement.
% canal
%------%
%caract_canal=[str2num(get(handles.edit_tmax,’String’)),str2num(get(handles.edit_trms,’String’))];
ntau_max=2*390; %en nano-secondes
ntau_rms=2*50;
caract_canal= [ntau_max ntau_rms] ; % valeur numérique pour canal expon sinon A, B, ...
%long_prefixe =0;% sans cyclique préfixe.
long_prefixe =800e-9; % Longueur du préfixe cyclique.
vect_Eb_N0_dB=[0:2:20]; % Vecteur contenant les Eb/N0.
numfig=1;
vitesse= 0; %v/3.6; vitesse de déplacement (entre en km/h)
%SIR_dB=10;
%vect_interferences=[1 , SIR_dB, 0];
%flag_interf=1;
%type_interf=1;
vect_interferences=zeros(1,3);
flag_interf=0;
type_interf=0;
val_offset_freq=0;
%str2num(get(handles.edit_offset,’String’))*1000; %offset fr´equentiel (entr´e en kHz)
% diversité
%----------%
Nt=1; %str2num(get(handles.edit_Nt,’String’)); % Nombre d’antennes `a l’´emetteur.
Nr=1; %str2num(get(handles.edit_Nr,’String’)); % Nombre d’antennes au r´ecepteur.
% estimation
blind=1; %get(handles.check_blind,’Value’); % Blind à l´emetteur (1) ou non (0).
%-----------%
vect_erreurs_canal=zeros(1,3);
%if (get(handles.radio_estimation,’Value’)==1)
nb_blocs_pilotes= 1;% str2num(get(handles.edit_nb_blocs_pilotes,’String’));
if (nb_blocs_pilotes<=0)
str_error_1='Le nombre de blocs pilotes doit être >=1.'
str_error_2=' Modifiez le paramètre et relancez.';
errordlg(strcat(str_error_1,str_error_2));
end
vect_estimation_canal=zeros(1,3);
% modulation
%-----------%
N= 64; % Nombre de porteuses 16,..64,..,128,..,256,..,512,..1024.
choix_const=2;% Nb. de bits par constellation : 1,2,4,6 ou 8.
vect_reduction_calculs(1)=1; % Taux de r´eduction calculs. ex : 2 calcul d’une porteuse sur 2
%num_poids=1; % =get(handles.popup_poids,’Value’);
%switch num_poids
% case Le critère utilisé pour le calcul des poids de beamforming
%type_poids='sum-ber';
%type_poids='max-mse';
%type_poids='sum-mse'; % sum-mse; prd-mse ; max-mse = min-snr
type_poids='hrm-snr';
%case 2 % prd-snr ; sum-ber ;hrm-sin
%type_poids='prd-mse';
%case 3
%case 4
%type_poids='prd-snr';
%case 5
%case 6
%
% data
%------%
%if (get(handles.check_taille_paquets_aleat,’Value’))
taille_paquets_aleat=0;
taille_paquets=376;
%affichage =get(handles.check_affichage,’Value’); % Affichage des figures (1 ou 0).
affichage=1;
%---------------programmation d´efensive----------------%
if ((code_rate_conv*code_rate_RS)<1 & taille_paquets_aleat)
str_error_1= 'Un code correcteur et une taille de paquets al´eatoire est incompatible. ';
str_error_2=' Modifiez un des deux param`etres et relancez.';
errordlg(strcat(str_error_1,str_error_2));
break;
end
if ((Nt<=0)|(Nr<=0))
str_error_1='Il faut au moins une antenne au récepteur et une antenne `a l’’émetteur ! ';
str_error_2=' Modifiez les param`etres en cons´equence et relancez.';
errordlg(strcat(str_error_1,str_error_2));
break;
end
if (code_rate_RS~=1 & (taille_paquets~=376 | choix_const~=2 | N~=64))
str_error_1='Le codage de R-S n’’est implémenté que pour des paquets de 376 blocs QPSK sur 64 porteuses. ';
str_error_2=' Modifiez les param`etres n´ecessaires et relancez.';
errordlg(strcat(str_error_1,str_error_2));
break;
end
if (code_rate_RS==1 & entrelac_RS)
str_error_1='L’’entrelacement externe sans codage de R-S n’’a aucune utilité et n’’est pas implémenté. ';
str_error_2='Il ne sera par cons´equent pas pris en compte dans la simulation. Pressez OK et enter pour continuer.';
warndlg(strcat(str_error_1,str_error_2));
end
%end programmation défensive.
global s2 s4 s16 s64 s256 c2 c4 c16 c64 c256 surech_fact Ts nu delai_echant Tn tps_idle fe ...
val_correlation_emis val_correlation_recept sync_freq sync_temp;
%val_correlation_emis=str2num(get(handles.edit_correlation_emis,’String’));
%val_correlation_recept=str2num(get(handles.edit_correlation_recept,’String’));
val_correlation_emis=0;val_correlation_recept=0;
%sync_temp=get(handles.check_sync_temp,’Value’);
%sync_freq=get(handles.check_sync_freq,’Value’);
%chargement des matrices de Gray
load const2; % BPSK.
load const4; % QPSK.
load const16; % 16-QAM.
%load const64; % 64-QAM.
%load const256; % 256-QAM.
%qlq paramètres non spécifiés par le GUI :
Pt=1;
surech_fact = 3; % Facteur de suréchantillonnage.
param_nyquist = [ 3*surech_fact 0.25]; % Paramètres du Nyquist (demi-long + roll-off).
tblen = 50; % Mémoire de d´ecodage.
constlen = 7; % Longueur du code correcteur (K).
codegen = [133 171]; % Polynomes générateurs.
long_delai_echant = 0; % Délai d’échantillonnage.
fe = 60e6; % Fréquence d’échantillonnage.
Tn=surech_fact/fe;
delai_echant=round(long_delai_echant/Tn);
nu=round(long_prefixe/Tn);
Ts=(N+nu)*Tn;
R_Mbits_s_sans_code=(choix_const*N/((N+nu)*Tn))/1e6;
R_Mbits_s=code_rate_conv*code_rate_RS*R_Mbits_s_sans_code
% T=(N+nu)/N*Tn;
% Tg=(nu-1)*Tn;
% delta_f=1/(N*Tn)
% B_MHz=(1/Tn)/1e6; %environ
fprintf( '\n paquets :'); %nb_paquets=10;
%---------------appel du simulateur----------------%
matrice_resultats=zeros(nb_paquets,length(vect_Eb_N0_dB));
if (taille_paquets_aleat)
% La taille des paquets est une variable uniforme comprise entre 48 et 480 bytes.
% un nombre de bytes aléatoire :
nb_bytes = generateur_nb_unif([1 nb_paquets],48,480);
% ce qui correspond `a une taille de paquet :
vect_taille_paquets=ceil(nb_bytes./((N*choix_const)/8));
else
vect_taille_paquets=taille_paquets*ones(1,nb_paquets);
end
start_time = clock;
rand('state',sum(100*clock));
for num_paquet=1:nb_paquets
if (num_paquet>1)
affichage=1; %on affiche que pour le premier paquet
end
if flag_interf
% hypothèse de 25% d’occupation pour le canal.
if (mod(num_paquet,4)==0)
if (type_interf==1)
vect_interferences(1)=1;
else
vect_interferences(1)=2;
end
else
vect_interferences(1)=0;
end
end
affichage =0;%get(handles.check_affichage,’Value’); % Affichage des figures (1 ou 0).
[matrice_resultats(num_paquet,:),MSE(num_paquet,:)]=simulateur(Nt,Nr,Pt,vect_Eb_N0_dB,...
N,vect_taille_paquets(num_paquet),param_nyquist,choix_const,...
caract_canal,entrelac_conv,entrelac_RS,type_poids,type_decodage,...
constlen,vitesse,codegen,tblen,code_rate_conv,code_rate_RS,vect_erreurs_canal,blind,...
vect_reduction_calculs,vect_interferences,vect_estimation_canal,affichage,val_offset_freq);
fprintf( ' %d , ',num_paquet);
%for num_Eb=1:length(vect_Eb_N0_dB)
%fprintf('Eb/N0 : %d dB | BER : %d || ',vect_Eb_N0_dB(num_Eb),squeeze(matrice_resultats(num_paquet,num_Eb)));
%end
%if affichage
% close all;
%end
end
stop_time = clock;
elapsed_time = etime(stop_time,start_time);
fprintf('\n \n Durée de la simulation : %g seconds\n',elapsed_time);
if (taille_paquets_aleat) %moyenne pond´er´ee
for num_paquet=1:length(vect_taille_paquets)
matrice_resultats(num_paquet,:)=matrice_resultats(num_paquet,:)*vect_taille_paquets(num_paquet);
end
vect_resultats=sum(matrice_resultats,1)/sum(vect_taille_paquets);
else %simple moyenne
vect_resultats=mean(matrice_resultats,1);
end
fprintf('\n\n moyenne sur %d paquets ( %d blocs ou %d bits ) :\n ',length(vect_taille_paquets),...
sum(vect_taille_paquets),sum(vect_taille_paquets)*choix_const*N);
for num_Eb=1:length(vect_Eb_N0_dB)
fprintf('Eb/N0 : %d dB | BER : %d | ',vect_Eb_N0_dB(num_Eb),squeeze(vect_resultats(num_Eb)));
fprintf(' \n ');
end
% avec code RS
%semilogy(vect_Eb_N0_dB,vect_resultats,'ko--'); z1=[vect_Eb_N0_dB' vect_resultats'];save codeRS1.dat z1 -ascii;
%sans code RS
semilogy(vect_Eb_N0_dB,vect_resultats,'bs--');z1=[vect_Eb_N0_dB' vect_resultats'];save codeRS0.dat z1 -ascii;
xlabel('Eb/N0 (dB)');
ylabel('BER');
legend('sans RS', 'avec RS');
grid on; hold on
%title('Moyenne des résultats');
if (vect_estimation_canal(1)>=1)
vect_MSE=mean(MSE,1);
if (vitesse>0 & vect_taille_paquets(1)>1)
fprintf('\n\n moyenne des MSE’’s (estimation initiale): \n ');
else
fprintf('\n\n moyenne des MSE’’s : \n ');
end
for num_Eb=1:length(vect_Eb_N0_dB)
fprintf('Eb/N0 : %d dB | MSE : %d || ',vect_Eb_N0_dB(num_Eb),vect_MSE(num_Eb));
end
end
fprintf('\n\n\n');
%affichage :
%-------------------------------------------------------------%
if affichage
numfig=numfig+1;
figure(numfig);
set(numfig,'name','Profil de puissance')
t=0:1/fe:caract_canal(1)/1e9;
tau_rms=caract_canal(2)/1e9;
PP=exp(-(t/tau_rms)); %cf. article : "channel and interference mode..."
%normalisation :
PP=PP/norm(PP);
plot(t,PP);
title('Profil de puissance');
xlabel('temps (s)');
ylabel('puissance');
set(1,'name','Moyenne des résultats');
%----------------------------------------------------------------------
end
%clear all;
Salut ce programme sous matlab peut être vous aidez mais il est programmé pour donne une simulation d'une modulation ofdm codée par rs et fgure le ber en fonction de eb/n0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% start_simulateur.m %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%---------------récupération des paramètres du GUI----------------%
% codage de canal
%----------------%
%code_rate_RS=188/204; % utilise ligne 224
%code_rate_RS=1 %rate_RS=188/204; ou 1 :(pas de codage) % sinon utlise 227
code_rate_conv=1;% Taux de code 0.5; 2/3; 3/4; 5/6; 7/8; 1(pas de code).
%type_decodage= 'soft'; % Type de d´ecodage : ’soft’ ou ’hard’.
type_decodage='hard';
entrelac_conv =0;% get(handles.check_entrelac_conv,’Value’); % 1=entrelacement
%entrelac_RS =1;%get(handles.check_entrelac_RS,’Value’); % 0: pas d’entrelacement.
% canal
%------%
%caract_canal=[str2num(get(handles.edit_tmax,’String’)),str2num(get(handles.edit_trms,’String’))];
ntau_max=2*390; %en nano-secondes
ntau_rms=2*50;
caract_canal= [ntau_max ntau_rms] ; % valeur numérique pour canal expon sinon A, B, ...
%long_prefixe =0;% sans cyclique préfixe.
long_prefixe =800e-9; % Longueur du préfixe cyclique.
vect_Eb_N0_dB=[0:2:20]; % Vecteur contenant les Eb/N0.
numfig=1;
vitesse= 0; %v/3.6; vitesse de déplacement (entre en km/h)
%SIR_dB=10;
%vect_interferences=[1 , SIR_dB, 0];
%flag_interf=1;
%type_interf=1;
vect_interferences=zeros(1,3);
flag_interf=0;
type_interf=0;
val_offset_freq=0;
%str2num(get(handles.edit_offset,’String’))*1000; %offset fr´equentiel (entr´e en kHz)
% diversité
%----------%
Nt=1; %str2num(get(handles.edit_Nt,’String’)); % Nombre d’antennes `a l’´emetteur.
Nr=1; %str2num(get(handles.edit_Nr,’String’)); % Nombre d’antennes au r´ecepteur.
% estimation
blind=1; %get(handles.check_blind,’Value’); % Blind à l´emetteur (1) ou non (0).
%-----------%
vect_erreurs_canal=zeros(1,3);
%if (get(handles.radio_estimation,’Value’)==1)
nb_blocs_pilotes= 1;% str2num(get(handles.edit_nb_blocs_pilotes,’String’));
if (nb_blocs_pilotes<=0)
str_error_1='Le nombre de blocs pilotes doit être >=1.'
str_error_2=' Modifiez le paramètre et relancez.';
errordlg(strcat(str_error_1,str_error_2));
end
vect_estimation_canal=zeros(1,3);
% modulation
%-----------%
N= 64; % Nombre de porteuses 16,..64,..,128,..,256,..,512,..1024.
choix_const=2;% Nb. de bits par constellation : 1,2,4,6 ou 8.
vect_reduction_calculs(1)=1; % Taux de r´eduction calculs. ex : 2 calcul d’une porteuse sur 2
%num_poids=1; % =get(handles.popup_poids,’Value’);
%switch num_poids
% case Le critère utilisé pour le calcul des poids de beamforming
%type_poids='sum-ber';
%type_poids='max-mse';
%type_poids='sum-mse'; % sum-mse; prd-mse ; max-mse = min-snr
type_poids='hrm-snr';
%case 2 % prd-snr ; sum-ber ;hrm-sin
%type_poids='prd-mse';
%case 3
%case 4
%type_poids='prd-snr';
%case 5
%case 6
%
% data
%------%
%if (get(handles.check_taille_paquets_aleat,’Value’))
taille_paquets_aleat=0;
taille_paquets=376;
%affichage =get(handles.check_affichage,’Value’); % Affichage des figures (1 ou 0).
affichage=1;
%---------------programmation d´efensive----------------%
if ((code_rate_conv*code_rate_RS)<1 & taille_paquets_aleat)
str_error_1= 'Un code correcteur et une taille de paquets al´eatoire est incompatible. ';
str_error_2=' Modifiez un des deux param`etres et relancez.';
errordlg(strcat(str_error_1,str_error_2));
break;
end
if ((Nt<=0)|(Nr<=0))
str_error_1='Il faut au moins une antenne au récepteur et une antenne `a l’’émetteur ! ';
str_error_2=' Modifiez les param`etres en cons´equence et relancez.';
errordlg(strcat(str_error_1,str_error_2));
break;
end
if (code_rate_RS~=1 & (taille_paquets~=376 | choix_const~=2 | N~=64))
str_error_1='Le codage de R-S n’’est implémenté que pour des paquets de 376 blocs QPSK sur 64 porteuses. ';
str_error_2=' Modifiez les param`etres n´ecessaires et relancez.';
errordlg(strcat(str_error_1,str_error_2));
break;
end
if (code_rate_RS==1 & entrelac_RS)
str_error_1='L’’entrelacement externe sans codage de R-S n’’a aucune utilité et n’’est pas implémenté. ';
str_error_2='Il ne sera par cons´equent pas pris en compte dans la simulation. Pressez OK et enter pour continuer.';
warndlg(strcat(str_error_1,str_error_2));
end
%end programmation défensive.
global s2 s4 s16 s64 s256 c2 c4 c16 c64 c256 surech_fact Ts nu delai_echant Tn tps_idle fe ...
val_correlation_emis val_correlation_recept sync_freq sync_temp;
%val_correlation_emis=str2num(get(handles.edit_correlation_emis,’String’));
%val_correlation_recept=str2num(get(handles.edit_correlation_recept,’String’));
val_correlation_emis=0;val_correlation_recept=0;
%sync_temp=get(handles.check_sync_temp,’Value’);
%sync_freq=get(handles.check_sync_freq,’Value’);
%chargement des matrices de Gray
load const2; % BPSK.
load const4; % QPSK.
load const16; % 16-QAM.
%load const64; % 64-QAM.
%load const256; % 256-QAM.
%qlq paramètres non spécifiés par le GUI :
Pt=1;
surech_fact = 3; % Facteur de suréchantillonnage.
param_nyquist = [ 3*surech_fact 0.25]; % Paramètres du Nyquist (demi-long + roll-off).
tblen = 50; % Mémoire de d´ecodage.
constlen = 7; % Longueur du code correcteur (K).
codegen = [133 171]; % Polynomes générateurs.
long_delai_echant = 0; % Délai d’échantillonnage.
fe = 60e6; % Fréquence d’échantillonnage.
Tn=surech_fact/fe;
delai_echant=round(long_delai_echant/Tn);
nu=round(long_prefixe/Tn);
Ts=(N+nu)*Tn;
R_Mbits_s_sans_code=(choix_const*N/((N+nu)*Tn))/1e6;
R_Mbits_s=code_rate_conv*code_rate_RS*R_Mbits_s_sans_code
% T=(N+nu)/N*Tn;
% Tg=(nu-1)*Tn;
% delta_f=1/(N*Tn)
% B_MHz=(1/Tn)/1e6; %environ
fprintf( '\n paquets :'); %nb_paquets=10;
%---------------appel du simulateur----------------%
matrice_resultats=zeros(nb_paquets,length(vect_Eb_N0_dB));
if (taille_paquets_aleat)
% La taille des paquets est une variable uniforme comprise entre 48 et 480 bytes.
% un nombre de bytes aléatoire :
nb_bytes = generateur_nb_unif([1 nb_paquets],48,480);
% ce qui correspond `a une taille de paquet :
vect_taille_paquets=ceil(nb_bytes./((N*choix_const)/8));
else
vect_taille_paquets=taille_paquets*ones(1,nb_paquets);
end
start_time = clock;
rand('state',sum(100*clock));
for num_paquet=1:nb_paquets
if (num_paquet>1)
affichage=1; %on affiche que pour le premier paquet
end
if flag_interf
% hypothèse de 25% d’occupation pour le canal.
if (mod(num_paquet,4)==0)
if (type_interf==1)
vect_interferences(1)=1;
else
vect_interferences(1)=2;
end
else
vect_interferences(1)=0;
end
end
affichage =0;%get(handles.check_affichage,’Value’); % Affichage des figures (1 ou 0).
[matrice_resultats(num_paquet,:),MSE(num_paquet,:)]=simulateur(Nt,Nr,Pt,vect_Eb_N0_dB,...
N,vect_taille_paquets(num_paquet),param_nyquist,choix_const,...
caract_canal,entrelac_conv,entrelac_RS,type_poids,type_decodage,...
constlen,vitesse,codegen,tblen,code_rate_conv,code_rate_RS,vect_erreurs_canal,blind,...
vect_reduction_calculs,vect_interferences,vect_estimation_canal,affichage,val_offset_freq);
fprintf( ' %d , ',num_paquet);
%for num_Eb=1:length(vect_Eb_N0_dB)
%fprintf('Eb/N0 : %d dB | BER : %d || ',vect_Eb_N0_dB(num_Eb),squeeze(matrice_resultats(num_paquet,num_Eb)));
%end
%if affichage
% close all;
%end
end
stop_time = clock;
elapsed_time = etime(stop_time,start_time);
fprintf('\n \n Durée de la simulation : %g seconds\n',elapsed_time);
if (taille_paquets_aleat) %moyenne pond´er´ee
for num_paquet=1:length(vect_taille_paquets)
matrice_resultats(num_paquet,:)=matrice_resultats(num_paquet,:)*vect_taille_paquets(num_paquet);
end
vect_resultats=sum(matrice_resultats,1)/sum(vect_taille_paquets);
else %simple moyenne
vect_resultats=mean(matrice_resultats,1);
end
fprintf('\n\n moyenne sur %d paquets ( %d blocs ou %d bits ) :\n ',length(vect_taille_paquets),...
sum(vect_taille_paquets),sum(vect_taille_paquets)*choix_const*N);
for num_Eb=1:length(vect_Eb_N0_dB)
fprintf('Eb/N0 : %d dB | BER : %d | ',vect_Eb_N0_dB(num_Eb),squeeze(vect_resultats(num_Eb)));
fprintf(' \n ');
end
% avec code RS
%semilogy(vect_Eb_N0_dB,vect_resultats,'ko--'); z1=[vect_Eb_N0_dB' vect_resultats'];save codeRS1.dat z1 -ascii;
%sans code RS
semilogy(vect_Eb_N0_dB,vect_resultats,'bs--');z1=[vect_Eb_N0_dB' vect_resultats'];save codeRS0.dat z1 -ascii;
xlabel('Eb/N0 (dB)');
ylabel('BER');
legend('sans RS', 'avec RS');
grid on; hold on
%title('Moyenne des résultats');
if (vect_estimation_canal(1)>=1)
vect_MSE=mean(MSE,1);
if (vitesse>0 & vect_taille_paquets(1)>1)
fprintf('\n\n moyenne des MSE’’s (estimation initiale): \n ');
else
fprintf('\n\n moyenne des MSE’’s : \n ');
end
for num_Eb=1:length(vect_Eb_N0_dB)
fprintf('Eb/N0 : %d dB | MSE : %d || ',vect_Eb_N0_dB(num_Eb),vect_MSE(num_Eb));
end
end
fprintf('\n\n\n');
%affichage :
%-------------------------------------------------------------%
if affichage
numfig=numfig+1;
figure(numfig);
set(numfig,'name','Profil de puissance')
t=0:1/fe:caract_canal(1)/1e9;
tau_rms=caract_canal(2)/1e9;
PP=exp(-(t/tau_rms)); %cf. article : "channel and interference mode..."
%normalisation :
PP=PP/norm(PP);
plot(t,PP);
title('Profil de puissance');
xlabel('temps (s)');
ylabel('puissance');
set(1,'name','Moyenne des résultats');
%----------------------------------------------------------------------
end
%clear all;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% start_simulateur.m %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%---------------récupération des paramètres du GUI----------------%
% codage de canal
%----------------%
%code_rate_RS=188/204; % utilise ligne 224
%code_rate_RS=1 %rate_RS=188/204; ou 1 :(pas de codage) % sinon utlise 227
code_rate_conv=1;% Taux de code 0.5; 2/3; 3/4; 5/6; 7/8; 1(pas de code).
%type_decodage= 'soft'; % Type de d´ecodage : ’soft’ ou ’hard’.
type_decodage='hard';
entrelac_conv =0;% get(handles.check_entrelac_conv,’Value’); % 1=entrelacement
%entrelac_RS =1;%get(handles.check_entrelac_RS,’Value’); % 0: pas d’entrelacement.
% canal
%------%
%caract_canal=[str2num(get(handles.edit_tmax,’String’)),str2num(get(handles.edit_trms,’String’))];
ntau_max=2*390; %en nano-secondes
ntau_rms=2*50;
caract_canal= [ntau_max ntau_rms] ; % valeur numérique pour canal expon sinon A, B, ...
%long_prefixe =0;% sans cyclique préfixe.
long_prefixe =800e-9; % Longueur du préfixe cyclique.
vect_Eb_N0_dB=[0:2:20]; % Vecteur contenant les Eb/N0.
numfig=1;
vitesse= 0; %v/3.6; vitesse de déplacement (entre en km/h)
%SIR_dB=10;
%vect_interferences=[1 , SIR_dB, 0];
%flag_interf=1;
%type_interf=1;
vect_interferences=zeros(1,3);
flag_interf=0;
type_interf=0;
val_offset_freq=0;
%str2num(get(handles.edit_offset,’String’))*1000; %offset fr´equentiel (entr´e en kHz)
% diversité
%----------%
Nt=1; %str2num(get(handles.edit_Nt,’String’)); % Nombre d’antennes `a l’´emetteur.
Nr=1; %str2num(get(handles.edit_Nr,’String’)); % Nombre d’antennes au r´ecepteur.
% estimation
blind=1; %get(handles.check_blind,’Value’); % Blind à l´emetteur (1) ou non (0).
%-----------%
vect_erreurs_canal=zeros(1,3);
%if (get(handles.radio_estimation,’Value’)==1)
nb_blocs_pilotes= 1;% str2num(get(handles.edit_nb_blocs_pilotes,’String’));
if (nb_blocs_pilotes<=0)
str_error_1='Le nombre de blocs pilotes doit être >=1.'
str_error_2=' Modifiez le paramètre et relancez.';
errordlg(strcat(str_error_1,str_error_2));
end
vect_estimation_canal=zeros(1,3);
% modulation
%-----------%
N= 64; % Nombre de porteuses 16,..64,..,128,..,256,..,512,..1024.
choix_const=2;% Nb. de bits par constellation : 1,2,4,6 ou 8.
vect_reduction_calculs(1)=1; % Taux de r´eduction calculs. ex : 2 calcul d’une porteuse sur 2
%num_poids=1; % =get(handles.popup_poids,’Value’);
%switch num_poids
% case Le critère utilisé pour le calcul des poids de beamforming
%type_poids='sum-ber';
%type_poids='max-mse';
%type_poids='sum-mse'; % sum-mse; prd-mse ; max-mse = min-snr
type_poids='hrm-snr';
%case 2 % prd-snr ; sum-ber ;hrm-sin
%type_poids='prd-mse';
%case 3
%case 4
%type_poids='prd-snr';
%case 5
%case 6
%
% data
%------%
%if (get(handles.check_taille_paquets_aleat,’Value’))
taille_paquets_aleat=0;
taille_paquets=376;
%affichage =get(handles.check_affichage,’Value’); % Affichage des figures (1 ou 0).
affichage=1;
%---------------programmation d´efensive----------------%
if ((code_rate_conv*code_rate_RS)<1 & taille_paquets_aleat)
str_error_1= 'Un code correcteur et une taille de paquets al´eatoire est incompatible. ';
str_error_2=' Modifiez un des deux param`etres et relancez.';
errordlg(strcat(str_error_1,str_error_2));
break;
end
if ((Nt<=0)|(Nr<=0))
str_error_1='Il faut au moins une antenne au récepteur et une antenne `a l’’émetteur ! ';
str_error_2=' Modifiez les param`etres en cons´equence et relancez.';
errordlg(strcat(str_error_1,str_error_2));
break;
end
if (code_rate_RS~=1 & (taille_paquets~=376 | choix_const~=2 | N~=64))
str_error_1='Le codage de R-S n’’est implémenté que pour des paquets de 376 blocs QPSK sur 64 porteuses. ';
str_error_2=' Modifiez les param`etres n´ecessaires et relancez.';
errordlg(strcat(str_error_1,str_error_2));
break;
end
if (code_rate_RS==1 & entrelac_RS)
str_error_1='L’’entrelacement externe sans codage de R-S n’’a aucune utilité et n’’est pas implémenté. ';
str_error_2='Il ne sera par cons´equent pas pris en compte dans la simulation. Pressez OK et enter pour continuer.';
warndlg(strcat(str_error_1,str_error_2));
end
%end programmation défensive.
global s2 s4 s16 s64 s256 c2 c4 c16 c64 c256 surech_fact Ts nu delai_echant Tn tps_idle fe ...
val_correlation_emis val_correlation_recept sync_freq sync_temp;
%val_correlation_emis=str2num(get(handles.edit_correlation_emis,’String’));
%val_correlation_recept=str2num(get(handles.edit_correlation_recept,’String’));
val_correlation_emis=0;val_correlation_recept=0;
%sync_temp=get(handles.check_sync_temp,’Value’);
%sync_freq=get(handles.check_sync_freq,’Value’);
%chargement des matrices de Gray
load const2; % BPSK.
load const4; % QPSK.
load const16; % 16-QAM.
%load const64; % 64-QAM.
%load const256; % 256-QAM.
%qlq paramètres non spécifiés par le GUI :
Pt=1;
surech_fact = 3; % Facteur de suréchantillonnage.
param_nyquist = [ 3*surech_fact 0.25]; % Paramètres du Nyquist (demi-long + roll-off).
tblen = 50; % Mémoire de d´ecodage.
constlen = 7; % Longueur du code correcteur (K).
codegen = [133 171]; % Polynomes générateurs.
long_delai_echant = 0; % Délai d’échantillonnage.
fe = 60e6; % Fréquence d’échantillonnage.
Tn=surech_fact/fe;
delai_echant=round(long_delai_echant/Tn);
nu=round(long_prefixe/Tn);
Ts=(N+nu)*Tn;
R_Mbits_s_sans_code=(choix_const*N/((N+nu)*Tn))/1e6;
R_Mbits_s=code_rate_conv*code_rate_RS*R_Mbits_s_sans_code
% T=(N+nu)/N*Tn;
% Tg=(nu-1)*Tn;
% delta_f=1/(N*Tn)
% B_MHz=(1/Tn)/1e6; %environ
fprintf( '\n paquets :'); %nb_paquets=10;
%---------------appel du simulateur----------------%
matrice_resultats=zeros(nb_paquets,length(vect_Eb_N0_dB));
if (taille_paquets_aleat)
% La taille des paquets est une variable uniforme comprise entre 48 et 480 bytes.
% un nombre de bytes aléatoire :
nb_bytes = generateur_nb_unif([1 nb_paquets],48,480);
% ce qui correspond `a une taille de paquet :
vect_taille_paquets=ceil(nb_bytes./((N*choix_const)/8));
else
vect_taille_paquets=taille_paquets*ones(1,nb_paquets);
end
start_time = clock;
rand('state',sum(100*clock));
for num_paquet=1:nb_paquets
if (num_paquet>1)
affichage=1; %on affiche que pour le premier paquet
end
if flag_interf
% hypothèse de 25% d’occupation pour le canal.
if (mod(num_paquet,4)==0)
if (type_interf==1)
vect_interferences(1)=1;
else
vect_interferences(1)=2;
end
else
vect_interferences(1)=0;
end
end
affichage =0;%get(handles.check_affichage,’Value’); % Affichage des figures (1 ou 0).
[matrice_resultats(num_paquet,:),MSE(num_paquet,:)]=simulateur(Nt,Nr,Pt,vect_Eb_N0_dB,...
N,vect_taille_paquets(num_paquet),param_nyquist,choix_const,...
caract_canal,entrelac_conv,entrelac_RS,type_poids,type_decodage,...
constlen,vitesse,codegen,tblen,code_rate_conv,code_rate_RS,vect_erreurs_canal,blind,...
vect_reduction_calculs,vect_interferences,vect_estimation_canal,affichage,val_offset_freq);
fprintf( ' %d , ',num_paquet);
%for num_Eb=1:length(vect_Eb_N0_dB)
%fprintf('Eb/N0 : %d dB | BER : %d || ',vect_Eb_N0_dB(num_Eb),squeeze(matrice_resultats(num_paquet,num_Eb)));
%end
%if affichage
% close all;
%end
end
stop_time = clock;
elapsed_time = etime(stop_time,start_time);
fprintf('\n \n Durée de la simulation : %g seconds\n',elapsed_time);
if (taille_paquets_aleat) %moyenne pond´er´ee
for num_paquet=1:length(vect_taille_paquets)
matrice_resultats(num_paquet,:)=matrice_resultats(num_paquet,:)*vect_taille_paquets(num_paquet);
end
vect_resultats=sum(matrice_resultats,1)/sum(vect_taille_paquets);
else %simple moyenne
vect_resultats=mean(matrice_resultats,1);
end
fprintf('\n\n moyenne sur %d paquets ( %d blocs ou %d bits ) :\n ',length(vect_taille_paquets),...
sum(vect_taille_paquets),sum(vect_taille_paquets)*choix_const*N);
for num_Eb=1:length(vect_Eb_N0_dB)
fprintf('Eb/N0 : %d dB | BER : %d | ',vect_Eb_N0_dB(num_Eb),squeeze(vect_resultats(num_Eb)));
fprintf(' \n ');
end
% avec code RS
%semilogy(vect_Eb_N0_dB,vect_resultats,'ko--'); z1=[vect_Eb_N0_dB' vect_resultats'];save codeRS1.dat z1 -ascii;
%sans code RS
semilogy(vect_Eb_N0_dB,vect_resultats,'bs--');z1=[vect_Eb_N0_dB' vect_resultats'];save codeRS0.dat z1 -ascii;
xlabel('Eb/N0 (dB)');
ylabel('BER');
legend('sans RS', 'avec RS');
grid on; hold on
%title('Moyenne des résultats');
if (vect_estimation_canal(1)>=1)
vect_MSE=mean(MSE,1);
if (vitesse>0 & vect_taille_paquets(1)>1)
fprintf('\n\n moyenne des MSE’’s (estimation initiale): \n ');
else
fprintf('\n\n moyenne des MSE’’s : \n ');
end
for num_Eb=1:length(vect_Eb_N0_dB)
fprintf('Eb/N0 : %d dB | MSE : %d || ',vect_Eb_N0_dB(num_Eb),vect_MSE(num_Eb));
end
end
fprintf('\n\n\n');
%affichage :
%-------------------------------------------------------------%
if affichage
numfig=numfig+1;
figure(numfig);
set(numfig,'name','Profil de puissance')
t=0:1/fe:caract_canal(1)/1e9;
tau_rms=caract_canal(2)/1e9;
PP=exp(-(t/tau_rms)); %cf. article : "channel and interference mode..."
%normalisation :
PP=PP/norm(PP);
plot(t,PP);
title('Profil de puissance');
xlabel('temps (s)');
ylabel('puissance');
set(1,'name','Moyenne des résultats');
%----------------------------------------------------------------------
end
%clear all;