You are not logged in.
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:
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
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
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
Yes, I connect our two Tx nodes with using CM-MMCX modules.
Last edited by Alannala (2015-May-29 03:54:56)
Offline
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
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
(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