Attribute VB_Name = "Module1" Const PI# = 3.14159265358979 '$SUBTITLE:'3 TERM EFFECTIVE BITS ROUTINE' '$PAGE Sub ENOB3T(S#(), SMP%, NBITS%, ANA#, ENC#, EBITS#, AMP#, PHASE#) 'Set up runtine constants M# = SMP% 'NUMBER OF DATA POINTS TSTEP# = 1# / ENC# 'TIME STEP W# = 2# * PI# * ANA# 'ANALOG FREQUENCY IN RADIANS/SEC 'Clear out accumulators SY# = 0 'SUM OF DATA POINTS SA# = 0 'SUM OF COSINES SB# = 0 'SUM OF SINES SAB# = 0 'SUM OF COSINE AND SINE SAA# = 0 'SUM OF COSINE AND COSINE SBB# = 0 'SUM OF SINE AND SINE SYA# = 0 'SUM OF DATA AND COSINE SYB# = 0 'SUM OF DATA AND SINE SYY# = 0 'SUM OF DATA AND DATA 'Integrate equations For I% = 0 To (SMP% - 1) T# = I% * TSTEP# A# = Cos(T# * W#) B# = Sin(T# * W#) SY# = SY# + S#(I%) SA# = SA# + A# SB# = SB# + B# SAB# = SAB# + (A# * B#) SAA# = SAA# + (A# * A#) SBB# = SBB# + (B# * B#) SYA# = SYA# + (S#(I%) * A#) SYB# = SYB# + (S#(I%) * B#) SYY# = SYY# + (S#(I%) * S#(I%)) Next I% 'Calculate error terms YBAR# = SY# / M# 'SAMPLE AVERAGE ABAR# = SA# / M# 'COSINE AVERAGE BBAR# = SB# / M# 'COSINE AVERAGE AN# = ((SYA# - (YBAR# * SA#)) / (SAB# - (BBAR# * SA#))) - ((SYB# - (YBAR# * SB#)) / (SBB# - (BBAR# * SB#))) AD# = ((SAA# - (ABAR# * SA#)) / (SAB# - (BBAR# * SA#))) - ((SAB# - (ABAR# * SB#)) / (SBB# - (BBAR# * SB#))) BN# = ((SYA# - (YBAR# * SA#)) / (SAA# - (ABAR# * SA#))) - ((SYB# - (YBAR# * SB#)) / (SAB# - (ABAR# * SB#))) BD# = ((SAB# - (BBAR# * SA#)) / (SAA# - (ABAR# * SA#))) - ((SBB# - (BBAR# * SB#)) / (SAB# - (ABAR# * SB#))) A# = AN# / AD# B# = BN# / BD# C# = YBAR# - (A# * ABAR#) - (B# * BBAR#) 'Calculate error and formulate ENOB E# = SYY# + (A# * A# * SAA#) + (B# * B# * SBB#) + (M# * C# * C#) - (2# * A# * SYA#) - (2# * B# * SYB#) - (2# * C# * SY#) + (2# * A# * B# * SAB#) + (2# * A# * C# * SA#) + (2# * B# * C# * SB#) ERMS# = ((Abs(E#) / M#)) ^ 0.5 EBITS# = NBITS% - (Log(ERMS# * Sqr(12#)) / Log(2#)) 'Calculate used amplitude and phase AMP# = Sqr((A# * A#) + (B# * B#)) PHASE# = Atn(B# / A#) End Sub '$SUBTITLE:'4 TERM EFFECTIVE BITS ROUTINE' '$PAGE Sub ENOB4T(S#(), SMP%, NBITS%, ANA#, ENC#, EBITS#, AMP#, PHASE#) 'Set up runtine constants FLAG% = 0 'CONVERGENCE FLAG M# = SMP% 'NUMBER OF DATA POINTS TSTEP# = 1# / ENC# 'TIME STEP W# = 2# * PI# * ANA# 'ANALOG FREQUENCY IN RADIANS/SEC OLDPHASE# = PHASE# OLDW# = W# LA: 'Clear out accumulators SA# = 0 'SUM OF COSINES SB# = 0 'SUM OF SINES SY# = 0 'SUM OF DATA POINTS SYA# = 0 'SUM OF DATA AND COSINE SYB# = 0 'SUM OF DATA AND SINE SAB# = 0 'SUM OF COSINE AND SINE SBB# = 0 'SUM OF SINE AND SINE SAA# = 0 'SUM OF COSINE AND COSINE SBTY# = 0 'SUM SINE AND TIME AND POINTS SABT# = 0 'SUM COSINE AND SINE AND POINTS SBBT# = 0 'SUM SINE AND SINE AND POINTS SBBTT# = 0 'SUM SINE AND SINE AND TIME AND TIME SBT# = 0 'SUM SINE AND TIME SAT# = 0 'SUM COSINE AND TIME SBTT# = 0 'SUM SINE AND TIME AND TIME SYY# = 0 'SUM POINT AND POINT 'Integrate equations For I% = 0 To (SMP% - 1) 'HP variable T# = I% 'T T# = T# * TSTEP# X# = T# * W# + PHASE# 'X A# = Cos(X#) 'A B# = Sin(X#) 'B SA# = SA# + A# 'r10 SB# = SB# + B# 'r11 SY# = SY# + S#(I%) 'r12 SYA# = SYA# + (S#(I%) * A#) 'r7 SYB# = SYB# + (S#(I%) * B#) 'r8 SAB# = SAB# + (A# * B#) 'r3 SBB# = SBB# + (B# * B#) 'r2 SAA# = SAA# + (A# * A#) 'r1 SBTY# = SBTY# + (B# * T# * S#(I%)) 'r9 SABT# = SABT# + (A# * B# * T#) 'r4 SBBT# = SBBT# + (B# * B# * T#) 'r5 SBBTT# = SBBTT# + (B# * B# * T# * T#) 'r6 SBT# = SBT# + (B# * T#) 'r13 SAT# = SAT# + (A# * T#) 'r14 SBTT# = SBTT# + (B# * T# * T#) 'r15 SYY# = SYY# + (S#(I%) * S#(I%)) 'r28 Next I% 'Calculate little r terms SA# = SA# / M# SB# = SB# / M# SY# = SY# / M# R16# = SAA# - (SA# * SA# * M#) R17# = SABT# - (SA# * SBT#) R18# = SBBT# - (SB# * SBT#) R19# = SAB# - (SA# * SB# * M#) R20# = SAB# - (SB# * SA# * M#) R21# = SABT# - (SB# * SAT#) R22# = SBBTT# - (SB# * SBTT#) R23# = SBB# - (SB# * SB# * M#) R24# = SYA# - (SY# * SA# * M#) R25# = SYB# - (SY# * SB# * M#) R26# = SBTY# - (SY# * SBT#) R# = (R26# / R24#) - (R17# / R16#) D# = (R25# / R24#) - (R19# / R16#) U# = ((R17# * R21#) - (R16# * R22#)) / (R16# * R16#) P# = ((R17# * R20#) - (R16# * R18#)) / (R16# * R16#) Y# = ((R19# * R21#) - (R16# * R18#)) / (R16# * R16#) Z# = ((R19# * R20#) - (R16# * R23#)) / (R16# * R16#) W# = W# + ((Z# * R#) - (P# * D#)) / (((U# * Z#) - (P# * Y#))) R27# = ((U# * D#) - (Y# * R#)) / ((U# * Z#) - (P# * Y#)) If R27# > 0.17 Then R27# = 0.085 ElseIf R27# < -0.17 Then R27# = -0.085 End If OP# = PHASE# PHASE# = PHASE# + R27# If PHASE# > PI# Then PHASE# = PHASE# - (2# * PI#) If PHASE# < -PI# Then PHASE# = PHASE# + (2# * PI#) If Abs(W# - OLDW#) > (0.1 * OLDW#) Then W# = (OLDW# + W#) / 2# If Abs(PHASE# - OP#) < 0.0000005 Then GoTo ENOBOUT GoTo LA: 'Calculate error and formulate ENOB plus other return parameters ENOBOUT: AMP# = (R24# + R25# + R26#) / (R16# + R19# + R17#) H# = (SY#) - (AMP# * SA#) 'IEEE ERROR CALCULATION ERMS# = SYY# / M# ERMS# = ERMS# + (H# * H#) ERMS# = ERMS# - (2# * H# * SY#) ERMS# = ERMS# + (2# * AMP# * H# * SA#) ERMS# = ERMS# + (AMP# * AMP# * SAA# / M#) ERMS# = ERMS# - (2# * AMP# * SYA# / M#) ERMS# = Sqr(Abs(ERMS#)) 'Error to bits EBITS# = NBITS% - (Log(ERMS# * Sqr(12#)) / Log(2#)) ANA# = W# / (2# * PI#) 'W#= End Sub '$SUBTITLE:'4 TERM EFFECTIVE BITS ROUTINE WITH LIMITER '$PAGE Sub ENOB4TL(S#(), SMP%, NBITS%, ANA#, ENC#, EBITS#, AMP#, PHASE#, LMT%) 'Set up runtine constants FLAG% = 0 'CONVERGENCE FLAG M# = SMP% 'NUMBER OF DATA POINTS TSTEP# = 1# / ENC# 'TIME STEP W# = 2# * PI# * ANA# 'ANALOG FREQUENCY IN RADIANS/SEC OLDPHASE# = PHASE# OLDW# = W# LOOPS% = 0 LAL: 'Clear out accumulators SA# = 0 'SUM OF COSINES SB# = 0 'SUM OF SINES SY# = 0 'SUM OF DATA POINTS SYA# = 0 'SUM OF DATA AND COSINE SYB# = 0 'SUM OF DATA AND SINE SAB# = 0 'SUM OF COSINE AND SINE SBB# = 0 'SUM OF SINE AND SINE SAA# = 0 'SUM OF COSINE AND COSINE SBTY# = 0 'SUM SINE AND TIME AND POINTS SABT# = 0 'SUM COSINE AND SINE AND POINTS SBBT# = 0 'SUM SINE AND SINE AND POINTS SBBTT# = 0 'SUM SINE AND SINE AND TIME AND TIME SBT# = 0 'SUM SINE AND TIME SAT# = 0 'SUM COSINE AND TIME SBTT# = 0 'SUM SINE AND TIME AND TIME SYY# = 0 'SUM POINT AND POINT 'Integrate equations For I% = 0 To (SMP% - 1) 'HP variable T# = I% 'T T# = T# * TSTEP# X# = T# * W# + PHASE# 'X A# = Cos(X#) 'A B# = Sin(X#) 'B SA# = SA# + A# 'r10 SB# = SB# + B# 'r11 SY# = SY# + S#(I%) 'r12 SYA# = SYA# + (S#(I%) * A#) 'r7 SYB# = SYB# + (S#(I%) * B#) 'r8 SAB# = SAB# + (A# * B#) 'r3 SBB# = SBB# + (B# * B#) 'r2 SAA# = SAA# + (A# * A#) 'r1 SBTY# = SBTY# + (B# * T# * S#(I%)) 'r9 SABT# = SABT# + (A# * B# * T#) 'r4 SBBT# = SBBT# + (B# * B# * T#) 'r5 SBBTT# = SBBTT# + (B# * B# * T# * T#) 'r6 SBT# = SBT# + (B# * T#) 'r13 SAT# = SAT# + (A# * T#) 'r14 SBTT# = SBTT# + (B# * T# * T#) 'r15 SYY# = SYY# + (S#(I%) * S#(I%)) 'r28 Next I% 'Calculate little r terms SA# = SA# / M# SB# = SB# / M# SY# = SY# / M# R16# = SAA# - (SA# * SA# * M#) R17# = SABT# - (SA# * SBT#) R18# = SBBT# - (SB# * SBT#) R19# = SAB# - (SA# * SB# * M#) R20# = SAB# - (SB# * SA# * M#) R21# = SABT# - (SB# * SAT#) R22# = SBBTT# - (SB# * SBTT#) R23# = SBB# - (SB# * SB# * M#) R24# = SYA# - (SY# * SA# * M#) R25# = SYB# - (SY# * SB# * M#) R26# = SBTY# - (SY# * SBT#) R# = (R26# / R24#) - (R17# / R16#) D# = (R25# / R24#) - (R19# / R16#) U# = ((R17# * R21#) - (R16# * R22#)) / (R16# * R16#) P# = ((R17# * R20#) - (R16# * R18#)) / (R16# * R16#) Y# = ((R19# * R21#) - (R16# * R18#)) / (R16# * R16#) Z# = ((R19# * R20#) - (R16# * R23#)) / (R16# * R16#) W# = W# + ((Z# * R#) - (P# * D#)) / (((U# * Z#) - (P# * Y#))) R27# = ((U# * D#) - (Y# * R#)) / ((U# * Z#) - (P# * Y#)) If R27# > 0.17 Then R27# = 0.085 ElseIf R27# < -0.17 Then R27# = -0.085 End If OP# = PHASE# PHASE# = PHASE# + R27# If PHASE# > PI# Then PHASE# = PHASE# - (2# * PI#) If PHASE# < -PI# Then PHASE# = PHASE# + (2# * PI#) If Abs(W# - OLDW#) > (0.1 * OLDW#) Then W# = (OLDW# + W#) / 2# LOOPS% = LOOPS% + 1 If LOOPS% >= LMT% Then GoTo ENOBOUTL If Abs(PHASE# - OP#) < 0.0000005 Then GoTo ENOBOUTL GoTo LAL: 'Calculate error and formulate ENOB plus other return parameters ENOBOUTL: AMP# = (R24# + R25# + R26#) / (R16# + R19# + R17#) H# = (SY#) - (AMP# * SA#) 'IEEE ERROR CALCULATION ERMS# = SYY# / M# ERMS# = ERMS# + (H# * H#) ERMS# = ERMS# - (2# * H# * SY#) ERMS# = ERMS# + (2# * AMP# * H# * SA#) ERMS# = ERMS# + (AMP# * AMP# * SAA# / M#) ERMS# = ERMS# - (2# * AMP# * SYA# / M#) ERMS# = Sqr(Abs(ERMS#)) 'Error to bits EBITS# = NBITS% - (Log(ERMS# * Sqr(12#)) / Log(2#)) ANA# = W# / (2# * PI#) 'W#= LMT% = LOOPS% End Sub