WARP Project Forums - Wireless Open-Access Research Platform

You are not logged in.

#1 2015-May-28 08:06:43

Alannala
Member
Registered: 2014-Jul-31
Posts: 10

MIMO 6*3 with WARPLAB 7.4

Hello,
From WARPLab 7 Example: SISO OFDM
         WARPLab 7 Example: Multi-Node Synchronization
         WARPLab 7 Example: 8x2 Array

I'm trying to do MIMO 6*3 with WAPRLAB 7.4.

At first, I set up my WARPLAB with this code:

Code:

      USE_AGC = 0;
                
                NUMNODES = 3;
                
                %Create a vector of node objects
                nodes = wl_initNodes(NUMNODES);
                
                %Create a UDP broadcast trigger and tell each node to be ready for it
                eth_trig = wl_trigger_eth_udp_broadcast;
                wl_triggerManagerCmd(nodes,'add_ethernet_trigger',[eth_trig]);
                
                %Read Trigger IDs into workspace
                [T_IN_ETH,T_IN_ENERGY,T_IN_AGCDONE,T_IN_REG,T_IN_D0,T_IN_D1,T_IN_D2,T_IN_D3] =  wl_getTriggerInputIDs(nodes(1));
                [T_OUT_BASEBAND, T_OUT_AGC, T_OUT_D0, T_OUT_D1, T_OUT_D2, T_OUT_D3] = wl_getTriggerOutputIDs(nodes(1));
                
                %For the primary transmit node, we will allow Ethernet to trigger the buffer
                %baseband, the AGC, and debug0 (which is mapped to pin 8 on the debug
                %header). We also will allow Ethernet to trigger the same signals for the
                %receiving node.
                wl_triggerManagerCmd([nodes(1),nodes(3)],'output_config_input_selection',[T_OUT_BASEBAND,T_OUT_AGC,T_OUT_D0],[T_IN_ETH,T_IN_REG]);
                
                %For the receive node, we will allow debug3 (mapped to pin 15 on the
                %debug header) to trigger the buffer baseband, and the AGC
                nodes(2).wl_triggerManagerCmd('output_config_input_selection',[T_OUT_BASEBAND,T_OUT_AGC],[T_IN_D3]);
                
                %For the receive node, we enable the debounce circuity on the debug 3 input
                %to deal with the fact that the signal may be noisy.
                nodes(2).wl_triggerManagerCmd('input_config_debounce_mode',[T_IN_D3],'enable');
                
                %Since the debounce circuitry is enabled, there will be a delay at the
                %receiver node for its input trigger. To better align the transmitter and
                %receiver, we can artificially delay the transmitters trigger outputs that
                %drive the buffer baseband and the AGC.
                %
                %NOTE:  Due to HW changes in WARPLab 7.2.0, the input delay of the trigger
                %manager increased by one clock cycle;  Therefore, when using WARPLab 7.2.0,
                %we need to increase the output delay by one step.  If using WARPLab 7.1.0,
                %please use the commented out line below:
                %
                %nodes(1).wl_triggerManagerCmd('output_config_delay',[T_OUT_BASEBAND,T_OUT_AGC],[50]); %50ns delay  - WARPLab 7.1.0
                %
                nodes(1).wl_triggerManagerCmd('output_config_delay',[T_OUT_BASEBAND,T_OUT_AGC],[56.25]); %56.25ns delay  - WARPLab 7.2.0
                
                %Get IDs for the interfaces on the boards. Since this example assumes each
                %board has the same interface capabilities, we only need to get the IDs
                %from one of the boards
                [RFA,RFB,RFC,RFD] = wl_getInterfaceIDs(nodes(1));
                
                %Set up the interface for the experiment
                wl_interfaceCmd(nodes,'RF_ALL','tx_gains',TxGainBB,TxGainRF);
                wl_interfaceCmd(nodes,'RF_ALL','channel',F,11);
                
                if(USE_AGC)
                    wl_interfaceCmd(nodes,'RF_ALL','rx_gain_mode','automatic');
                    wl_basebandCmd(nodes,'agc_target',-10);
                    wl_basebandCmd(nodes,'agc_trig_delay', 511);
                else
                    wl_interfaceCmd(nodes,'RF_ALL','rx_gain_mode','manual');
                    RxGainRF = 2; %Rx RF Gain in [1:3]
                    RxGainBB = 12; %Rx Baseband Gain in [0:31]
                    wl_interfaceCmd(nodes,'RF_ALL','rx_gains',RxGainRF,RxGainBB);
                    wl_interfaceCmd(nodes,'RF_ALL','rx_gains',RxGainRF,RxGainBB);
                end
                
                TX_NUM_SAMPS = nodes(1).baseband.txIQLen;
                SAMP_FREQ = wl_basebandCmd(nodes(1),'tx_buff_clk_freq');
                node_tx1 = nodes(1);
                node_tx2 = nodes(2);
                node_rx = nodes(3);
                
                %Set up the baseband for the experiment
                wl_basebandCmd(nodes,'tx_delay',0);
                wl_basebandCmd(nodes,'tx_length',TX_NUM_SAMPS);
                example_mode_string = 'hw';
            else
                %Use sane defaults for hardware-dependent params in sim-only version
                TX_NUM_SAMPS = 32768;
                SAMP_FREQ = 40e6;
                example_mode_string = 'sim';
            end

Second, the WARPLab Tx/Rx

Code:

                if(USE_WARPLAB_TXRX)
                    %Write the Tx waveform to the Tx node
                    wl_basebandCmd(node_tx1,[RFA,RFB,RFC,RFD], 'write_IQ', tx_vec_air(:,1:4));
                    wl_basebandCmd(node_tx2,[RFA,RFB], 'write_IQ', tx_vec_air(:,5:6));
                    
                    wl_basebandCmd(node_tx1,[RFA+RFB+RFC+RFD],'tx_buff_en');
                    wl_basebandCmd(node_tx2,[RFA+RFB],'tx_buff_en');
                    wl_basebandCmd(node_rx,[RFA+RFB+RFC],'rx_buff_en');
                    
                    %Enable the Tx and Rx radios
                    wl_interfaceCmd(node_tx1,[RFA+RFB+RFC+RFD],'tx_en');
                    wl_interfaceCmd(node_tx2,[RFA+RFB],'tx_en');
                    wl_interfaceCmd(node_rx,[RFA+RFB+RFC],'rx_en');
                    
                    %Enable the Tx and Rx buffers
                    
                    %Trigger the Tx/Rx cycle at both nodes
                    eth_trig.send();
                    
                    %Retrieve the received waveform from the Rx node
                    rx_vec_air = wl_basebandCmd(node_rx,[RFA,RFB,RFC],'read_IQ', 0, TX_NUM_SAMPS);
                    rx_vec_air_A = rx_vec_air(:,1).';
                    rx_vec_air_B = rx_vec_air(:,2).';
                    rx_vec_air_C = rx_vec_air(:,3).';
                    %     save rx_vec_air rx_vec_air

Is there something else I should add?
In simulation mode, It can be demodulated.
In Over-the-air mode, It can't be demodulated.

This code is modified from my previous MIMO 4*2 code.
When I finished my MIMO 4*2, I expand my system to 6*3.
My result is Zero-Forcing, I used this result to confirm WARPv3 can estimate the channel well or not.

In 4*2, the result is good.
But in 6*3, the result is bad.


The channel estimation method in 4*2 is:

| preamble       zeros       zeros       zeros |
| zeros       preamble       zeros       zeros |
| zeros             zeros preamble       zeros |
| zeros             zeros       zeros preamble |

The channel estimation method in 6*3 is:

| preamble       zeros       zeros       zeros       zeros       zeros |
| zeros       preamble       zeros       zeros       zeros       zeros |
| zeros             zeros preamble       zeros       zeros       zeros |
| zeros             zeros       zeros preamble       zeros       zeros |
| zeros             zeros       zeros       zeros preamble       zeros |
| zeros             zeros       zeros       zeros       zeros preamble |

Offline

 

#2 2015-May-28 08:19:39

murphpo
Administrator
From: Mango Communications
Registered: 2006-Jul-03
Posts: 5159

Re: MIMO 6*3 with WARPLAB 7.4

Are you sharing clocks between the two Tx nodes, using CM-PLL or CM-MMCX modules (as in the 8x2 array example)? If not, the two transmissions will have slightly different sampling and carrier frequencies. Your Rx code probably assumes the 6-antenna transmission has the same sampling/carrier frequency for all 6 spatial streams; this is a standard assumption in MIMO systems.

Offline

 

#3 2015-May-29 00:47:23

Alannala
Member
Registered: 2014-Jul-31
Posts: 10

Re: MIMO 6*3 with WARPLAB 7.4

Yes, I connect our two Tx nodes with using CM-MMCX modules.

Last edited by Alannala (2015-May-29 03:54:56)

Offline

 

#4 2015-May-29 08:37:36

murphpo
Administrator
From: Mango Communications
Registered: 2006-Jul-03
Posts: 5159

Re: MIMO 6*3 with WARPLAB 7.4

And are you sharing triggers between the nodes (like the 8x2 example)? Would your Rx processing tolerate the 2 Tx signals from the secondary node being delayed 1 sample period relative to the 4 Tx signals from the primary node? This would be easy to test in simulation.

The most likely explanation for 4x2 working and 6x2 not working is a synchronization problem between the Tx nodes. I would suggest reducing the complexity of the problem by disabling some of your spatial streams. Try running 2x1 with the 2 Tx interfaces on the same node, then again with the 2 Tx interfaces on different nodes. Comparing the resulting Rx waveforms side-by-side might give some hints on where the synchronization problem is.

Offline

 

#5 2015-May-31 02:20:57

Alannala
Member
Registered: 2014-Jul-31
Posts: 10

Re: MIMO 6*3 with WARPLAB 7.4

1. I follow the "WARPLab 7 Example: 8x2 Array" to setup my WARP include CM-MMCX modules and trigger cable.
Running the wl_example_8x2_array.m to confirm the setup of my WARP is successful or not, and get the result like the example.
Then I modify the example to 6x3, and get the figures similar to the 8x2 example, but my received waveform is RFA RFB RFC, FFT magnitude is 6 different transmitted. So I think my 6x3 has already succeeded.

2. You mean that I should modify the WARPLAB setup in my code, or modify my core code to delayed 1 sample period ?

3. Following your advice, I find some situations :
    Previous work: "WARPLab 7 Example: Multi-Node Synchronization" is successful(get the result like the figure in the example);
    (1) WARP_A to be Tx node, WARP_B to be Rx node ->running 2x1, 2x2, 4x2, the performance better than without setup the CM-MMCX modules and trigger cable.
    (2) WARP_A to be Tx1 node, WARP_B to be Tx2 node, WARP_C to be Rx node; WARP_A and WARP_B connect with CM-MMCX modules and trigger cable.->
          (i)  All transmit antennas from one node(Tx1 or Tx2)-> running the 2x1-> successful
          (ii) Pick one antenna from Tx1, Pick another antenna from Tx2-> running the 2x1-> performance worse or totally failure
From these test, it seems that I can synchronize my Tx & Rx, but can't synchronize 2 Tx node very well.

Last edited by Alannala (2015-May-31 02:24:36)

Offline

 

#6 2015-Jun-01 10:06:33

murphpo
Administrator
From: Mango Communications
Registered: 2006-Jul-03
Posts: 5159

Re: MIMO 6*3 with WARPLAB 7.4

(i)  All transmit antennas from one node(Tx1 or Tx2)-> running the 2x1-> successful
          (ii) Pick one antenna from Tx1, Pick another antenna from Tx2-> running the 2x1-> performance worse or totally failure

Ok, that's a good sign the issue is synchronization between the two Tx nodes.

My guess is the transmissions from the two Tx nodes are offset by 1 sample period. The latency from trigger_manger -> buffers (on the master node) and from trigger_manager -> GPIO -> cable -> GPIO -> trigger_manager -> buffers (on the slave node) are not the same.  It's likely your slave node is starting 1-2 sample periods later. You can either adjust the trigger delays to align these, or pad the master node's Tx sample vectors to compensate.

Offline

 

Board footer