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

80 lines
2.5 KiB
Matlab

function [rxDataModLs] = rx_PilotBlockChanEst_CPrand(rAddAWGN,ChanPara,WaveformPara,CPset,symbolNum,SysParameters)
N = WaveformPara.N_FFT;
N_Used = WaveformPara.UsedSubcarrier;
L = WaveformPara.CP_Len;
m = WaveformPara.PilotNum;
pilot = WaveformPara.pilot;
% rxOFDMsym = reshape(rAddAWGN,WaveformPara.SymbolLen,WaveformPara.FrameSymNum);
% rxOFDMcore = rxOFDMsym(L+1:L+N,:); % 去CP的地方
rxOFDMcore = [];
% 将矩阵操作转换成对列操作
kk1=1;
lenCPset = length(CPset);
if lenCPset<symbolNum
for i = 1:symbolNum
if i <= lenCPset
get_idx = kk1:(kk1 + N + CPset(i)-1);
currentSym = rAddAWGN(get_idx);
rxOFDMcore = [rxOFDMcore,currentSym(CPset(i)+1:end)];
kk1=kk1+(N+CPset(i));
else
get_idx = kk1:(kk1 + N + CPset(end)-1);
currentSym = rAddAWGN(get_idx);
rxOFDMcore = [rxOFDMcore,currentSym(CPset(end)+1:end)];
kk1=kk1+(N+CPset(end));
end
end
elseif lenCPset == symbolNum
for i = 1:symbolNum
get_idx = kk1:(kk1 + N + CPset(i)-1);
currentSym = rAddAWGN(get_idx);
rxOFDMcore = [rxOFDMcore,currentSym(CPset(i)+1:end)];
kk1=kk1+(N+CPset(i));
end
else
print('waiting for solve')
end
rxDataModInMatrix = fft(rxOFDMcore,[],1)/sqrt(N);
rxDataModInMatrix_shift = [rxDataModInMatrix(2:2+(N_Used-1)/2-1,:);rxDataModInMatrix(end - (N_Used-1)/2:end,:)];
rxPilot = rxDataModInMatrix_shift(:,1:WaveformPara.PilotInterval+1:WaveformPara.FrameSymNum);
hLs = zeros(N_Used,m);
rxDataRemovPilot = zeros(N_Used,WaveformPara.DataFrame);
for i = 1:m-1
rxDataRemovPilot(:,(i-1)*WaveformPara.PilotInterval+1:i*(WaveformPara.PilotInterval)) = ...
rxDataModInMatrix_shift(:,(i-1)*(WaveformPara.PilotInterval+1)+2:i*(WaveformPara.PilotInterval+1));
hLs(:,i) = rxPilot(:,i)./pilot;
end
rxDataRemovPilot(:,(m-1)*WaveformPara.PilotInterval+1:end) = ...
rxDataModInMatrix_shift(:,(m-1)*(WaveformPara.PilotInterval+1)+2:end);
hLs(:,m) = rxPilot(:,m)./pilot;
if mod(WaveformPara.DataFrame,WaveformPara.PilotInterval)>0
hLs = [kron(hLs(:,1:m-1),ones(1,WaveformPara.PilotInterval)),kron(hLs(:,m),ones(1,mod(WaveformPara.DataFrame,WaveformPara.PilotInterval)))];
else
hLs = kron(hLs(:,1:m),ones(1,WaveformPara.PilotInterval));
end
eqDataModLs = zeros(N_Used,WaveformPara.DataFrame);
for i = 1:WaveformPara.DataFrame
eqDataModLs(:,i) = rxDataRemovPilot(:,i)./hLs(:,i);
end
rxDataModLs = reshape(eqDataModLs,[],1);
end