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