finish pa phase calibration, add sample data

测试了三台对飞节点的相对幅相,测试了一台814节点的相对幅相
This commit is contained in:
2023-05-16 09:14:53 +08:00
parent c32d684223
commit 986a2ea1e1
256 changed files with 1273 additions and 43 deletions
@@ -0,0 +1,207 @@
%% 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;
symNum = 8;
fs = 48e6;
freqRange = 25000:1000:30000;
% dataFile = [ ...
% "iladata_rx_data_26G_20230511_1615_SWGnd_A-1.csv", ...
% "iladata_rx_data_26G_20230511_1619_SWGnd_Ant01_A-1.csv", ...
% "iladata_rx_data_26G_20230511_1620_SWGnd_Ant02_A-1.csv", ...
% "iladata_rx_data_26G_20230511_1624_SWGnd_Ant03_A-1.csv", ...
% "iladata_rx_data_26G_20230511_1626_SWGnd_B-1.csv", ...
% "iladata_rx_data_26G_20230511_1628_SWGnd_Ant01_B-1.csv", ...
% "iladata_rx_data_26G_20230511_1630_SWGnd_Ant02_B-1.csv", ...
% "iladata_rx_data_26G_20230511_1631_SWGnd_Ant03_B-1.csv", ...
% ];
dataFile = [ ...
"iladata_814_rx_26G_20230512_1650_A-1.csv", ...
"iladata_814_rx_26G_20230512_1650_A-2.csv", ...
"iladata_814_rx_26G_20230512_1650_A-3.csv", ...
"iladata_814_rx_26G_20230512_1700_A-1.csv", ...
"iladata_814_rx_26G_20230512_1700_A-2.csv", ...
"iladata_814_rx_26G_20230512_1700_A-3.csv", ...
"iladata_814_rx_26G_20230512_1730_B-1.csv", ...
"iladata_814_rx_26G_20230512_1730_B-2.csv", ...
"iladata_814_rx_26G_20230512_1730_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];
pnSequence = comm.PNSequence('Polynomial','x^10+x^7+1', ...
'InitialConditions',[zeros(1,9),1],'SamplesPerFrame',2^10-1);
PRBS10 = pnSequence();
PRBS10_polar = 1-2*[PRBS10;0];
%% 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 = [];
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)).';
if (dataFile(data_num).contains(["0509","0510","0511"]))
PRBS = PRBS7_polar;
else
PRBS = PRBS10_polar;
end
dataLen = length(seqRx(:,1));
chipLen = length(PRBS); % pn chip length
PRBS_up_flip = kron(flip(PRBS),ones(interp,1));
% 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, PRBS_up_flip,'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,PRBS_up_flip,'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
%% data analysis
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;
% xticks([1 5 10 20])
% xticklabels(dataFile)
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:45f946e9ba49485396a79521bce99ee1999def4928b60a401a0c9a1bdd241d90
3 size 4124736
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:60c82502c83998cfe528eb9d267305c628d6b27fe67416c51ab144fff949d22b
3 size 4124715
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:c986a24af2ef089274ecfe0b44968b7323ebfb1f6e11d25892b86070ee420bb4
3 size 4124324
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:4194261c08f91f936aadf9d919bfb9a14dade1e7db0d92230e0f1593baedc62a
3 size 4122879
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:7d6db01322986db304dedebd35f8a1e375d29ffcf69cbcae12687a038e3a1d8f
3 size 4123864
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:703b9f39bd793c00926419ef6fee3b2af3152565a63f5b6227a624c95f167a8e
3 size 4125526
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:b904fcf34fc2573aeb28fc31479af0902e3d67028fdfcd127693dfe953e6789f
3 size 4115729
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:2ad2bef7b3f7404f7de722084dadc6865efc57c186aaf8ace29d5c90de4afe3d
3 size 4114968
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:0df07262102198cec4f58483ff0ae7c483ed4ac689e64488ade44f74b2f0bfb9
3 size 4117607
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:7f5d77913a78e5091991442e630d511d473252588de1332db77cd9c5906ebfd1
3 size 196859
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:cff39dfeb1f899c2cd81e2bacde5aabea7e276e47d69ff667e2e607845ce4fa1
3 size 197094
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:07654e05725ee6ff64cb32f4f1632a21a261b31046395247551f521201b85335
3 size 196524
Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:17a2e298b332a8941d243dab25ec594b3a5785cfeca690c7cf43a9d859aed8f1
3 size 196437
@@ -0,0 +1,31 @@
% clear;
dataFile = [ ...
"iladata_814_sweep_20230512_1722_A.csv", ...
"iladata_814_sweep_20230512_1725_B.csv", ...
"iladata_814_sweep_20230512_1727_B.csv", ...
"iladata_814_sweep_20230512_1734_B.csv", ...
];
dataFileNum = length(dataFile);
for data_num = 1:dataFileNum
data = readmatrix(dataFile(data_num));
valid_index = find(data(:,4)==1);
peak = [ ...
data(valid_index,5) + 1i*data(valid_index,6), ...
data(valid_index,7) + 1i*data(valid_index,8), ...
data(valid_index,9) + 1i*data(valid_index,10), ...
data(valid_index,11) + 1i*data(valid_index,12)];
peak_amp = [abs(peak)./abs(peak(:,1)),abs(peak(:,1)), ...
round(data(valid_index,end-1)/2^32*192e6),data(valid_index,end)];
angleNormal = (angle(peak) - angle(peak(:,1)))/pi*180;
angleNormal(abs(angleNormal) > 5) = mod(angleNormal(abs(angleNormal) > 5),360);
peak_ang = [angleNormal, ...
abs(peak(:,1)),round(data(valid_index,end-1)/2^32*192e6),data(valid_index,end)];
scatter(peak_ang(:,7),peak_ang(:,2:4),'filled');hold on;
end