80 lines
2.5 KiB
Matlab
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 |