Archived
update online freq auto switch logic
This commit is contained in:
@@ -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;
|
||||||
+196
@@ -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;
|
||||||
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
LFS
Executable
BIN
Binary file not shown.
|
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# project.tcl: Tcl script for re-creating project 'project'
|
# 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
|
# 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*
|
# This file contains the Vivado Tcl commands for re-creating the project to the state*
|
||||||
|
|||||||
Reference in New Issue
Block a user