Generate VHT Multi-User Waveform
This example shows how to generate a VHT multi-user waveform from individual components. It also shows how to generate the same waveform by using the wlanWaveformGenerator function.
Create a VHT configuration object, specifying three users and three transmit antennas.
vht = wlanVHTConfig('NumUsers',3,'NumTransmitAntennas',3);
Set the number of space-time streams to the vector [1 1 1], which indicates that each user is assigned one space-time stream. Set the user positions to [0 1 2]. Set the group ID to 5. Group ID values from 1 to 62 apply for multiuser operation.
vht.NumSpaceTimeStreams = [1 1 1]; vht.UserPositions = [0 1 2]; vht.GroupID = 5;
Set a different MCS value for each user.
vht.MCS = [0 2 4];
Set the APEP length to 2000, 1400, and 1800 bytes. Each element corresponds to the number of bytes assigned to each user.
vht.APEPLength = [2000 1400 1800]
vht =
wlanVHTConfig with properties:
ChannelBandwidth: 'CBW80'
NumUsers: 3
UserPositions: [0 1 2]
NumTransmitAntennas: 3
NumSpaceTimeStreams: [1 1 1]
SpatialMapping: 'Direct'
MCS: [0 2 4]
ChannelCoding: 'BCC'
APEPLength: [2000 1400 1800]
GuardInterval: 'Long'
GroupID: 5
Read-only properties:
PSDULength: [2000 6008 12019]
Display the PSDU lengths for the three users. The PSDU length is a function of both the APEP length and the MCS value.
vht.PSDULength
ans = 1×3
2000 6008 12019
Display the field indices for the VHT waveform.
ind = wlanFieldIndices(vht)
ind = struct with fields:
LSTF: [1 640]
LLTF: [641 1280]
LSIG: [1281 1600]
VHTSIGA: [1601 2240]
VHTSTF: [2241 2560]
VHTLTF: [2561 3840]
VHTSIGB: [3841 4160]
VHTData: [4161 48000]
Create the individual fields that comprise the VHT waveform.
lstf = wlanLSTF(vht); lltf = wlanLLTF(vht); lsig = wlanLSIG(vht); [vhtsigA,sigAbits] = wlanVHTSIGA(vht); vhtstf = wlanVHTSTF(vht); vhtltf = wlanVHTLTF(vht); [vhtsigB,sigBbits] = wlanVHTSIGB(vht);
Extract the first two VHT-SIG-A information bits and convert them to their decimal equivalent.
bw = bit2int(double(sigAbits(1:2)),2,false)
bw = 2
The value, 2, corresponds to an 80 MHz bandwidth (see wlanVHTSIGA).
Extract VHT-SIG-A information bits 5 through 10, and convert them to their decimal equivalent.
groupid = bit2int(double(sigAbits(5:10)),6,false)
groupid = 5
The extracted group ID, 5, matches the corresponding property in the VHT configuration object.
Extract the packet length from the VHT-SIG-B information bits. For multiuser operation with an 80 MHz bandwidth, the first 19 bits contain the APEP length information. Convert the field lengths to their decimal equivalents. Multiply them by 4 because the length of the VHT-SIG-B field is expressed in units of 4 bytes.
pktLen = bit2int(double(sigBbits(1:19,:)),19,false)'*4
pktLen = 3×1
2000
1400
1800
Confirm that the extracted APEP length matches the value set in the configuration object.
isequal(pktLen',vht.APEPLength)
ans = logical
1
Extract the MCS values from the VHT-SIG-B information bits. The MCS component is specified by bits 20 to 23.
mcs = bit2int(double(sigBbits(20:23,:)),4,false)'
mcs = 3×1
0
2
4
The values correspond to those set in the VHT configuration object.
Create three data sequences, one for each user.
d1 = randi([0 1],vht.PSDULength(1)*8,1); d2 = randi([0 1],vht.PSDULength(2)*8,1); d3 = randi([0 1],vht.PSDULength(3)*8,1);
Generate a VHT data field using these data sequences.
vhtdata = wlanVHTData({d1 d2 d3},vht);Generate a multiuser VHT waveform with windowing is disabled. Extract the data field from the waveform.
wv = wlanWaveformGenerator({d1 d2 d3},vht,'WindowTransitionTime',0);
wvdata = wv(ind.VHTData(1):ind.VHTData(2),:);Confirm that the two generation approaches produce identical results.
isequal(vhtdata,wvdata)
ans = logical
1
Visualize the waveform by plotting its magnitude.
t = ((1:length(wv))'-1)/80e6; plot(t,abs(wv)) xlabel('Time (s)') ylabel('Magnitude')
