-
Notifications
You must be signed in to change notification settings - Fork 5
gr frequencyAdaptiveOFDM
This transceiver goes one step further than the time adaptive transceiver, considering not only the temporal variations, but also the frequency variations of the wireless channel. This means that different subcarriers may present different modulations if their SNR is sufficiently different. This is a crucial step, because due to the wireless channels being double selective channels, it is essential to adapt the MCS to both temporal and frequency variations for maximising the spectral efficiency of the whole communication process. However, even if the main goal is to achieve a higher rate, the maximum PER is still fixed to the 10%, assuring that the delay due to loosing package will not be excessive.
For implementing this feature, the OFDM symbols have been divided in 4 resource blocks (RB), each of them composed of 12 subcarriers. This way, the minimum SNR of the different RB is estimated, and it is possible to select different modulations for the different RB if necessary. However, while each of the RB may have a different modulation, to choose between BPSK, QPSK, 16-QAM and 64-QAM, the whole OFDM symbol must have the same puncturing pattern, which still can be a puncturing pattern of 1/2, 2/3 or 3/4 of redundancy.
Even though this double adaptive transceiver achieves a higher spectral efficiency than the previous version (the time adaptive transceiver), it has the counterpart that it is not standard compliant, at we have had to change the PHY header for indicating the MCS of the different RB and the puncturing of the whole frame.
A demonstration is available here.
It is also possible to manually installing this module, without installing the other modules of this repository. For doing so it is necessary to install the dependencies first. After that, it is possible to install it by executing the following commands, if you are in the root directory of this repository:
cd gr-frequencyAdaptiveOFDM/
sudo make clean-build
Despite the fact that almost all of the blocks of this module have been modified for including this new feature, when comparing them with the blocks of the gr-adaptiveOFDM most of them looks exactly the same, using the same ports and parameters for configuring them, and has the same functionality, even if it is done in a slightly different way. This is because we wanted that both modules could be used in the same way, making easier comparing them. For this reason, in this section will only explain the blocks which have any difference in its usage, while the rest of the block will only have a link to its wiki page inside the time adaptive transceiver module.
The functionality and ports of this block are the same as the described in the gr-adaptiveOFDM module. Regarding its parameters, the only different are two new debug parameters added:
- Debug ACKs: if set to True the block will print on the console the timing when a MAC frame is send, the time when an ACK is received and if a timeout has been detected, for helping to debug the transmission and reception of the ACK messages and the correct change of MCS when some ACKs have been missed.
- Debug Delay: when set to True the block will print information about the messages delays.
For more information about its other parameters and ports, please look here.
The only different between this block and its equivalent inside the gr-adaptiveOFDM module is the variable Encoding. While in the other module it was an integer representing the MCS of the whole frame, in this case it is a Python array of length 5, where the first four number represent the modulation used in each resource block, and the fifth number represent the puncturing pattern applied to the whole frame. The possible options for the modulations for the RB are:
MCS | Integer Value |
---|---|
BPSK | 0 |
QPSK | 1 |
16-QAM | 2 |
64-QAM | 3 |
Also, the possibles puncturing patterns are still of 1/2, 3/4 and 2/3, represented by 0, 1 and 2 respectively, but the puncturing of 2/3 must only be used when the whole frame is using 64-QAM modulation, and it will fail otherwise. So, a value for this parameter of [0,2,2,1,1] represents and MCS of BPSK, 16-QAM, 16-QAM, QPSK for each RB, with a puncturing pattern of 3/4. However, it is still only used when the Debug Encoding flag is set to True. More information about the ports and the other parameters is available here.
This block implements the same functionality and has the same ports and parameters as its homonym in the gr-adaptiveOFDM module. For this reason, for more information please look at its wiki entry.
This simple block written in Python will receive an asynchronous message with the symbols of the different constellations received, and it will separate them by the RB they belong, convert them to complex number and send them for the corresponding port so the modulation used by each RB may be differentiated.
Parameters:
- Length tag name: tag used for converting the asynchronous message to different tagged streams. For more information check the information about the Tagged Stream Blocks.
Ports:
- symbols_in: asynchronous input port where the messages with the received symbols arrive.
- rb1: complex output port for the symbols associated with the RB 1.
- rb2: complex output port for the symbols associated with the RB 2.
- rb3: complex output port for the symbols associated with the RB 3.
- rb4: complex output port for the symbols associated with the RB 4.
There are some examples inside the example folder of this module. This are _.grc_files which must be opened with GNU Radio Companion (GRC) and they allow to directly check how all this code work and play with it. The different files are:
-
wifi_freq_adap_phy_hier.grc: this file is not an example but the definition of the WiFi PHY Hier block of this module. This is a hierarchical block implemented with GRC, and for doing any change to this block this file should be modified, executed and GRC restarted, for the changes to take effect. Moreover, if this hierarchical block is missing but the other contents of the modules are installed, you may need to execute the previous step, as its installation is not automatically done with older GRC versions.
-
files_loopback.grc: this file offers a transceiver and a simulated channel for trying the frequency adaptive transceiver. The transceiver will send messages to himself over a simulated channel, so the source MAC address and the destiny MAC address of the block WiFi MAC / Parse MAC should be the same for it to work. Otherwise, it will ignore all the received messages, as destiny field of the received MAC frames will not match with its own address. It is possible to change the frequency selectivity of the channel by modifying the taps parameter of the Channel Model block.
-
wifi_transceiver.grc: this example provides a real transceiver ready to be used. For communicating with another transceiver, it just need to correctly configure its MAC address, so the destiny address of transceiver one match the source address of transceiver 2, and the source address of transceiver one match with the destiny address of the second. A USRP for each transceiver will be needed for the communication to take place.