HE/TX.m

228 lines
11 KiB
Mathematica
Raw Normal View History

2024-03-30 16:35:40 +08:00
clear;
close all;
clc;
%% LabVIEW--
2024-03-30 16:45:36 +08:00
%
2024-03-30 16:35:40 +08:00
cfgUI.ChannelBandwidth = 'CBW20'; % 'CBW20''CBW40''CBW80'
cfgUI.NTX2_enabled = 1; %
max_run_time = 60; %
SEED = 1;
cfgUI.numUsers = 1; % 1-2
cfgUI.DataType = 'test'; % 'test''text''photo'image.png
numPkt = 5; %1~5
pktLength = 1001; % short,medium,long1001,7007,12012,APEPLength
if strcmp(cfgUI.DataType,'photo')
txPSDUByte = imread('image.png');
I_gray = im2gray(txPSDUByte);
[len,width] = size(I_gray);
binary = dec2bin(I_gray(:),8);
bitstream = reshape(binary',1,[]);%
byte_array = reshape(bitstream',8,[])';%
txPSDUByte = bin2dec(byte_array);
% zjd3.26
if numPkt*pktLength >= length(txPSDUByte) % 5
for pktNum = 1:numPkt %
if pktNum*pktLength >= length(txPSDUByte)
numPkt = pktNum;
break
end
end
else % 5
if numPkt*7007 >= length(txPSDUByte)
for pktNum = 1:numPkt %
if pktNum*7007 >= length(txPSDUByte)
numPkt = pktNum;
pktLength = 7007;
break
end
end
else
for pktNum = 1:numPkt %
if pktNum*12012 >= length(txPSDUByte)
numPkt = pktNum;
pktLength = 12012;
break
end
end
end
end
txPSDUByteUser = zeros(len*width+3,cfgUI.numUsers); %
for i = 1:cfgUI.numUsers
byteLen = length(txPSDUByte);
byteLenBit = int2bit(byteLen,16);
Len1 = bit2int(byteLenBit(1:8),8);
Len2 = bit2int(byteLenBit(9:16),8);
txPSDUByteUser(1:len*width+2,i) = [Len1;Len2;txPSDUByte];
txPSDUByteUser(end,i) = mod(sum(txPSDUByteUser(:,i)),256);
end
txPSDUByteUser = uint8(txPSDUByteUser);
save('TXPackets\txPSDUByteUser.mat','txPSDUByteUser');
elseif strcmp(cfgUI.DataType,'text')
else
txPSDUByteUser = 0;
end
cfgUI.UserMode = 'SU'; % 使'MU','SU'SU40MHzSTBCMUlxr
cfgUI.FeedbackMode = 'openloop'; % 'openloop','feedback'
SoundingMode = 0; %
cfgUI.numTx = 1; % 线1~2
cfgUI.numRx = 1; % 线1~2
cfgUI.AI.PAPR = 'PAPR'; % 'default','PAPR-Net'
cfgUI.PhySecur = 'default'; % '','CP',''
%-------------------------------------
%---
cfgUI.user1.s = 1;
cfgUI.user1.f = [1,1,1,1]; % 410
cfgUI.user1.t = ones(1,numPkt); % numPkt10
cfgUI.user1.p = 0.5; %
cfgUI.user2.s = 1;
cfgUI.user2.f = [1,1,1,1];
cfgUI.user2.t = ones(1,numPkt);
cfgUI.user2.p = 0.5;
%------user1
cfgUI.user1.ChannelCode = 'LDPC'; % BCC or LDPC
cfgUI.user1.CodeRate = 3/4; % 1/2 or 2/3 or 3/4 or 5/6
cfgUI.user1.CodeLengt = 1600; % 200*8=1600,800
cfgUI.user1.InterWeaveMode = 'random'; % random,horizontal
cfgUI.user1.InterWeaveDepth = 1024; % 2048,1024
cfgUI.user1.ScrambleLength = 6; % 32
cfgUI.user1.CPLength = '1/4'; % CP1/16 or 1/8 or 1/4
cfgUI.user1.FFTSize = 256; % FFT128 or 256 or 512
cfgUI.user1.NumSubcarrier = 242; % 128 or 256 or 512
cfgUI.user1.ModulationMode = '16QAM'; % 4QAM or 8QAM or 16QAM or 32QAM or 64QAM
cfgUI.user1.MultiAntennaMode = 'STBC'; % 线'ZF-BF','MMSE-BF', SU使STBC'STBC'
cfgUI.user1.SpatialMapping = 'Hadamard'; % 'Direct','Hadamard','Fourier','Custom'----------zjd 3.21
cfgUI.user1.APEPlength = pktLength; % short,medium,long1001,7007,12012
cfgUI.user1.pilotInterval = 5;
%------user2
cfgUI.user2.ChannelCode = 'LDPC'; % BCC or LDPC
cfgUI.user2.CodeRate = 3/4; % 1/2 or 2/3 or 3/4 or 5/6
cfgUI.user2.CodeLengt = 1600; % 200*8=1600,800
cfgUI.user2.InterWeaveMode = 'random'; % random,horizontal
cfgUI.user2.InterWeaveDepth = 1024; % 2048,1024
cfgUI.user2.ScrambleLength = 6; % 32
cfgUI.user2.CPLength = '1/4'; % CP1/16 or 1/8 or 1/4
cfgUI.user2.FFTSize = 256; % FFT128 or 256 or 512
cfgUI.user2.NumSubcarrier = 242; % 128 or 256 or 512
cfgUI.user2.ModulationMode = '16QAM'; % 4QAM or 8QAM or 16QAM or 32QAM or 64QAM
cfgUI.user2.MultiAntennaMode = 'ZF-BF'; % 线'ZF-BF','MMSE-BF','STBC'
cfgUI.user2.SpatialMapping = 'Direct'; % 'Direct','Hadamard','Fourier'
cfgUI.user2.APEPlength = pktLength; %
cfgUI.user2.pilotInterval = 5;
%% TX
if SoundingMode %%% TX
tic;
feedback_stat = false;
while feedback_stat==false && toc < max_run_time %
txNDP = channelSounding(cfgUI); % NDP
tx_data = txNDP;
save('TXPackets\transmit_data.mat','tx_data','cfgUI');% NDP
pause(1); % 5s
numUsers = cfgUI.numUsers;
feedback_data = struct(); %
stat = zeros(1,numUsers);
for uid = 1:numUsers
filename = ['TXPackets/NDPfeedback_for_User' num2str(uid) '.mat'];
stat(uid) = 1;
if exist(filename,'file') ~= 2 %
filename = ['TXPackets/NDPfeedback_Default_for_User' num2str(uid) '.mat']; %
stat(uid) = 0; % 0
end
feedback_data = setfield(feedback_data,['user' num2str(uid)],loadfeedback(filename)); % ---snrlxr
end
feedback_stat = all(stat == 1); %
end
%
if feedback_stat==false
error("Time Out !!!");
else
disp("feedback received");
end
elseif strcmp(cfgUI.FeedbackMode,'openloop')
while(1)
%
numUsers = cfgUI.numUsers; %
feedback_data = struct(); %
for uid = 1:numUsers
filename = ['TXPackets/NDPfeedback_for_User' num2str(uid) '.mat'];
if exist(filename,'file') ~= 2 %
filename = ['TXPackets/NDPfeedback_Default_for_User' num2str(uid) '.mat']; %
end
feedback_data = setfield(feedback_data,['user' num2str(uid)],loadfeedback(filename)); %
if eval(['isnan(sum(feedback_data.user' num2str(uid) '.staFeedback,"all")) || isempty(feedback_data.user' num2str(uid) '.staFeedback)']) % staFeedbackNaN
filename = ['TXPackets/NDPfeedback_Default_for_User' num2str(uid) '.mat']; %
feedback_data = setfield(feedback_data,['user' num2str(uid)],loadfeedback(filename));
end
end
[paraCal,tx_data,cfgUI,errorMessage] = TX_transmit(numPkt,SEED,cfgUI,feedback_data,txPSDUByteUser);
save('TXPackets\transmit_data.mat','tx_data','cfgUI');
if cfgUI.AI.PAPR == 'PAPR'
% PAPR DPD
end
end
elseif strcmp(cfgUI.FeedbackMode,'feedback')
while(1)
tic;
feedback_stat = false;
while feedback_stat==false && toc < max_run_time
txNDP = channelSounding(cfgUI); % NDP
tx_data = txNDP;
save('TXPackets\transmit_data.mat','tx_data','cfgUI');% NDP
pause(0); % 5s
numUsers = cfgUI.numUsers; %
stat = zeros(1,numUsers); % stat
feedback_data = struct(); %
for uid = 1:numUsers
filename = ['TXPackets/NDPfeedback_for_User' num2str(uid) '.mat'];
stat(uid) = 1;
if exist(filename,'file') ~= 2 %
filename = ['TXPackets/NDPfeedback_Default_for_User' num2str(uid) '.mat']; %
stat(uid) = 0; % 0
end
feedback_data = setfield(feedback_data,['user' num2str(uid)],loadfeedback(filename));
if eval(['isnan(sum(feedback_data.user' num2str(uid) '.staFeedback,"all")) || isempty(feedback_data.user' num2str(uid) '.staFeedback)']) % staFeedbackNaN
filename = ['TXPackets/NDPfeedback_Default_for_User' num2str(uid) '.mat']; %
feedback_data = setfield(feedback_data,['user' num2str(uid)],loadfeedback(filename));
end
end
feedback_stat = all(stat == 1); %
end
%
if feedback_stat==false
error("Time Out !!!");
else
disp("feedback received");
end
%
%
ack_feedback_stat=true;
stat = 1;
while ack_feedback_stat==true && stat==1
load('TXPackets\feedback.mat');
feedback_data = feedback;
[paraCal,tx_data,cfgUI,errorMessage] = TX_transmit(numPkt,SEED,cfgUI,feedback_data,txPSDUByteUser);
save('TXPackets\transmit_data.mat','tx_data','cfgUI');
if cfgUI.AI.PAPR == 'PAPR'
% PAPR+DPD
end
pause(1); %
ACK_feedback = cell(1,numUsers);
for uid = 1:numUsers
load(['TXPackets\ACKfeedback_for_User' num2str(uid) '.mat'])
ACK_feedback{uid} = ACK;
end
% PAPRAIreward
show2LabVIEW(); %
end
end
end