61 lines
2.5 KiB
Mathematica
61 lines
2.5 KiB
Mathematica
![]() |
|
|||
|
function [staFeedback,PDP,rmsDelay,DopplerShift,rssi_dbm,SNR] = RX_NDPCal(rx,cfgHE,ind,pktOffset,gain)
|
|||
|
addpath(genpath('.\sounding'));
|
|||
|
% ****手动调整NDP的尺寸
|
|||
|
% rxNDP = txNDP(:,1:2);
|
|||
|
% 计算引导矩阵
|
|||
|
numTx = cfgHE.numTx;
|
|||
|
cfgNDP = wlanHESUConfig('APEPLength',0,'GuardInterval',0.8); % No data in an NDP
|
|||
|
cfgNDP.NumTransmitAntennas = numTx;%??
|
|||
|
cfgNDP.NumSpaceTimeStreams = numTx;%??
|
|||
|
txNDP = wlanWaveformGenerator([],cfgNDP);
|
|||
|
len_NDP = length(txNDP);
|
|||
|
% 加入PN序列,正交序列,重复三次左右
|
|||
|
K = 255;
|
|||
|
soundingSeqMod_1 = zadoffChuSeq(29,K);
|
|||
|
soundingSeqMod_2 = zadoffChuSeq(47,K);
|
|||
|
% Concatenate multiple sequences to sound the channel periodically.
|
|||
|
numSeq = 10; % Number of transmitted sequences in a WSS period
|
|||
|
soundingSeqMod = [soundingSeqMod_1, soundingSeqMod_2];
|
|||
|
txSignal = repmat(soundingSeqMod,numSeq,1);
|
|||
|
len_sd = length(txSignal);
|
|||
|
% for userIdx = 1:numUsers
|
|||
|
% NDP被接收端利用计算反馈信息
|
|||
|
% Get the full-band beamforming feedback for a user
|
|||
|
staFeedback = heUserBeamformingFeedback(rx,cfgNDP);
|
|||
|
sounding_seq = rx(len_NDP+1:len_NDP+len_sd);
|
|||
|
[PDP,rmsDelay,DopplerShift] = rxChannelSounding(sounding_seq,cfgHE,numSeq,K);
|
|||
|
% end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
% RSSI
|
|||
|
rxLSTF = rx(pktOffset+(ind.LSTF(1):ind.LSTF(2)),:)./(gain);
|
|||
|
rssi_legancy = mean(abs(rxLSTF).^2);
|
|||
|
rssi_legancy_dbm = 10*log10(rssi_legancy/1e-3);
|
|||
|
|
|||
|
rxHETF = rx(pktOffset+(ind.HESTF(1):ind.HELTF(2)),:)./(gain);
|
|||
|
rssi = mean(abs(rxHETF).^2);
|
|||
|
rssi_dbm = 10*log10(rssi/1e-3);
|
|||
|
fprintf(' rssi_legancy: %f dBm\n rssi: %f dBm\n', rssi_legancy_dbm, rssi_dbm);
|
|||
|
|
|||
|
% SNR估计
|
|||
|
LLTF = rx(ind.LLTF(1):ind.LLTF(2));
|
|||
|
LLTF_length = length(LLTF);
|
|||
|
LLTF1 = LLTF(1+LLTF_length/5:LLTF_length*3/5);
|
|||
|
LLTF2 = LLTF(1+LLTF_length*3/5:end);
|
|||
|
N = 64;
|
|||
|
LLTF1_fft = ((abs(fftshift(fft(LLTF1)))).^2)/N;
|
|||
|
LLTF2_fft = ((abs(fftshift(fft(LLTF2)))).^2)/N;
|
|||
|
|
|||
|
for i = 0:LLTF_length/160-1
|
|||
|
power_signal = sum(LLTF1_fft(i*N+(7:32))) + sum(LLTF1_fft(i*N+(34:59))) + ...
|
|||
|
sum(LLTF2_fft(i*N+(7:32))) + sum(LLTF2_fft(i*N+(34:59)));
|
|||
|
power_noise = sum(LLTF1_fft(i*N+(1:6))) + sum(LLTF1_fft(i*N+(33))) + sum(LLTF1_fft(i*N+(end-4:end))) + ...
|
|||
|
sum(LLTF2_fft(i*N+(1:6))) + sum(LLTF2_fft(i*N+(33))) + sum(LLTF2_fft(i*N+(end-4:end)));
|
|||
|
end
|
|||
|
SNR = 10*log10(power_signal/(power_noise*64/12));
|
|||
|
fprintf(' SNR: %f dB\n', SNR);
|
|||
|
|
|||
|
rmpath(genpath('.\sounding'));
|
|||
|
end
|