Working principal of MIMO(2 by 2)-OFDM (802.11n)

I have gained basic knowledge on MIMO-OFDM from online sources and in process of building 802.11n standard in GnuRadio+USRP B210. My goal is to analyze the channel state information and play with it later on for my research purpose. But before that I must have the standard ready. I am comfortable in designing this with Python and I have less or zero knowledge in C++ (Though I understand the processing complexities).

There are few examples in Gnuradio/Python/Matlab of OFDM but have not found a detailed illustration on how Wifi standard (like 2x2 MIMO) can be designed step by step. The only closest I have came is this paper but have failed to run due to some missing files/libraries (I prefer to build the whole flow myself for better understanding). Now I would like to share what I understand of this standard and few questions which are keeping me in dark. Please correct me if my understanding is wrong anywhere, and I am open to any suggestion.

Signal Flow:

1. Create Source file (regular text file for example) and convert it to binary data.
2. Create constellation points (eg.16-QAM) and map the binary data to this constellation. A very good example with python is shown here. This creates the OFDM part.

Question 1 : In 802.11n standard we have the so called preambles(for packet detection, channel estimation and frequency/phase correction at Rx side (STF-LTF-SIG-HTLTF). Where do we exactly define this while creating the OFDM? To be more specific, for a 64 sub-carrier system (4 of them are used to carry pilot symbols and rest are used to carry data), so does the other carriers carries both the preambles as well as data at the same time?

Question 2 : From the paper shared above, in the transmitting flow-graph it is seen that the preambles are inserted after mapping of OFDM symbols. Does that mean the preambles are not mapped and kept unmodulated?

Question 3 : I have seen that the preambles (LTF & HTLTF) are used for channel estimation and frequency /phase correction. But in some places it is also said that the pilot symbols are actually used to do this phase correction. Which one is true ?

1. After insertion of preamble & pilot the symbols are passed through IFFT (this combines all the 64 subcarriers each of which has unique frequencies thereby orthogonal).

Question 4 : The 802.11n standard uses the frequency 2.4GHz or 5GHz band. Does the other 64 carrier frequencies automatically gets defined while doing IFFT ?

1. The output is then passed through cyclic prefix (copies defined number of bits from end of the symbol and paste it at the beginning, mainly done for error correction). After this the output is feed to the transmitting device. (USPR in my case).

As I am building 2x2 module. The same flow is done sperately (2 radio chains) and feed to the USRP. The difference between the two chains is the HTLTF field (different symbol signs, defined in the standard). And the 2nd chain has a CDD (cyclic delay diversity).

Question 5 : At Rx side I have read about MIMO detection. As the received signal (say at Rx antenna 1) is superimposed from both the transmitted antennas, we need to separate them for which we need MIMO detection. Can someone explain what are the possible ways (aiming for less complexity algorithms compared to performance).

1. The packet is detected with the help of STF (I understand this and already implemented). As these preambles are known at Receiver, this is mainly done with auto-correlation technique.

2. While a packet is detected it is passed to do the frequency correction with LTF and passed through FFT to convert the signal back in frequency domain.

3. Channel is estimated with HTLTF (This is a more complex and lengthy process to write, kipping that for now). I believe I understand the procedure.

4. The next thing we need to perform is Frame equalization.

Question 6 I have came across some Equalizer technique, like Zero forcing. Which actually inverts the channel impulse response to get the transmitted signal back. Is this correct ?

1. And finally we have the transmitted signal at receiver side.

Please point out if I have missed any major points, or if you know I can follow any open source projects someone has done related to this which might be helpful to understand.