HE/WaveAdp/mainForLabview.m
2024-03-30 16:35:40 +08:00

128 lines
3.9 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

%% simulation for labview
clear;
clc;
TimeStamp = [];
FreqCarrier = 2450e6;% 中心频点可调
Bandwidth = 5e6;% 带宽可调 20~40e6
Ts = 1/Bandwidth;
FrameNum = 1;
PacketSize = 200; %
load NumerologySet.mat NumerologySet
NumerologySel = NumerologySet(1,:); % 128 0.25 3 % N_FFT; CPratio; PilotInterval
MCS_set=[2,2;4,2;4,4;16,2;16,4;64,3;64,4;64,6];% 加密算法需要做一个适配CHB3.19;注释第8个方案有问题
MCS_no = MCS_set(5,:);
% 仿真参数
Delay_set = [1:20]*Ts;
Velocity_set = [5:250];
SNR_set = [0:5:35];
SNR = 25;
tau_d = Delay_set(randi([1 20]));
velocity = Velocity_set(randi([1 length(Velocity_set)]));
ChanPara = ChanStat(SNR, tau_d, velocity, Ts, FreqCarrier, TimeStamp);
seed_set = [1 2 3];
[SysParameters,WaveformPara] = WaveformNumerologyCal(PacketSize,NumerologySel,MCS_no);
%% TX
rng(seed_set(1),'twister');
dataPacketBits = randi([0 1],WaveformPara.Payload,1);
scrData = TX_CRC32_Scramble(dataPacketBits);
trellis = poly2trellis(7,[171 133]);
tx_encoded_bit = convenc(scrData,trellis,WaveformPara.puncpat);
tx_padded_bit = [tx_encoded_bit;zeros(WaveformPara.DataPadding,1)];
%---------------------------------------------
dataMod = qammod(tx_padded_bit,WaveformPara.Mod,'InputType','bit');
WaveformPara.Power_sym = mean(abs(dataMod).^2);
dataMod = reshape(dataMod,WaveformPara.UsedSubcarrier,[]);
%% 获取信道响应 %假设已知前一时刻的信号
% 生成信道响应
N_carriers = WaveformPara.N_FFT;
channel_response=sqrt(1/2)*(randn(1,N_carriers)+1i*randn(1,N_carriers));
N_windows = 8;
N_level = 10;
min_len_CP = 30;
% 测试函数
CPset = Generate_CP(channel_response,N_windows,N_level,min_len_CP);
% 物理层加密
[serialOFDMsym,WaveformPara.pilot,serialFrameLen,symbolNum] = tx_FFTSymbolGen_PilotBlockPN(dataMod,WaveformPara,CPset); % 加CP的地方
WaveformPara.Power_sig = mean(abs(serialOFDMsym).^2);
serialOFDMsym = serialOFDMsym./max(abs(serialOFDMsym));
% [WaveformPara.preamble,WaveformPara.c1,WaveformPara.c2] = ...
% generatePreamble(WaveformPara,WaveformPara.Power_sig); % hb:这里前导码的目的是什么?
% txSignal = [WaveformPara.preamble;serialOFDMsym];
% RFSignal = RFimpairment(txSignal, FreqCarrier);
%% Parameter
NumerologyNo = 1; % 1~27
FrameNo = 7;
% MCS_No = 3;
% PacketSize = 200;
cfg = wlanNonHTConfig('SignalChannelBandwidth',true, ...
'BandwidthOperation','Static');
% cfg.MCS = MCS_No;
cfg.PSDULength = PacketSize; %0-4095
%% preamble
tx_STF = STS_modulation(NumerologyNo); % STF
tx_LTF = wlanLLTF(cfg); % LTF
[tx_SIG, tx_sigdata] = newLSIG(cfg,FrameNo);% SIG
% load('preambleData.mat')
txSignal = [tx_STF;tx_LTF;tx_SIG;serialOFDMsym];
txSignalNormalized = txSignal;
% A = 20*log10(abs(fft(txSignal)));
% plot(A);
% 分两块,发送 接收
%% Channel
% [rxSignal,ChanPara] = PassChan(txSignal,WaveformPara,SysParameters,ChanPara,seed_set(2));
len = 20000;
n = rand(len,1)+rand(len,1)*1i;
rxSignal = [n*0.1;txSignalNormalized];
% SIR = InterfCal(rxSignal,ChanPara);
%% RX
% [rxSignal_sync,SyncErr] = rxSyncSC(rxSignal,WaveformPara,serialFrameLen);
% process preamble
[rxSignal_sync,MCS,PSDULength,failCheck,rec_frameNo,estNumerlogy,numeroError] = rx_preambleprocess(rxSignal);
rxSignal_sync = rxSignal_sync(1:serialFrameLen);
[rxDataModLs] = rx_PilotBlockChanEst(rxSignal_sync,ChanPara,WaveformPara,CPset,symbolNum,SysParameters); % 去CP的地方
dataDemod = qamdemod(rxDataModLs,WaveformPara.Mod,'OutputType','approxllr', ...
'UnitAveragePower',false,'NoiseVariance',0.0243);%ChanPara.N0
dataDePadded = dataDemod(1:end - WaveformPara.DataPadding);
tb = 8;
decoded = vitdec(dataDePadded,trellis,tb,'trunc','unquant',WaveformPara.puncpat);
[rx,PER] = RX_CRC32_deScramble(decoded); % 丢包率
[numErrors,BER] = biterr(dataPacketBits,rx);
BER
PER
% SyncErr
%%