source: ResearchApps/PHY/WARPLAB/WARPLab7/M_Code_Examples/wl_example_siso_txrx_energyTrigger.m

Last change on this file was 5621, checked in by chunter, 8 years ago

1) Improved examples' handling of rssi_length to remove the requirement that the number of IQ samples transmitted/received be divisible by 4
2) Disabled RF interfaces in energy trigger example in the scenario that the energy trigger does not execute

File size: 11.3 KB
Line 
1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2% wl_example_siso_txrx_energyTrigger.m
3%
4%   This example demonstrates energy trigger feature of WARP nodes.  It sends
5% a waveform consisting of a simple sinusoidal payload.  The trigger manager
6% uses the energy detector to trigger the receiving node instead of using an
7% Ethernet trigger.
8%
9% NOTE:  It is a straight forward extension to use the automatic gain controller
10%     with this example.
11%
12% Requirements:
13%     2 WARP nodes (same hardware generation); 1 RF interface each
14%     WARPLab 7.6.0 and higher
15%
16%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17
18clear;
19
20%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21% Top Level Control Variables
22%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23
24% Parameters for the energy trigger
25rssi_sum_len                 = 15;
26energy_detection_threshold   = rssi_sum_len * 200;
27busy_minlength               = 10;
28
29% Rx Gain
30rx_gain_rf                   = 1;      % Value must be an integer in [1:3]
31rx_gain_bb                   = 15;     % Value must be an integer in [0:31]
32
33% Tx Gain
34tx_gain_bb                   = 3;      % Value must be an integer in [0:3]
35tx_gain_rf                   = 30;     % Value must be an integer in [0:63]
36
37%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38% Set up the WARPLab experiment
39%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
40
41% Create a vector of node objects
42nodes = wl_initNodes(2);
43
44% Set up transmit and receive nodes
45%     Transmit from nodes(1) to nodes(2)
46node_tx = nodes(1);
47node_rx = nodes(2);
48
49
50%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51% Set up Trigger Manager
52%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53
54% Create a UDP broadcast trigger and tell each node to be ready for it
55eth_trig = wl_trigger_eth_udp_broadcast;
56wl_triggerManagerCmd(nodes, 'add_ethernet_trigger', [eth_trig]);
57
58% Read Trigger IDs into workspace
59trig_in_ids  = wl_getTriggerInputIDs(nodes(1));
60trig_out_ids = wl_getTriggerOutputIDs(nodes(1));
61
62% For the transmit node, we will allow Ethernet to trigger the baseband buffers
63wl_triggerManagerCmd(node_tx, 'output_config_input_selection', [trig_out_ids.BASEBAND], [trig_in_ids.ETH_A]);
64
65% For the receive node, we will allow the energy detector to trigger the baseband buffers
66wl_triggerManagerCmd(node_rx, 'output_config_input_selection', [trig_out_ids.BASEBAND], [trig_in_ids.ENERGY_DET]);
67% wl_triggerManagerCmd(node_rx, 'output_config_input_selection', [trig_out_ids.BASEBAND, trig_out_ids.AGC], [trig_in_ids.ENERGY_DET]);
68
69% Set the trigger output delays.
70%
71% NOTE:  We are waiting 3000 ns before starting the AGC so that there is time for the inputs
72%   to settle before sampling the waveform to calculate the RX gains.
73%
74% wl_triggerManagerCmd(node_rx, 'output_config_delay', [trig_out_ids.AGC], 3000);     % 3000 ns delay before starting the AGC
75
76% Enable the hold mode for the triggers driven by energy detection.
77%
78%     NOTE:  This will prevent the buffer from being overwritten before we have a chance to read it.
79%
80wl_triggerManagerCmd(node_rx, 'output_config_hold_mode', [trig_out_ids.BASEBAND], true); 
81% wl_triggerManagerCmd(node_rx, 'output_config_hold_mode', [trig_out_ids.BASEBAND, trig_out_ids.AGC], true);
82
83% Set parameters for the energy trigger
84wl_triggerManagerCmd(node_rx, 'energy_config_average_length', rssi_sum_len);
85wl_triggerManagerCmd(node_rx, 'energy_config_busy_threshold', energy_detection_threshold);
86wl_triggerManagerCmd(node_rx, 'energy_config_busy_minlength', busy_minlength);
87
88
89%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
90% Set up the Interface parameters
91%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
92
93% Get IDs for the interfaces on the boards. 
94%
95% NOTE:  This example assumes each board has the same interface capabilities (ie 2 RF
96%   interfaces; RFA and RFB).  Therefore, we only need to get the IDs from one of the boards.
97%
98ifc_ids = wl_getInterfaceIDs(nodes(1));
99
100% Set the Transmit and Receive interfaces
101%     Transmit from RFA of one node to RFA of the other node
102%
103% NOTE:  Variables are used to make it easier to change interfaces.
104%
105rf_tx         = ifc_ids.RF_A;                    % Transmit RF interface
106rf_rx         = ifc_ids.RF_A;                    % Receive RF interface
107
108rf_rx_vec     = ifc_ids.RF_A;                    % Vector version of transmit RF interface
109rf_tx_vec     = ifc_ids.RF_A;                    % Vector version of receive RF interface
110
111% Set the RF center frequency on all interfaces
112%     - Frequency Band  :  Must be 2.4 or 5, to select 2.4GHz or 5GHz channels
113%     - Channel         :  Must be an integer in [1,11] for BAND = 2.4; [1,23] for BAND = 5
114%
115wl_interfaceCmd(nodes, ifc_ids.RF_ALL, 'channel', 2.4, 11);
116
117% Set the RX gains on all interfaces
118%     - Rx RF Gain      :  Must be an integer in [1:3]
119%     - Rx Baseband Gain:  Must be an integer in [0:31]
120%
121% NOTE:  The gains may need to be modified depending on your experimental setup
122%
123wl_interfaceCmd(nodes, ifc_ids.RF_ALL, 'rx_gain_mode', 'manual');
124wl_interfaceCmd(nodes, ifc_ids.RF_ALL, 'rx_gains', rx_gain_rf, rx_gain_bb);
125% wl_interfaceCmd(nodes, ifc_ids.RF_ALL, 'rx_gain_mode', 'automatic');
126% wl_basebandCmd(nodes, 'agc_target', -10);
127
128% Set the TX gains on all interfaces
129%     - Tx Baseband Gain:  Must be an integer in [0:3] for approx [-5, -3, -1.5, 0]dB baseband gain
130%     - Tx RF Gain      :  Must be an integer in [0:63] for approx [0:31]dB RF gain
131%
132% NOTE:  The gains may need to be modified depending on your experimental setup
133%
134wl_interfaceCmd(nodes, ifc_ids.RF_ALL, 'tx_gains', tx_gain_bb, tx_gain_rf);
135
136% Set interface parameters for the energy trigger
137wl_triggerManagerCmd(node_rx, 'energy_config_interface_selection', ifc_ids.RF_ON_BOARD);
138
139
140%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
141% Set up the Baseband parameters
142%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
143
144% Get the sample frequency from the board
145ts      = 1 / (wl_basebandCmd(nodes(1), 'tx_buff_clk_freq'));
146ts_rx   = 1 / (wl_basebandCmd(nodes(1), 'rx_buff_clk_freq'));
147ts_rssi = 1 / (wl_basebandCmd(nodes(1), 'rx_rssi_clk_freq'));
148
149% Read the maximum I/Q buffer length. 
150%
151% NOTE:  This example assumes that each board has the same baseband capabilities (ie both nodes are
152%   the same WARP hardware version, for example WARP v3).  This example also assumes that each RF
153%   interface has the same baseband capabilities (ie the max number of TX samples is the same as the
154%   max number of RF samples). Therefore, we only need to read the max I/Q buffer length of node_tx RFA.
155%
156maximum_buffer_len = wl_basebandCmd(node_tx, rf_tx, 'tx_buff_max_num_samples');
157
158% Set the transmission / receptions lengths (in samples)
159%     See WARPLab user guide for maximum length supported by WARP hardware
160%     versions and different WARPLab versions.
161%
162tx_length    = 2^15;
163rx_length    = tx_length;
164rssi_length  = floor(rx_length / (ts_rssi / ts_rx));
165
166% Check the transmission length
167if (tx_length > maximum_buffer_len) 
168    error('Node supports max transmission length of %d samples.  Requested %d samples.', maximum_buffer_len, tx_length); 
169end
170
171% Set the length for the transmit and receive buffers based on the transmission length
172wl_basebandCmd(nodes, 'tx_length', tx_length);
173wl_basebandCmd(nodes, 'rx_length', rx_length);
174
175
176%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
177% Signal processing to generate transmit signal
178%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
179
180% First generate the preamble for AGC.
181%     NOTE:  The preamble corresponds to the short symbols from the 802.11a PHY standard
182%
183% shortSymbol_freq = [0 0 0 0 0 0 0 0 1+i 0 0 0 -1+i 0 0 0 -1-i 0 0 0 1-i 0 0 0 -1-i 0 0 0 1-i 0 0 0 0 0 0 0 1-i 0 0 0 -1-i 0 0 0 1-i 0 0 0 -1-i 0 0 0 -1+i 0 0 0 1+i 0 0 0 0 0 0 0].';
184% shortSymbol_freq = [zeros(32,1);shortSymbol_freq;zeros(32,1)];
185% shortSymbol_time = ifft(fftshift(shortSymbol_freq));
186% shortSymbol_time = (shortSymbol_time(1:32).')./max(abs(shortSymbol_time));
187% shortsyms_rep    = repmat(shortSymbol_time,1,30);
188% preamble         = shortsyms_rep;
189% preamble         = preamble(:);
190
191t         = [0:ts:((tx_length - 1))*ts].';                      % Create time vector(Sample Frequency is ts (Hz))
192% t         = [0:ts:((tx_length - length(preamble) - 1))*ts].';   % Create time vector(Sample Frequency is ts (Hz))
193
194sinusoid  = 0.6 * exp(j*2*pi * 5e6 * t);                        % Create  5 MHz sinusoid
195
196tx_data   = [sinusoid];
197% tx_data   = [preamble; sinusoid];
198
199
200%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
201% Transmit and receive signal using WARPLab
202%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
203
204% Transmit IQ data to the TX node
205wl_basebandCmd(node_tx, rf_tx_vec, 'write_IQ', tx_data(:));
206
207% Enabled the RF interfaces for TX / RX
208wl_interfaceCmd(node_tx, rf_tx, 'tx_en');
209wl_interfaceCmd(node_rx, rf_rx, 'rx_en');
210
211% Enable the buffers for TX / RX
212wl_basebandCmd(node_tx, rf_tx, 'tx_buff_en');
213wl_basebandCmd(node_rx, rf_rx, 'rx_buff_en');
214
215% Send the Ethernet trigger to start the TX
216eth_trig.send();
217
218% Check that the energy trigger asserted the BASEBAND output trigger to the WARPLab buffers core. 
219%     NOTE:  This will prevent users from reading stale IQ data in the node.
220%
221trigger_asserted = node_rx.wl_triggerManagerCmd('output_state_read', [trig_out_ids.BASEBAND]);
222
223if (trigger_asserted)
224    % Read the IQ and RSSI data from the RX node
225    rx_iq    = wl_basebandCmd(node_rx, rf_rx_vec, 'read_IQ', 0, rx_length);
226    rx_rssi  = wl_basebandCmd(node_rx, rf_rx_vec, 'read_RSSI', 0, rssi_length);
227
228    % Disable the buffers and RF interfaces for TX / RX
229    wl_basebandCmd(nodes, ifc_ids.RF_ALL, 'tx_rx_buff_dis');
230    wl_interfaceCmd(nodes, ifc_ids.RF_ALL, 'tx_rx_dis');
231
232    % Clear the held energy detection trigger at our receiver
233    wl_triggerManagerCmd(node_rx, 'output_state_clear', [trig_out_ids.BASEBAND]);
234    % wl_triggerManagerCmd(node_rx, 'output_state_clear', [trig_out_ids.BASEBAND, trig_out_ids.AGC]);
235else
236    % Disable the buffers and RF interfaces for TX / RX
237    wl_basebandCmd(nodes, ifc_ids.RF_ALL, 'tx_rx_buff_dis');
238    wl_interfaceCmd(nodes, ifc_ids.RF_ALL, 'tx_rx_dis');
239    error('Energy Trigger did not assert.  Please try lowering the energy detection threshold or changing the Tx/Rx gains.');
240end
241
242
243%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
244% Visualize results
245%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
246
247figure(1);clf;
248
249% Plot IQ data
250ax(1) = subplot(2,2,1);
251plot(0:(length(rx_iq)-1),real(rx_iq))
252xlabel('Sample Index')
253title('Received I')
254axis([1 rx_length -1 1])
255
256ax(2) = subplot(2,2,2);
257plot(0:(length(rx_iq)-1),imag(rx_iq))
258xlabel('Sample Index')
259title('Received Q')
260axis([1 rx_length -1 1])
261
262linkaxes(ax,'xy')
263
264% Plot RSSI data
265subplot(2,1,2)
266plot(0:(length(rx_rssi)-1),rx_rssi)
267xlabel('Sample Index')
268title('Received RSSI')
269axis([0 rssi_length 0 1024])
270
271
272%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
273% END
274%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Note: See TracBrowser for help on using the repository browser.