revise dl814_dj_48m

the data counter of module tx_pn_seq was mod-32, now modified to mod-128 to cover the whole pn cycle
This commit is contained in:
2023-03-26 14:18:20 +08:00
parent 7a555fab92
commit bd032a8474
1281 changed files with 161534 additions and 1577004 deletions
@@ -0,0 +1,90 @@
%% File Header/文件说明
%
% 调零算法对幅相一致性的要求较高,且 AD9361 多片同步的精度随机性较大,因此需要对
% AD9361 多片同步误差进行精细校准。采用收发扩频码的方式在校准过程中对两片 AD9361
% 的两个接收通道进行幅相测量,在接收端使用加法器进行非相干相关峰累积,累积 N 个
% 符号后出峰,根据相关峰的高度差和相位差,在接收端对信号的幅度和相位进行补偿。
%
clc; clear;
%% initial system parameters/初始系统参数
interp = 8; % interpolation factor
channelNum = 4;
dataLen = 131072;
fs = 48e6;
fd = -25427;
% 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
symbolNum = dataLen/chipLen/interp;
rxdata = readmatrix("iladata_prsb7_interp8_1-1.csv");
seqRx(:,1) = (rxdata(:, 4) + 1i*rxdata(:, 5)).'.*exp(1i*2*pi*fd/fs*(0:dataLen-1));
seqRx(:,2) = (rxdata(:, 6) + 1i*rxdata(:, 7)).'.*exp(1i*2*pi*fd/fs*(0:dataLen-1));
seqRx(:,3) = (rxdata(:, 8) + 1i*rxdata(:, 9)).'.*exp(1i*2*pi*fd/fs*(0:dataLen-1));
seqRx(:,4) = (rxdata(:,10) + 1i*rxdata(:,11)).'.*exp(1i*2*pi*fd/fs*(0:dataLen-1));
% 降采样
seqRxDown = downsample(seqRx,interp,0);
% 取符号位
seqRxMsbReal = zeros(size(seqRxDown));
seqRxMsbImag = zeros(size(seqRxDown));
seqRxMsbReal(real(seqRxDown)>0) = 1;
seqRxMsbReal(real(seqRxDown)<0) = -1;
seqRxMsbImag(imag(seqRxDown)>0) = 1;
seqRxMsbImag(imag(seqRxDown)<0) = -1;
% 符号累积
seqRxAccum = zeros(chipLen,channelNum);
for i = 0:chipLen-1
% PN 码圆周移位,遍历所有 PN 码相位
PRBS7_cshift = circshift(repmat(PRBS7_polar(1:32),symbolNum*4,1),-i); % 负号为了和 Verilog 程序对应
% 累积,若当前比特与 PN 码相同,结果 +1;否则结果 -1
seqRxAccum(i+1,:) = sum(seqRxDown(PRBS7_cshift==seqRxMsbReal))-...
sum(seqRxDown(PRBS7_cshift~=seqRxMsbReal));
end
% % 通过相关峰位置判断目标信号位置
% maxPeakIndex = zeros(2,interp);
%
% for i = 1:2
% for j = 1:interp
% maxPeakIndex(i,j) = find(abs(seqRxMsbAccum(:,i,j))==max(abs(seqRxMsbAccum(:,i,j))),1); % PN 码相位
% end
% end
%
% maxPeakIndexDiff = zeros(channelNum,1); % 相位差
%
% for i = 1:channelNum
% for j = 1:interp
% if (maxPeakIndex(i,j)==maxPeakIndex(i,1))
% maxPeakIndexDiff(i) = j;
% end
% end
% end
%
% % 以下条件仅对双通道有效
% if (maxPeakIndex(1,1) == maxPeakIndex(2,1))
% relativeDelay = maxPeakIndexDiff(2) - maxPeakIndexDiff(1);
% desiredPointIndex = [1,1]+[0,chipLen];
% elseif (mod(maxPeakIndex(1,1)-1,chipLen) == mod(maxPeakIndex(2,1),chipLen))
% relativeDelay = maxPeakIndexDiff(2) - maxPeakIndexDiff(1) + interp;
% desiredPointIndex = [1,2]+[0,chipLen];
% elseif (mod(maxPeakIndex(1,1)+1,chipLen) == mod(maxPeakIndex(2,1),chipLen))
% relativeDelay = maxPeakIndexDiff(2) - maxPeakIndexDiff(1) - interp;
% desiredPointIndex = [2,1]+[0,chipLen];
% end
%
% % 输入信号累加
% seqRxDownAccum = squeeze(sum(reshape(seqRxDown(:,:,1),128,[],2),2));
% % 取目标位置信号
% desiredPoint = seqRxDownAccum(desiredPointIndex);
%
% ampEst = abs(desiredPoint)./abs(desiredPoint(1));
% angleEst = (angle(desiredPoint) - angle(desiredPoint(1)))/pi*180;