Commit 727ba1ac authored by JRock007's avatar JRock007
Browse files

Detail project files in readme

parent c93d598a
# INFORMATIONS UTILES
# Principe du projet
L'objectif de ce projet était d'étudier le NOMA et ses performances.<br/>
Nous avons aboutit à une modélisation probabiliste du taux d'erreur binaire pour un nombre quelconque d'utilisateurs, puis avons comparé ce résultat à un modèle statistique (Méthode de Monte-Carlo) et à des résultats expérimentaux.
## Organisation du dossier
# Organisation du dossier
Les différentes parties du projet ont été regroupées en dossiers, dont voici l'utilité :
## Annexes
* [gnuradio](#folder_gnuradio) : Ensemble des flowgraphs utilisés dans GNURadio pour obtenir les résultats expérimentaux
* [gr-NOMA](#folder_gr-NOMA) : Dossier contenant le code pour les blocs, codés en C++, que nous avons réalisés dans le cadre du projet
* [Latex](#folder_Latex) : Dossier avec les sources LaTeX de notre rapport
* [Matlab](#folder_Matlab) : Code Matlab permettant de générer les paramètres d'un canal
* [Python](#folder_Python) : Ensemble des scripts Python réalisés pour le projet
### OFDMA
Des détails sont fournis dans les parties spécifiques à chaque dossier.
J'ai recopié un graph depuis une publication :
https://www.researchgate.net/publication/322924686_OFDMA_Simulations_on_GNU_Radio
## <a name="folder_gnuradio"></a> GNURadio
ça ne marche pas encore, j'ai besoin de lire le papier plus en détail
\ No newline at end of file
Pour faire fonctionner ces flowgraphs, il faut installer les blocs dans gr-NOMA.
##### flowgraph\_NOMA\_2\_users.grc
Flowgraph générant des symboles aléatoires pour 2 utilisateurs en NOMA, les transmettant en passant par 2 antennes, les décodant et calculant le BER de chaque utilisateur.
La puissance allouée à chaque utilisateur est réglable.
##### flowgraph\_NOMA\_3\_users.grc
Flowgraph générant des symboles aléatoires pour 3 utilisateurs en NOMA, les transmettant en passant par 2 antennes, les décodant et calculant le BER de chaque utilisateur.
La puissance allouée à chaque utilisateur est réglable.
##### noise\_generator.grc
Flowgraph générant des symboles complexes aléatoires (selon une loi gaussienne) et les envoyant à une fréquence données, pour simuler un canal gaussien.
La puissance allouée d'émission du bruit est réglable.
##### sync\_test\_flowgraph.grc
Flowgraph permettant de tester la correction apportée par les blocs `sync_frames_sender ` et `sync_frames_receiver `.
## <a name="folder_gr-NOMA"></a> gr-NOMA
On suppose gnuradio installé sur la machine pour la suite de cette partie.
### Installation
Il faut tout d'abord se trouver dans le bon dossier :
```
cd [...]/gr-NOMA
```
On créé un dossier `build` (s'il n'existe pas déjà) :
```
mkdir build
cd build
```
On compile les blocs :
```
cmake .. && make
```
On installe les blocs :
```
sudo make install
```
Sur linux uniquement, il faut entrer cette commande à chaque fois qu'on installe les blocs :
```
sudo ldconfig
```
### Description des blocs
Note : Le code des blocs est situé dans `gr-NOMA/lib`.
##### BERCounter
Compute the Binary Error Rate for N users when provided the expected and decoded results.
* in[0...N-1]: Reference values
* in[N...2N-1]: Received values
* out: BER
in[0] is compared to in[N], in[1] to in[N+1] and so one.
##### decode\_cc
Decode N users NOMA symbol, expected input to use a QPSK constellation for each user.
* in[0...N-1]: Each user's power (in decreasing order of magnitude)
* in[N]: The complex symbol to decode
* out[0...N-1]: Each user's decoded symbol
##### random\_source\_c
Generate a random complex number at a given frequency.
`freq` corresponds to `samp_rate / sps`, with `sps` the number of samples per symbol to output.
##### resampler\_cc
Keeps only 1 symbol out of `resamp_ratio`, dephased starting at `phase_shift * resamp_ratio`.
Allows the user to extract only meaningful values from a given set. The `resamp_ratio` is typically `sps` (number of samples per symbol).
`phase_shift` helps choosing which value is kept. For example, if `resamp_ratio = 32` and `phase_shift = 0.5`, then, out of 32 values, only the 16th value is kept (which probably corresponds to the max power).
##### signalMerger
Create a single symbol from multiple users' symbols using NOMA.
* in[0...N-1]: Each user's power (in decreasing order of magnitude)
* in[N...2N-1]: Each user's symbol to transmit
* out[0...N-1]: The ponderated sum of the users' symbols
The output corresponds to `in[0] * sqrt(in[N] / 2) + in[1] * sqrt(in[N+1] / 2) + ...`.
##### sync\_frames\_receiver
Block which automatically corrects the phase and amplitude of received symbols.
This should be at the receiving end of a `sync_frame_sender` bloc.
This block uses an initial burst of known symbols to compute the average phase and amplitude difference, and corrects it for all the following symbols.<br/>
It expects the initial known symbols (defined in the `syncFrames` vector of complex values) to be sent with a frequency of `freq` (where `freq = sample_rate / sps`).<br/>
No symbol is dropped by the block (it just prepends some symbols at the start).<br/>
Increasing `procPerSymbol` means that, for each known symbol, multiple values will be analyzed to compute the phase and amplitude difference. It is recommended to only increase this if the received symbols stay long enough at the optimal amplitude (i.e. the transition period is small).
**Warning:** The values in `syncFrames` MUST be != 0. Indeed, since this block is meant to be placed after an USRP source, it will initally be given noise by the antenna until the USRP source actually sends symbols. This means we have to find out which symbols are noise. This is done with a simple amplitude threshold on received values.
##### sync\_frames\_sender
Block which initially sends reference symbols and, coupled with a `sync_frams_receiver`, corrects the phase and amplitude of received symbols.
This should be at the sending end of a `sync_frame_sender` bloc.
This block sends an initial burst of known symbols, later used in `sync_frames_receiver` to compute the average phase and amplitude difference, and correct it for all the following symbols.<br/>
It sends the initial known symbols (defined in the `syncFrames` vector of complex values) with a frequency of `freq` (where `freq = sample_rate / sps`).
After sending those symbols, it just acts as a passthrough block. No symbol is dropped by the block (it just prepends some symbols at the start).
**Warning:** The values in `syncFrames` MUST be != 0 (see sync_frames_receiver for details).
## <a name="folder_Latex"></a> LaTeX
Le fichier `Généralisation N récepteurs.tex` contient le code à compiler permettant de générer le document pdf de notre rapport.
Le fichier `biblio.bib` contient les éléments bibliographiques utilisés dans le rapport, et doit être compilé avec `Généralisation N récepteurs.tex`.
## <a name="folder_Matlab"></a> Matlab
Pour utiliser le code, il faut modifier les paramètres dans `BaseCodeMS.m` et regarder la valeur de `N` (le bruit dans le canal) et de `g` (l'atténuation pour chaque utilisateur).
Il faut simplement convertir `N`, la puissance du bruit, en `sigma` (utilisé dans nos algorithmes), l'écart type du bruit gaussien.
## <a name="folder_Python"></a> Python
On suppose que Python 3 et numpy sont installés sur la machine.
##### Comparaison\_Experience\_Theorie.py
Contient des BER mesurés à 3 utilisateurs et les compare aux résultats théoriques.
##### Comparaison\_Modele\_Theorie.py
Contient plusieurs fonctions permettant de comparer le BER théorique à un BER statistique calculé avec la méthode de Monte-Carlo.
##### Modele\_N\_recepteurs.py
Contient des fonctions pour calculer un taux d'erreur en suivant le modèle du canal parfait avec la méthode de Monte-Carlo.
Des exemples d'utilisation sont donnés dans `Comparaison\_Modele\_Theorie.py` ainsi qu'en fin de fichier.
##### Theorie\_N\_recepteurs.py
Contient des fonctions pour calculer le taux d'erreur théorique à l'aide de la formule développé dans le rapport (et du pseudo-code qui y est donné).
Des exemples d'utilisation sont donnés dans `Comparaison\_Modele\_Theorie.py` ainsi qu'en fin de fichier.
##### Recherche\_Optimum.py
Contient l'algorithme de recherche d'optimum de répartition de puissance. Une implémentation personnelle est comparée à une solution existante. Il s'appuie sur scipy et sur le fichier `Theorie\_N\_recepteurs.py`.
Son fonctionnement est détaillé dans notre rapport, et des explications sur les matrices utilisées dans l'optimisation sont données en début de fichier.
# Annexes
## OFDMA
Nous avons cherché à reproduire le flowgraph de la publication suivante, mais sans succès : <a name="https://www.researchgate.net/publication/322924686_OFDMA_Simulations_on_GNU_Radio">https://www.researchgate.net/publication/322924686_OFDMA_Simulations_on_GNU_Radio</a>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment