%% File Header/文件说明 % % Beamforming with phased array derives signal characteristics from phase % differences between sensors. Therefore the amplitude-phase consistence is % vital to phased systems. % % The script analyzes the amp-phase relations of ILA captured data, the format % of which is square-shaped pseudorandorm bit sequence. Each channel is % processed seperately with different frequency shifts and different optimum % sampling points. The estimation of amplitude and phase are based on % acculumated correlation peaks. % clc; clear; %% initial parameters/初始参数 interp = 8; % interpolation factor channelNum = 4; dataLen = 8192; fs = 48e6; freqRange = -15000:20:-5000; dataFile = [ ... "iladata_25.0G_1-A-1-1.csv", ... "iladata_25.0G_1-A-1-2.csv", ... "iladata_25.0G_1-A-1-3.csv", ... "iladata_25.0G_1-A-2-1.csv", ... "iladata_25.0G_1-A-2-2.csv", ... "iladata_25.0G_1-A-2-3.csv", ... "iladata_25.0G_1-B-1-1.csv", ... "iladata_25.0G_1-B-1-2.csv", ... "iladata_25.0G_1-B-1-3.csv", ... "iladata_25.0G_1-B-2-1.csv", ... "iladata_25.0G_1-B-2-2.csv", ... "iladata_25.0G_1-B-2-3.csv", ... "iladata_25.3G_1-1.csv", ... "iladata_25.3G_1-2.csv", ... "iladata_25.3G_1-3.csv", ... "iladata_25.5G_1-A-1.csv", ... "iladata_25.5G_1-A-2.csv", ... "iladata_25.5G_1-A-3.csv", ... "iladata_25.5G_1-B-1.csv", ... "iladata_25.5G_1-B-2.csv", ... "iladata_25.5G_1-B-3.csv", ... "iladata_25.9G_1-1.csv", ... "iladata_26.0G_1-A-1.csv", ... "iladata_26.0G_1-A-2.csv", ... "iladata_26.0G_1-A-3.csv", ... "iladata_26.0G_1-B-1.csv", ... "iladata_26.0G_1-B-2.csv", ... "iladata_26.0G_1-B-3.csv", ... "iladata_26.1G_1-1.csv", ... "iladata_26.5G_1-A-1.csv", ... "iladata_26.5G_1-A-2.csv", ... "iladata_26.5G_1-A-3.csv", ... "iladata_26.5G_1-B-1.csv", ... "iladata_26.5G_1-B-2.csv", ... "iladata_26.5G_1-B-3.csv", ... "iladata_26.8G_1-1.csv", ... "iladata_27.0G_1-A-1-1.csv", ... "iladata_27.0G_1-A-1-2.csv", ... "iladata_27.0G_1-A-1-3.csv", ... "iladata_27.0G_1-A-2-1.csv", ... "iladata_27.0G_1-A-2-2.csv", ... "iladata_27.0G_1-A-2-3.csv", ... "iladata_27.0G_1-B-1-1.csv", ... "iladata_27.0G_1-B-1-2.csv", ... "iladata_27.0G_1-B-1-3.csv", ... "iladata_27.0G_1-B-2-1.csv", ... "iladata_27.0G_1-B-2-2.csv", ... "iladata_27.0G_1-B-2-3.csv", ... "iladata_300_0000_25.0G_1-1.csv", ... "iladata_300_0000_25.5G_1-1.csv", ... "iladata_300_0000_25.5G_1-2.csv", ... "iladata_300_0000_25.5G_1-3.csv", ... "iladata_300_0000_26.0G_1-1.csv", ... "iladata_300_0000_26.0G_1-2.csv", ... "iladata_300_0000_26.0G_1-3.csv", ... "iladata_300_0000_26.5G_1-1.csv", ... "iladata_300_0000_26.5G_1-2.csv", ... "iladata_300_0000_26.5G_1-3.csv", ... "iladata_300_0000_27.0G_1-1.csv", ... "iladata_300_0000_27.0G_1-2.csv", ... "iladata_300_0000_27.0G_1-3.csv", ... "iladata_300_1800_25.0G_1-1.csv", ... "iladata_300_1800_25.0G_1-2.csv", ... "iladata_300_1800_25.0G_1-3.csv", ... "iladata_300_1800_26.0G_1-1.csv", ... "iladata_300_1800_26.0G_1-2.csv", ... "iladata_300_1800_26.0G_1-3.csv", ... "iladata_300_1800_27.0G_1-1.csv", ... "iladata_300_1800_27.0G_1-2.csv", ... "iladata_300_1800_27.0G_1-3.csv", ... "iladata_414_0491_25.0G_1-1.csv", ... "iladata_414_0491_25.0G_1-2.csv", ... "iladata_414_0491_25.0G_1-3.csv", ... "iladata_414_0491_25.0G_2-1.csv", ... "iladata_414_0491_25.0G_2-2.csv", ... "iladata_414_0491_25.0G_2-3.csv", ... "iladata_414_0491_26.0G_1-1.csv", ... "iladata_414_0491_26.0G_1-2.csv", ... "iladata_414_0491_26.0G_1-3.csv", ... "iladata_414_0491_26.0G_2-1.csv", ... "iladata_414_0491_26.0G_2-2.csv", ... "iladata_414_0491_26.0G_2-3.csv", ... "iladata_414_0491_27.0G_1-1.csv", ... "iladata_414_0491_27.0G_1-2.csv", ... "iladata_414_0491_27.0G_1-3.csv", ... "iladata_414_0491_27.0G_2-1.csv", ... "iladata_414_0491_27.0G_2-2.csv", ... "iladata_414_0491_27.0G_2-3.csv", ... "iladata_414_1391_25.0G_1-1.csv", ... "iladata_414_1391_25.0G_1-2.csv", ... "iladata_414_1391_25.0G_1-3.csv", ... "iladata_414_1391_26.0G_1-1.csv", ... "iladata_414_1391_26.0G_1-2.csv", ... "iladata_414_1391_26.0G_1-3.csv", ... "iladata_414_1391_27.0G_1-1.csv", ... "iladata_414_1391_27.0G_1-2.csv", ... "iladata_414_1391_27.0G_1-3.csv", ... "iladata_414_2291_25.0G_1-1.csv", ... "iladata_414_2291_25.0G_1-2.csv", ... "iladata_414_2291_25.0G_1-3.csv", ... "iladata_414_2291_26.0G_1-1.csv", ... "iladata_414_2291_26.0G_1-2.csv", ... "iladata_414_2291_26.0G_1-3.csv", ... "iladata_414_2291_27.0G_1-1.csv", ... "iladata_414_2291_27.0G_1-2.csv", ... "iladata_414_2291_27.0G_1-3.csv", ... "iladata_414_3109_25.0G_1-1.csv", ... "iladata_414_3109_25.0G_1-2.csv", ... "iladata_414_3109_25.0G_1-3.csv", ... "iladata_414_3109_26.0G_1-1.csv", ... "iladata_414_3109_26.0G_1-2.csv", ... "iladata_414_3109_26.0G_1-3.csv", ... "iladata_414_3109_27.0G_1-1.csv", ... "iladata_414_3109_27.0G_1-2.csv", ... "iladata_414_3109_27.0G_1-3.csv", ... "iladata_600_0000_25.0G_1-1.csv", ... "iladata_600_0000_25.0G_1-2.csv", ... "iladata_600_0000_25.0G_1-3.csv", ... "iladata_600_0000_26.0G_1-1.csv", ... "iladata_600_0000_26.0G_1-2.csv", ... "iladata_600_0000_26.0G_1-3.csv", ... "iladata_600_0000_27.0G_1-1.csv", ... "iladata_600_0000_27.0G_1-2.csv", ... "iladata_600_0000_27.0G_1-3.csv", ... "iladata_600_1800_25.0G_1-1.csv", ... "iladata_600_1800_25.0G_1-2.csv", ... "iladata_600_1800_25.0G_1-3.csv", ... "iladata_600_1800_26.0G_1-1.csv", ... "iladata_600_1800_26.0G_1-2.csv", ... "iladata_600_1800_26.0G_1-3.csv", ... "iladata_600_1800_27.0G_1-1.csv", ... "iladata_600_1800_27.0G_1-2.csv", ... "iladata_600_1800_27.0G_1-3.csv", ... ]; dataFileNum = length(dataFile); % standard pn sequence pnSequence = comm.PNSequence('Polynomial','x^7+x^6+1', ... 'InitialConditions',[zeros(1,6),1],'SamplesPerFrame',2^7-1); PRBS7 = pnSequence(); PRBS7_polar = 1-2*[PRBS7;0]; chipLen = length(PRBS7_polar); % pn chip length symNum = dataLen/chipLen/interp; % total symbol number %% data analysis % search for frequency shift freqDmfPeak = zeros(dataFileNum,length(freqRange)); freqTarget = zeros(dataFileNum,channelNum); % phase amplitude analysis desiredPnt = zeros(dataFileNum,symNum-1,channelNum); desiredPntIndex = zeros(dataFileNum,symNum-1,channelNum); ampEstSymRaw = zeros(dataFileNum,symNum-1,channelNum); ampEstSymMin = zeros(dataFileNum,channelNum); ampEstSymMax = zeros(dataFileNum,channelNum); ampEstSymAvg = zeros(dataFileNum,channelNum); angEstSymRaw = zeros(dataFileNum,symNum-1,channelNum); angEstSymMin = zeros(dataFileNum,channelNum); angEstSymMax = zeros(dataFileNum,channelNum); angEstSymAvg = zeros(dataFileNum,channelNum); ampEstSymRawList = strings(dataFileNum*(symNum-1)+1,channelNum+1); ampEstSymRawList(1,:) = ["Amp Raw Value", "ch1", "ch2", "ch3", "ch4"]; angEstSymRawList = strings(dataFileNum*(symNum-1)+1,channelNum+1); angEstSymRawList(1,:) = ["Angle Raw Value", "ch1", "ch2", "ch3", "ch4"]; desiredPntIndexList = strings(dataFileNum*(symNum-1)+1,channelNum+1); desiredPntIndexList(1,:) = ["Chip Index", "ch1", "ch2", "ch3", "ch4"]; for data_num = 1:dataFileNum % read data rawData = readmatrix(dataFile(data_num)); disp(dataFile(data_num)); seqRx(:,1) = (rawData(:, 4) + 1i*rawData(:, 5)).'; seqRx(:,2) = (rawData(:, 6) + 1i*rawData(:, 7)).'; seqRx(:,3) = (rawData(:, 8) + 1i*rawData(:, 9)).'; seqRx(:,4) = (rawData(:,10) + 1i*rawData(:,11)).'; % search for frequency shift for ch_num = 1:channelNum for freq_num = 1:length(freqRange) % multiply two symbols with carrier data_cxr = seqRx(1:2*chipLen*interp,ch_num).*exp(1i*2*pi* ... freqRange(freq_num)/fs*(0:2*chipLen*interp-1)'); % convolve multiplied data with pn sequence, without zero-padded results data_dmf = conv(data_cxr, kron(flip(PRBS7_polar),ones(interp,1)),'valid'); % peak search freqDmfPeak(data_num,freq_num) = max(abs(data_dmf(1:end-1))); end freqTarget(data_num,ch_num) = freqRange(freqDmfPeak(data_num,:) == ... max(freqDmfPeak(data_num,:))); end % phase amplitude analysis for ch_num = 1:channelNum seqRxCxr = seqRx(:,ch_num).*exp(1i*2*pi*freqTarget(1)/fs*(0:dataLen-1)'); seqRxCxrCorr = conv(seqRxCxr,kron(flip(PRBS7_polar),ones(interp,1)),'valid'); seqRxCxrCorrSplit = reshape(seqRxCxrCorr(1:end-1),chipLen*interp, ... symNum-1); desiredPntIndex(data_num,:,ch_num) = find(abs(seqRxCxrCorrSplit) == ... max(abs(seqRxCxrCorrSplit))) - 1024*(0:symNum-2)'; desiredPnt(data_num,:,ch_num) = seqRxCxrCorrSplit(abs(seqRxCxrCorrSplit) == ... max(abs(seqRxCxrCorrSplit))); ampEstSymRaw(data_num,:,ch_num) = abs(desiredPnt(data_num,:,ch_num))./abs(desiredPnt(data_num,:,1)); angEstSymRaw(data_num,:,ch_num) = mod((angle(desiredPnt(data_num,:,ch_num))-angle(desiredPnt(data_num,:,1)))/pi*180,360); ampEstSymMin(data_num,ch_num) = min(ampEstSymRaw(data_num,:,ch_num)); ampEstSymMax(data_num,ch_num) = max(ampEstSymRaw(data_num,:,ch_num)); ampEstSymAvg(data_num,ch_num) = mean(ampEstSymRaw(data_num,:,ch_num)); angEstSymMin(data_num,ch_num) = min(angEstSymRaw(data_num,:,ch_num)); angEstSymMax(data_num,ch_num) = max(angEstSymRaw(data_num,:,ch_num)); angEstSymAvg(data_num,ch_num) = mean(angEstSymRaw(data_num,:,ch_num)); end desiredPntIndexList((data_num-1)*(symNum-1)+1+(1:symNum-1),1) = dataFile(data_num); desiredPntIndexList((data_num-1)*(symNum-1)+1+(1:symNum-1),2:end) = string(desiredPntIndex(data_num,:,:)); ampEstSymRawList((data_num-1)*(symNum-1)+1+(1:symNum-1),1) = dataFile(data_num); ampEstSymRawList((data_num-1)*(symNum-1)+1+(1:symNum-1),2:end) = string(ampEstSymRaw(data_num,:,:)); angEstSymRawList((data_num-1)*(symNum-1)+1+(1:symNum-1),1) = dataFile(data_num); angEstSymRawList((data_num-1)*(symNum-1)+1+(1:symNum-1),2:end) = string(angEstSymRaw(data_num,:,:)); end freqTargetRelative = freqTarget - freqTarget(:,1); freqTargetMax = max(freqTarget,[],'all'); freqTargetMin = min(freqTarget,[],'all'); maxDesiredPointIndexDiff = max(abs(desiredPntIndex-(desiredPntIndex(:,:,1))),[],"all"); ampEstSymMaxList = strings(dataFileNum+1,channelNum+1); ampEstSymMinList = strings(dataFileNum+1,channelNum+1); ampEstSymAvgList = strings(dataFileNum+1,channelNum+1); ampEstSymMaxList(1,:) = ["Amp Max Value", "ch1", "ch2", "ch3", "ch4"]; ampEstSymMinList(1,:) = ["Amp Min Value", "ch1", "ch2", "ch3", "ch4"]; ampEstSymAvgList(1,:) = ["Amp Avg Value", "ch1", "ch2", "ch3", "ch4"]; ampEstSymMaxList(2:end,1) = dataFile; ampEstSymMinList(2:end,1) = dataFile; ampEstSymAvgList(2:end,1) = dataFile; ampEstSymMaxList(2:end,2:end) = string(ampEstSymMin); ampEstSymMinList(2:end,2:end) = string(ampEstSymMax); ampEstSymAvgList(2:end,2:end) = string(ampEstSymAvg); angEstSymMaxList = strings(dataFileNum+1,channelNum+1); angEstSymMinList = strings(dataFileNum+1,channelNum+1); angEstSymAvgList = strings(dataFileNum+1,channelNum+1); angEstSymMaxList(1,:) = ["Angle Max Value", "ch1", "ch2", "ch3", "ch4"]; angEstSymMinList(1,:) = ["Angle Min Value", "ch1", "ch2", "ch3", "ch4"]; angEstSymAvgList(1,:) = ["Angle Avg Value", "ch1", "ch2", "ch3", "ch4"]; angEstSymMaxList(2:end,1) = dataFile; angEstSymMinList(2:end,1) = dataFile; angEstSymAvgList(2:end,1) = dataFile; angEstSymMaxList(2:end,2:end) = string(angEstSymMin); angEstSymMinList(2:end,2:end) = string(angEstSymMax); angEstSymAvgList(2:end,2:end) = string(angEstSymAvg); %% figures % figure(1); % % subplot(121); % plot(ampEstSymAvg); % legend({"ch1","ch2","ch3","ch4"}); % title("Amplitude Estimation"); % ylim([min(ampEstSymAvg,[],'all')-0.2,max(ampEstSymAvg,[],'all')+0.2]); % grid on; grid minor; % % subplot(122); % plot(angEstSymAvg); % legend({"ch1","ch2","ch3","ch4"}); % title("Angle Estimation"); % ylim([-10,370]); % grid on; grid minor;