71 lines
2.3 KiB
Matlab
71 lines
2.3 KiB
Matlab
|
|
function [rxDataModLs] = rx_PilotBlockChanEst(rAddAWGN,WaveformPara,CPset,SysParameters)
|
|
N = WaveformPara.N_FFT;
|
|
N_Used = WaveformPara.UsedSubcarrier;
|
|
L = WaveformPara.CP_Len;
|
|
m = WaveformPara.PilotNum;
|
|
pnSequence = comm.PNSequence('Polynomial',[8 6 5 4 0], ...
|
|
'SamplesPerFrame',WaveformPara.UsedSubcarrier,'InitialConditions',[0 0 0 0 0 0 0 1]);
|
|
WaveformPara.pilot = generatePilot(pnSequence,1);
|
|
pilot = WaveformPara.pilot;
|
|
|
|
% rxOFDMsym = reshape(rAddAWGN,WaveformPara.SymbolLen,WaveformPara.FrameSymNum);
|
|
% rxOFDMcore = rxOFDMsym(L+1:L+N,:); % 去CP的地方
|
|
|
|
rxOFDMcore = [];
|
|
% 将矩阵操作转换成对列操作
|
|
kk1=1;
|
|
for i = 1:length(CPset)
|
|
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
|
|
|
|
|
|
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
|
|
%%
|
|
function pilot = generatePilot(pnSequence,Power)
|
|
|
|
pilot = pnSequence();
|
|
|
|
bpskModulator = comm.BPSKModulator;
|
|
pilot = bpskModulator(pilot)*sqrt(Power);
|
|
end |