关键词: 数码拼接, 逻辑分析仪, 存储器限制, 离散, 连接, 基本数码拼接, 超前数码拼接, 反转数码拼接, 连续, INL, DNL, 积分非线性, 微分非线性
関連製品 |
Stitch Technique | Size of Final Data Set | Description | ||||
Data Set Numbers | # of codes (averaged) |
% of two data sets (averaged) |
||||
1 + 2 | 3 + 4 | 1 + 4 | ||||
Concatenate† | N/A | 16384 | 100% | Will produce erroneous FFT; however, INL/DNL can be extracted from this data. | ||
Basic | 11060 | 8192‡ | 14384 | 11212 | 68.4% | FFT is useable for calculating figures of merit. |
Reverse | 11060 | 8192‡ | 14384 | 11212 | 68.4% | |
Advanced | 13790 | 16046 | 16022 | 15286 | 93.3% | |
Advanced + Reverse |
15427 | 16176 | 16022 | 15875 | 96.9% |
function [StitchedMatrix, StitchBins] = StitchMatrices(MatrixA, ... MatrixB, StitchNumber, PrevStitchBins, ... AdvCodeStitchEnabled, ReverseStitchEnabled); %Stitch Matrices Function %Revision 1.0 % %By Donald Schelle, May 2005 %Maxim Integrated %160 Rio Robles %Sunnyvale, CA, 94086 % %This function will take two matrices (MatrixA and MatrixB), find a %given number (StitchNumber) of identical points in each and %concatenate the two matrices into one. % %Inputs = MatrixA, MatrixB (Data Matrices) % StitchNumber (Number of points to match) % PrevStitchBins (Bins of Previous Stitches in MatrixA) % AdvStitchEnabled (0 = NO, 1 = YES) % ReverseStitchEnabled (0 = NO, 1 = YES) %Output = StitchedMatrix (MatrixA + MatrixB) % StitchBins (bins of StitchedMatrix where the two % matrices were joined.) % %If the matrices can not be joined the function will output a NaN %for both the StitchedMatrix variable and the StitchBins variable %-------------------------------------------------------------------------- %Check to see that there are at least TWO StitchNumber Points if StitchNumber < 2, %Requested less than 2 stitch points StitchedMatrix = NaN; StitchBins = NaN; return; end; %Calculate Size of MatrixA and MatrixB [SizeA, Junk] = size(MatrixA); [SizeB, Junk] = size(MatrixB); %Find the Stitch Points in MatrixB [NormalA, NormalB] = FindStitchPoint(MatrixA, MatrixB, ... StitchNumber, AdvCodeStitchEnabled); %Calculate the size of the NormalStitched Matrix NormalStitchedSize = NormalA + SizeB - NormalB + 1; %Check to see if the reverse function is enabled if ReverseStitchEnabled == 1, %Find Stitch Points for Reverse Matrices [ReverseB, ReverseA] = FindStitchPoint(MatrixB, MatrixA, ... StitchNumber, AdvCodeStitchEnabled); %Calculate the size of the Revered Stitched Matrix ReverseStitchedSize = ReverseB + SizeA - ReverseA + 1; else %Set Values to defaults ReverseStitchedSize = NaN; %MatrixB/A Stitch Size ReverseA = NaN; ReverseB = NaN; end; %Check to if it's possible to stitch two matrices if isnan(NormalStitchedSize) & isnan(ReverseStitchedSize) == 1, %The two matrices could not be stitched StitchedMatrix = NaN; StitchBins = NaN; return; end; %--------------------- Normal Matrix Stitching Routine --------------- if (NormalStitchedSize >= ReverseStitchedSize)| ... isnan(ReverseStitchedSize) == 1, %Stitch MatrixB to the end of MatrixA StitchedMatrix = cat(1, MatrixA(1:NormalA), MatrixB(NormalB:SizeB)); %Update Stitch Bins if isnan(PrevStitchBins) == 1, %There are no previous stitch bins StitchBins = [NormalA, NormalA + StitchNumber - 1]; else %There are previous stitch bins %Check for Snipped Stitches [SizeStitchBins, Junk] = size(PrevStitchBins); while (PrevStitchBins(SizeStitchBins, 2) > (NormalA - 1)), %Second Bin is snipped from matrix. Check if first bin is snipped. if (PrevStitchBins(SizeStitchBins, 1) > (NormalA - 1)), %First Bin is snipped too. Delete Bin Pair PrevStitchBins = PrevStitchBins(1:(SizeStitchBins-1),:); else %First Bin is not snipped but second bin is snipped %Shrink Stitch Size PrevStitchBins(SizeStitchBins, 2) = NormalA - 1; end; %Calculate size of new PrevStitchBin Matrix [SizeStitchBins, Junk] = size(PrevStitchBins); end; %Insert New StitchBins [SizeStitchBins, Junk] = size(PrevStitchBins); StitchBins = PrevStitchBins; StitchBins(SizeStitchBins + 1, :) = ... [NormalA, NormalA + StitchNumber - 1]; %Check to see if the last two stitches need to be combined [SizeStitchBins, Junk] = size(StitchBins); if StitchBins(SizeStitchBins,1) == ... (StitchBins((SizeStitchBins - 1),2) + 1), %Combine Stitches StitchBins((SizeStitchBins - 1),2) = StitchBins((SizeStitchBins),2); %Shorten StitchBin Matrix StitchBins = StitchBins(1:(SizeStitchBins - 1),:); end; end; end; %--------------------- Reverse Matrix Stitching Routine --------------- if (ReverseStitchedSize >= NormalStitchedSize)| ... isnan(NormalStitchedSize) == 1, %Stitch MatrixA to the end of MatrixB StitchedMatrix = cat(1,MatrixB(1:ReverseB), MatrixA(ReverseA:SizeA)); %Update Stitch Bins if isnan(PrevStitchBins) == 1, %There are no previous stitch bins StitchBins = [ReverseB, ReverseB + StitchNumber - 1]; else %There are previous stitch bins %Check for Snipped Stitches while (PrevStitchBins(1,1) < (ReverseA + StitchNumber - 1)), %First Bin is snipped from matrix. Check if second is snipped if (PrevStitchBins(1,2) < (ReverseA + StitchNumber - 1)), %Second Bin is snipped too. Delete Bad Pair [SizeStitchBins, Junk] = size(PrevStitchBins); PrevStitchBins = PrevStitchBins(2:SizeStitchBins, :); else %Second Bin is not snipped, but first bin is snipped %Shrink Old Stitch Size PrevStitchBins(1,1) = ReverseA + StitchNumber - 1; end; end; %Offset Stitch Bins by inserted amount StitchBins = PrevStitchBins + ReverseB - ReverseA + 1; %Make Room for new StitchBins [SizeStitchBins, Junk] = size(PrevStitchBins); StitchBins(2:SizeStitchBins+1, :) = StitchBins; %Insert New Stitch Bins StitchBins(1,:) = [ReverseB, ReverseB + StitchNumber - 1]; %Combine close stitches if StitchBins(1,2) == StitchBins(2,1) - 1, %Combine Stitches StitchBins(2,1) = StitchBins(1,1); %Shrink Stitch Bins Matrix [SizeStitchBins, Junk] = size(StitchBins); StitchBins = StitchBins(2:SizeStitchBins,:); end; end; end;
function [OutputBinA, OutputBinB]=FindStitchPoint(MatrixA, MatrixB, ... MatchNumber, AdvancedStitchFindEnabled) %Find Stitch Points Function %Revision 1.0 % %By Donald Schelle, May 2005 %Maxim Integrated %160 Rio Robles %Sunnyvale, CA, 94086 % %This function will find the IDEAL stitch point in Matrix B given %the number of data points to match % %Inputs = MatrixA % MatrixB % Number of Records to Match % Advanced Stitch Find Enabled (0 = NO, 1 = YES) %Output = (OutputBinA) End Bin of MatrixA to stitch data % (OutputBinB) Start Bin of Matrix B to stitch data % %If no bins are found, the function will output a NaN %-------------------------------------------------------------------------- %Do argument error checking to see if there is enough arguments if nargin < 2, %The user has not supplied enough arguments disp('Function requires TWO Matrices'); OutputBinA = NaN; OutputBinB = NaN; return; elseif nargin < 3, disp('Select a number of points to match'); OutputBinA = NaN; OutputBinB = NaN; return; elseif nargin == 3, %Advanced code stitching is NOT enabled OutputBinA = NaN; AdvancedStitchFindEnabled=0; end; %Ensure that Matrix A and B are single ROW matrices [row col] = size(MatrixA); if row > col, MatrixA = MatrixA'; end; [row col] = size(MatrixB); if row > col, MatrixB = MatrixB'; end; %Determine Size of Matrices [Junk, SizeA] = size(MatrixA); [Junk, SizeB] = size(MatrixB); %Initialize OutputBinB to NaN (which means that NO stitch points are found) OutputBinB = NaN; %Set initial size of BinA BinA = SizeA - MatchNumber + 1; %Initialize BinStop Variable BinStop = SizeA-100; %Loop to search through Matrix B numerous times. This loop is only %excuted once if Advanced Stitch Find is disabled. The loop will stop when %the 'ideal' stitch point is found while BinA > BinStop, %Stuff the Match Numbers into a separate Matrix MatchMatrix = MatrixA(BinA:BinA+MatchNumber - 1); %Find all bins in MatrixB that match the first number of the Match Matrix MatchedBins = find(MatrixB == MatchMatrix(1)); %Compare the 2nd through nth number of the Match Matrix with the %prospective series of numbers in MatrixB %Calculate the size of the Matched Bins Matrix [Junk, SizeMatchedBins] = size(MatchedBins); %The advanced stitch mode optimizes search time by eliminating %bad stitch points that would result in the final concatenated %matrix being smaller than the last set of stitch points if isnan(OutputBinB) == 0, %A Stitch Point exists from a previous run. Elimiate bad stitch points %Calculate critical Stitch Point MatrixSize = OutputBinA + (SizeB-OutputBinB) + 1; CriticalBin = BinA + SizeB - MatrixSize - 1; %Find maximum number in the MatchMatrix BadBin = find(MatchedBins > CriticalBin); %Eliminate Bad Bins (if there are any) if isempty(BadBin) == 0, MatchedBins = MatchedBins(1:BadBin(1) - 1); end; %Calculate size of new Matched Bins Matrix [Junk, SizeMatchedBins] = size(MatchedBins); end; %loop to cycle through initial matched bins for i=1:SizeMatchedBins, %Check to make sure that there isn't a MatrixB overrun if (MatchedBins(i) + MatchNumber - 1) > SizeB, break; end; %Assume that next few codes will match and set StitchBinGood = true StitchBinGood = 1; %Initialize MatchMatrixCounter Count = 1; %Cycle through MatrixB and compare Numbers with the MatchMatrix for j=MatchedBins(i):(MatchedBins(i) + MatchNumber - 1), if MatchMatrix(Count)==MatrixB(j), %Number is good, continue and check next number Count = Count + 1; else %Number is bad, break loop and try next sequence StitchBinGood = 0; break; end; end; if StitchBinGood == 1, %The optimal (first) stitch has been found %Record the End bin of MatrixA %Record the Start bin of MatrixB OutputBinA = BinA; OutputBinB = MatchedBins(i) + 1; %Calculate the size of the joined Matrix and a new BinStop# BinStop = OutputBinA-OutputBinB+1; break; end; end; if AdvancedStitchFindEnabled == 1, %Advanced Stitch Find is enabled and we should make a new match %matrix and search for these numbers BinA = BinA - 1; else %Advanced Stitch Find is disabled and we should end the loop break; end; end; %Check to see if NO Bins Matched if isnan(OutputBinB) == 1, %NO Bins matched OutputBinA = NaN; end;