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

124 lines
4.6 KiB
Matlab
Raw Permalink 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.

%% RX for labview
clc;
close all;
clear ;
%% 接收端输入测试数据
receiveAntennasNum = 1;
receiveBandwidth = 20e6;
syncAlgo = 'first';
chanEstiAlgo = 'first';
equalizeAlgo = 'first';
demodMode = 'first';
interpCodeAlgo = 'first';
%% 接收端输入端接口
rxInput.receiveAntennasNum = receiveAntennasNum; % 1 or 2
rxInput.receiveBandwidth = receiveBandwidth;% 10~20M
rxInput.syncAlgo = syncAlgo;% 接口输入类型为string
rxInput.chanEstiAlgo = chanEstiAlgo;% 接口输入类型为string
rxInput.equalizeAlgo = equalizeAlgo;% 接口输入类型为string
rxInput.demodMode = demodMode;% 接口输入类型为string
rxInput.interpCodeAlgo = interpCodeAlgo;% 接口输入类型为string
%% 测试数据,发送端波形参数
userNum = 1;
fileType = 'text';
encryptMode = 'encryptMode';
antennasNum = 1;
centerFreq = 2450e6;
sendBandwidth = 5e6;
fftNum = 128;
CPratio = 0.25;
pilotInterval = 3;
% MCS_set=[2,2;4,2;4,4;16,2;16,4;64,3;64,4;64,6];% 加密算法需要做一个适配CHB3.19
MCS = [16,4];
subcarriersNum = 128; % 待适配
%% 接收端 计算发送端的一切状态
txInput.userNum = userNum; % 1 or 2
txInput.fileType = fileType; % 'text' or 'picture'
txInput.encryptMode = encryptMode; % 'encrypt' or 'not encrypt'
txInput.antennasNum = antennasNum; % 1 or 2
txInput.centerFreq = centerFreq; % 500MHz~2.4G
txInput.sendBandwidth = sendBandwidth; % 20~40MHz
txInput.fftNum = fftNum;% 128 or 256 or 512
txInput.CPratio = CPratio; % 0.25 or 0.125 or 0.0625
txInput.pilotInterval = pilotInterval; % 3 5 7
txInput.MCS = MCS; % a set [2,2;4,2;4,4;16,2;16,4;64,3;64,4;64,6]
txInput.subcarriersNum = subcarriersNum;% 52 or 106 or 242
PacketSize = 200;
NumerologySel = [txInput.fftNum,txInput.CPratio,txInput.pilotInterval];
MCS_no = txInput.MCS;
[SysParameters,WaveformPara] = WaveformNumerologyCal(PacketSize,NumerologySel,MCS_no);
seed_set = [1 2 3];
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] = tx_FFTSymbolGen_PilotBlockPN(dataMod,WaveformPara,CPset);
WaveformPara.Power_sig = mean(abs(serialOFDMsym).^2);
[WaveformPara.preamble,WaveformPara.c1,WaveformPara.c2] = ...
generatePreamble(WaveformPara,WaveformPara.Power_sig);
%% 输入数据,接收端
% load('preambleData.mat')
load('rxdata6normalizedzero.mat')
% A = 20*log10(abs(fft(rxSignal)));
% plot(A);
% rxSignal = rxSignal(5382:8680)';
% rxSignal = downsample(rxSignal, 2)';%data1 part
% rxSignal = rxSignal(5128:7889)';%data2 part
% rxSignal = rxSignal(4500+370:7000)';%data4 part
rxSignal = rxSignal(14000:17000)'/sqrt(mean(abs(rxSignal(14000:17000).^2)));
rxSignal=awgn(rxSignal,20,mean(abs(rxSignal.^2)));
% rxSignal = txSignalNormalized;
% [rxSignal_sync,SyncErr] = rxSyncSC(rxSignal,WaveformPara,myFrameLen);
[rxSignal_sync,MCS,PSDULength,failCheck,rec_frameNo,estNumerlogy,numeroError] = rx_preambleprocess(rxSignal);
rxSignal_sync = rxSignal_sync(1:serialFrameLen);
[rxDataModLs] = rx_PilotBlockChanEstForLabview(rxSignal_sync,WaveformPara,CPset); % 去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);
[rxBits,PER] = RX_CRC32_deScramble(decoded);% 丢包率
[numErrors,BER] = biterr(dataPacketBits,rxBits);
%% 接收端输出接口
rxOutput.delaySpread = 0; % 接口输出类型为double
rxOutput.SNR = 0;% 接口输出类型为double
rxOutput.RSSI = 0;% 接口输出类型为double
rxOutput.BER = BER;% 输出类型为double
rxOutput.PER = PER;% 输出类型为double
rxOutput.EVM = 0;% 接口输出类型为double
rxOutput.phaseNoise = 0;% 接口输出类型为double
BER
PER
% SyncErr