update online freq auto switch logic

This commit is contained in:
2023-05-11 09:54:06 +08:00
parent 1083b3c7e3
commit c8b75a293f
35 changed files with 808 additions and 1 deletions
@@ -0,0 +1,326 @@
%% 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;
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", ...
"iladata_cal_000_0000_00_00_26.0G_1.csv", ...
"iladata_cal_000_0000_00_00_26.0G_2.csv", ...
"iladata_cal_000_0000_00_00_26.0G_3.csv", ...
"iladata_cal_000_0000_00_00_27.0G_1.csv", ...
"iladata_cal_000_0000_00_00_27.0G_2.csv", ...
"iladata_cal_000_0000_00_00_27.0G_3.csv", ...
"iladata_cal_000_0000_20_20_26.0G_1.csv", ...
"iladata_cal_000_0000_20_20_26.0G_2.csv", ...
"iladata_cal_000_0000_20_20_26.0G_3.csv", ...
"iladata_cal_000_0000_20_20_27.0G_1.csv", ...
"iladata_cal_000_0000_20_20_27.0G_2.csv", ...
"iladata_cal_000_0000_20_20_27.0G_3.csv", ...
"iladata_cal_25.0G.csv", ...
"iladata_cal_25.0G_result.csv", ...
"iladata_cal_26.0G.csv", ...
"iladata_cal_27.0G.csv", ...
"iladata_cal_414_3109_00_00_27.0G_1.csv", ...
"iladata_cal_414_3109_00_00_27.0G_2.csv", ...
"iladata_cal_414_3109_00_00_27.0G_3.csv", ...
"iladata_cal_414_3109_30_30_27.0G_1.csv", ...
"iladata_cal_414_3109_30_30_27.0G_2.csv", ...
"iladata_cal_414_3109_30_30_27.0G_3.csv", ...
"iladata_cal_600_3150_30_30_27.0G_1.csv", ...
"iladata_cal_600_3150_30_30_27.0G_2.csv", ...
"iladata_cal_600_3150_30_30_27.0G_3.csv", ...
"iladata_cal_600_3150_38_51_27.0G_1.csv", ...
"iladata_cal_600_3150_38_51_27.0G_2.csv", ...
"iladata_cal_600_3150_38_51_27.0G_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
freqRange = -20000:50:0;
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(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);
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;
@@ -0,0 +1,192 @@
%% 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;
dataFile = [ ...
% "iladata_rx_data_26G_20230509_1445.csv", ...
% "iladata_rx_data_26G_20230509_1715.csv", ...
"iladata_rx_data_26G_20230510_1030.csv", ...
"iladata_rx_data_26G_20230510_1100.csv", ...
"iladata_rx_data_26G_20230510_1115.csv", ...
"iladata_rx_data_26G_20230510_1415_A-1.csv", ...
"iladata_rx_data_26G_20230510_1415_A-2.csv", ...
"iladata_rx_data_26G_20230510_1415_A-3.csv", ...
"iladata_rx_data_26G_20230510_1455_B-1.csv", ...
"iladata_rx_data_26G_20230510_1455_B-2.csv", ...
"iladata_rx_data_26G_20230510_1455_B-3.csv", ...
"iladata_rx_data_26G_20230510_1500_A-1.csv", ...
"iladata_rx_data_26G_20230510_1500_A-2.csv", ...
"iladata_rx_data_26G_20230510_1500_A-3.csv", ...
"iladata_rx_data_26G_20230510_1530_B-1.csv", ...
"iladata_rx_data_26G_20230510_1530_B-2.csv", ...
"iladata_rx_data_26G_20230510_1530_B-3.csv", ...
"iladata_rx_data_26G_20230510_1600_B-1.csv", ...
"iladata_rx_data_26G_20230510_1600_B-2.csv", ...
"iladata_rx_data_26G_20230510_1630_B-1.csv", ...
"iladata_rx_data_26G_20230510_1630_B-2.csv", ...
"iladata_rx_data_26G_20230510_1630_B-3.csv", ...
"iladata_rx_data_26G_20230510_1725_B-1.csv", ...
"iladata_rx_data_26G_20230510_1725_B-2.csv", ...
"iladata_rx_data_26G_20230510_1725_B-3.csv", ...
"iladata_rx_data_26G_20230510_1730_A-1.csv", ...
"iladata_rx_data_26G_20230510_1730_A-2.csv", ...
"iladata_rx_data_26G_20230510_1730_A-3.csv", ...
"iladata_rx_data_26G_20230510_1740_B-1.csv", ...
"iladata_rx_data_26G_20230510_1740_B-2.csv", ...
"iladata_rx_data_26G_20230510_1740_B-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
freqRange = 22000:10:28000;
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(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);
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;
@@ -0,0 +1,196 @@
%% 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;
dataFile = [ ...
% "iladata_rx_data_26G_20230509_1445.csv", ...
% "iladata_rx_data_26G_20230509_1715.csv", ...
"iladata_rx_data_26G_20230510_1030.csv", ...
"iladata_rx_data_26G_20230510_1100.csv", ...
"iladata_rx_data_26G_20230510_1115.csv", ...
"iladata_rx_data_26G_20230510_1415_A-1.csv", ...
"iladata_rx_data_26G_20230510_1415_A-2.csv", ...
"iladata_rx_data_26G_20230510_1415_A-3.csv", ...
"iladata_rx_data_26G_20230510_1455_B-1.csv", ...
"iladata_rx_data_26G_20230510_1455_B-2.csv", ...
"iladata_rx_data_26G_20230510_1455_B-3.csv", ...
"iladata_rx_data_26G_20230510_1500_A-1.csv", ...
"iladata_rx_data_26G_20230510_1500_A-2.csv", ...
"iladata_rx_data_26G_20230510_1500_A-3.csv", ...
"iladata_rx_data_26G_20230510_1530_B-1.csv", ...
"iladata_rx_data_26G_20230510_1530_B-2.csv", ...
"iladata_rx_data_26G_20230510_1530_B-3.csv", ...
"iladata_rx_data_26G_20230510_1600_B-1.csv", ...
"iladata_rx_data_26G_20230510_1600_B-2.csv", ...
"iladata_rx_data_26G_20230510_1630_B-1.csv", ...
"iladata_rx_data_26G_20230510_1630_B-2.csv", ...
"iladata_rx_data_26G_20230510_1630_B-3.csv", ...
"iladata_rx_data_26G_20230510_1725_B-1.csv", ...
"iladata_rx_data_26G_20230510_1725_B-2.csv", ...
"iladata_rx_data_26G_20230510_1725_B-3.csv", ...
"iladata_rx_data_26G_20230510_1730_A-1.csv", ...
"iladata_rx_data_26G_20230510_1730_A-2.csv", ...
"iladata_rx_data_26G_20230510_1730_A-3.csv", ...
"iladata_rx_data_26G_20230510_1740_B-1.csv", ...
"iladata_rx_data_26G_20230510_1740_B-2.csv", ...
"iladata_rx_data_26G_20230510_1740_B-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
freqRange = 22000:10:28000;
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(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);
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;
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:7c5e3b87d9bdbe5f5e7a4065e862fdce8235aed8704a59b57821aebdf5491eee
3 size 419066
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:8c9991f0e8e706e3b01edd2fab962702362aab5db43d3ee4135bf3ecfc498293
3 size 418898
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:af350681a5b99fc16697d79b95cf9b5aa1c0bcba0224742424d989a16775c5ee
3 size 419975
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:466c2043c54790ffa08b27666beb2892beca825bef7a15a6eb66bf6ada89440b
3 size 419547
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:a59f59185a42a7ba33b17e478ff1abeae2e44715d4c83250d13ada9c1fc6ba96
3 size 419661
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:17ee4e96ca52aca8ef6de96a65d6f387eac65c6729fd06da24dd168ca136a824
3 size 484787
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:2a2552bc412e891a6a61023b62ac2f5d06c3c396c200059d10dcc86c42ee7c0b
3 size 484433
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:fe6627b083a17d42d3b8baf126b249eb4beea8d27833c51a093c99dc51b4be6a
3 size 485276
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:4b0608a5c70d7b601ed603c3c1e4956dcfb61363506326d881985b2ff5d71504
3 size 484526
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:39e5edaeeecd1435a28c7c53ffc7b4dc21ab5d15c6c2a8c3daff8b904fe18018
3 size 484536
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:8aca0f3a4b701511d2e3c7ea95c74ede064ef47929a8c1bec22055d118bd0149
3 size 484431
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:99072df1b10b1d54d246d58e8f37029fe53d90ad15be51811768f1e2cc44667b
3 size 484364
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:641c507179f5ea4bdb3c8d6cb86dc0123f64e3fde0a47b4ddf3daa245fa62309
3 size 485168
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:953cab3446586e1d7f872e0cb5c54da49f9519157dd7f5a1ed9b703836055165
3 size 484462
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:016e73aa5e691a7b0e99ad58447738c01c858871ebe46fbb148fcc77b1e0cedd
3 size 484872
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:f885a483ffbfc59a6da656133851f41b07e5db96b5bba0d2a369817748310578
3 size 484908
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:aaec38beef9ab7be7c7407e6d6ba032b2fb2fc5f8b893c948c5a2684b8665813
3 size 484113
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:98b59114916e8dfc63b43910100312bd51c13f38ef1f4d8c676eccdbfb336de4
3 size 484924
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:fe523216216fac3026be14431c7c90b9f8548fc29ee055f759aac3584250f799
3 size 485237
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:4d3885d9ba0d2d590b046ac5e05f74decfbec300f681412054b7ef8bb5dfb2ce
3 size 484442
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:0056e84004f66d73ad59ee9d637e1e145181c297d159b1bea2c0b6829042fb72
3 size 485012
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:25bd83f9fb20c77578f98454bf7a9c60d4bbfab56128a93ee97afd7decf4058d
3 size 484552
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:e35619de73163327886f1425d76c9953e5b6d442edcb04a948be6b0fc6075eb7
3 size 485434
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:07842f6b506cb466b762963510e3558fe59affd64c4456c48e995fa9298c9bb3
3 size 484719
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:738a08d6f6dd880f770d02c4b8c137988b59a2e98137ddddc18f8f924db67c79
3 size 484907
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:9dbfdfb7becade394ce8a044d5c57b3a83e8a474f5c4110be7ca601b4171e74b
3 size 484807
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:3dac0aa7c8ccf00b8acddd6180940920cf1643593860fe70f0a0ecb21408206d
3 size 484253
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:b681ce78707b9a8201e47725dd3703c7675c6051535ca07dfa945703d557e016
3 size 484347
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:b96c63b3c8bcdfffc42e1860a1233c78c76a045e5ceec312a2ed75df1349217f
3 size 484197
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:b90b9d3e15c65e1cd3307faef2d1f9b0f74a03b9da1992785574d5c53aeb2117
3 size 485032
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:60c5c70f96bc8290eb4cfd9ea06f62fece22038a8dfb6ef2462f8ff4390e02a2
3 size 484408
@@ -3,7 +3,7 @@
#
# project.tcl: Tcl script for re-creating project 'project'
#
# Generated by Vivado on Wed May 10 18:48:33 CST 2023
# Generated by Vivado on Thu May 11 09:23:36 CST 2023
# IP Build 2633630 on Wed Sep 4 12:30:14 MDT 2019
#
# This file contains the Vivado Tcl commands for re-creating the project to the state*