128 lines
3.9 KiB
Mathematica
128 lines
3.9 KiB
Mathematica
![]() |
%% 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];% 加密算法需要做一个适配,CHB,3.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
|
|||
|
|
|||
|
%%
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|