From b1cec9ae1255528e306b53d9fec7714154f97c4c Mon Sep 17 00:00:00 2001 From: David Madsen Date: Tue, 28 Jan 2025 12:32:53 -0700 Subject: [PATCH 1/3] Reverted back to my fix for CPHD optional PVP parameters. It flattens RcvAntenna and TxAntenna similar to AddedPVP which is the format the CPHD writer expects --- IO/phase_history/cphd/open_cphd_reader.m | 48 ++++++++++++------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/IO/phase_history/cphd/open_cphd_reader.m b/IO/phase_history/cphd/open_cphd_reader.m index 6a0907d..fb5cc44 100644 --- a/IO/phase_history/cphd/open_cphd_reader.m +++ b/IO/phase_history/cphd/open_cphd_reader.m @@ -42,6 +42,27 @@ % from file the vector-based metadata for the selected vectors, but it % hardly seems necessary as fast as this goes. vectorParametersFlatten = xml_meta.PVP; +if isfield(vectorParametersFlatten,'RcvAntenna') + vectorParametersFlatten = rmfield(vectorParametersFlatten, 'RcvAntenna'); + vectorParametersFlatten = setstructfields(vectorParametersFlatten, xml_meta.PVP.RcvAntenna); +end +if isfield(vectorParametersFlatten, 'AddedPVP') + vectorParametersFlatten = rmfield(vectorParametersFlatten, 'AddedPVP'); + for i = 1:numel(xml_meta.PVP.AddedPVP) + try + addedPVP = xml_meta.PVP.AddedPVP{i}; + catch + addedPVP = xml_meta.PVP.AddedPVP(i); + end + vectorParametersFlatten.(addedPVP.Name).Offset = addedPVP.Offset; + vectorParametersFlatten.(addedPVP.Name).Size = addedPVP.Size; + vectorParametersFlatten.(addedPVP.Name).Format = addedPVP.Format; + end +end +if isfield(vectorParametersFlatten,'TxAntenna') + vectorParametersFlatten = rmfield(vectorParametersFlatten, 'TxAntenna'); + vectorParametersFlatten = setstructfields(vectorParametersFlatten, xml_meta.PVP.TxAntenna); +end vectorParametersCell = fieldnames(vectorParametersFlatten); % Iterate through channels to extract vector-based metadata BYTES_PER_ELEMENT = 8; % Everything in vector-based metadata is of type double @@ -55,30 +76,9 @@ vb_array = fread(fid, [(xml_meta.Data.NumBytesPVP/BYTES_PER_ELEMENT) xml_meta.Data.Channel(i).NumVectors], 'double'); % Distribute vector-based metadata into a structure for j = 1:numel(vectorParametersCell) - if(contains(vectorParametersCell{j},'AddedPVP')) - for jj = 1:numel(xml_meta.PVP.(vectorParametersCell{j})) - try - vbp_all(i).(xml_meta.PVP.(vectorParametersCell{j}){jj}.Name) = ... - vb_array(xml_meta.PVP.(vectorParametersCell{j}){jj}.Offset+... - (1:xml_meta.PVP.(vectorParametersCell{j}){jj}.Size),:).'; - catch - vbp_all(i).(xml_meta.PVP.(vectorParametersCell{j}).Name) = ... - vb_array(xml_meta.PVP.(vectorParametersCell{j}).Offset+... - (1:xml_meta.PVP.(vectorParametersCell{j}).Size),:).'; - end - end - elseif(contains(vectorParametersCell{j},{'TxAntenna','RcvAntenna'})) - antennaVectorParametersCell = fieldnames(xml_meta.PVP.(vectorParametersCell{j})); - for jj = 1:numel(antennaVectorParametersCell) - vbp_all(i).(vectorParametersCell{j}).(antennaVectorParametersCell{jj}) = ... - vb_array(xml_meta.PVP.(vectorParametersCell{j}).(antennaVectorParametersCell{jj}).Offset+... - (1:xml_meta.PVP.(vectorParametersCell{j}).(antennaVectorParametersCell{jj}).Size),:).'; - end - else - vbp_all(i).(vectorParametersCell{j}) = ... - vb_array(xml_meta.PVP.(vectorParametersCell{j}).Offset+... - (1:xml_meta.PVP.(vectorParametersCell{j}).Size),:).'; - end + vbp_all(i).(vectorParametersCell{j}) = ... + vb_array(vectorParametersFlatten.(vectorParametersCell{j}).Offset+... + (1:vectorParametersFlatten.(vectorParametersCell{j}).Size),:).'; end end From 8256bb9111c31c20786a76c1ebe495145e79871a Mon Sep 17 00:00:00 2001 From: David Madsen Date: Tue, 28 Jan 2025 16:09:51 -0700 Subject: [PATCH 2/3] I'm pretty sure that xml_meta.PVP.TxPulse.TxAntenna should be xml_meta.PVP.TxAntenna but I don't have any CRSD data to check and the draft standard I have doesn't include TxAntenna at all. This would be correct for CPHD data. Handle AddedPVP when outputting CPHD. --- IO/phase_history/crsd/open_crsd_reader.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IO/phase_history/crsd/open_crsd_reader.m b/IO/phase_history/crsd/open_crsd_reader.m index 5ea2c5f..2edf7b1 100644 --- a/IO/phase_history/crsd/open_crsd_reader.m +++ b/IO/phase_history/crsd/open_crsd_reader.m @@ -47,7 +47,7 @@ end if isfield(vectorParametersFlatten,'TxAntenna') vectorParametersFlatten = rmfield(vectorParametersFlatten, 'TxAntenna'); - vectorParametersFlatten = setstructfields(vectorParametersFlatten, xml_meta.PVP.TxPulse.TxAntenna); + vectorParametersFlatten = setstructfields(vectorParametersFlatten, xml_meta.PVP.TxAntenna); end vectorParametersCell = fieldnames(vectorParametersFlatten); % Iterate through channels to extract vector-based metadata From 16f4ede7ea29055ae1c365ffe1583e20d4530d72 Mon Sep 17 00:00:00 2001 From: David Madsen Date: Tue, 28 Jan 2025 16:10:13 -0700 Subject: [PATCH 3/3] I'm pretty sure that xml_meta.PVP.TxPulse.TxAntenna should be xml_meta.PVP.TxAntenna but I don't have any CRSD data to check and the draft standard I have doesn't include TxAntenna at all. This would be correct for CPHD data. Handle AddedPVP when outputting CPHD. --- IO/phase_history/cphd/convert_to_cphd.m | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/IO/phase_history/cphd/convert_to_cphd.m b/IO/phase_history/cphd/convert_to_cphd.m index 4cf38cf..4cd6ed3 100644 --- a/IO/phase_history/cphd/convert_to_cphd.m +++ b/IO/phase_history/cphd/convert_to_cphd.m @@ -280,14 +280,27 @@ function write_cphd_vbmeta(cphd_fid, cphd_meta, nbdata) vectorParametersFlatten = rmfield(vectorParametersFlatten, 'RcvAntenna'); vectorParametersFlatten = setstructfields(vectorParametersFlatten, cphd_meta.PVP.RcvAntenna); end + if isfield(vectorParametersFlatten, 'AddedPVP') + vectorParametersFlatten = rmfield(vectorParametersFlatten, 'AddedPVP'); + for i = 1:numel(cphd_meta.PVP.AddedPVP) + try + addedPVP = cphd_meta.PVP.AddedPVP{i}; + catch + addedPVP = cphd_meta.PVP.AddedPVP(i); + end + vectorParametersFlatten.(addedPVP.Name).Offset = addedPVP.Offset; + vectorParametersFlatten.(addedPVP.Name).Size = addedPVP.Size; + vectorParametersFlatten.(addedPVP.Name).Format = addedPVP.Format; + end + end if isfield(vectorParametersFlatten,'TxPulse') vectorParametersFlatten = rmfield(vectorParametersFlatten, 'TxPulse'); vectorParametersFlatten = setstructfields(vectorParametersFlatten, cphd_meta.PVP.TxPulse); end if isfield(vectorParametersFlatten,'TxAntenna') vectorParametersFlatten = rmfield(vectorParametersFlatten, 'TxAntenna'); - vectorParametersFlatten = setstructfields(vectorParametersFlatten, cphd_meta.PVP.TxPulse.TxAntenna); - end + vectorParametersFlatten = setstructfields(vectorParametersFlatten, cphd_meta.PVP.TxAntenna); + end vectorParametersCell = fieldnames(vectorParametersFlatten); vb_array = zeros(cphd_meta.Data.NumBytesPVP/8,length(nbdata.TxTime)); for i = 1:length(vectorParametersCell)