2727
2828groups_example = dict ( one = (1 ,1 ), two = (1 ,1 ), fam = (2 ,4 ), fren = (3 ,5 ) )
2929
30+ # Disable printing of details unless something goes wrong...
31+ print_NOOP = lambda * args , ** kwds : None
32+ print = print_NOOP
3033
3134def noise ( mag ):
3235 return mag * ( random .random () * 2 - 1 )
@@ -200,7 +203,7 @@ def test_recover_bip39():
200203 details_slip39 = create (
201204 "bip39 recovery test -- all ones in SLIP-39" , 2 , groups_example , SEED_ONES ,
202205 )
203- print ( json .dumps ( details_slip39 .groups , indent = 4 ))
206+ # print( json.dumps( details_slip39.groups, indent=4 ))
204207 assert details_slip39 .groups == {
205208 "one" : (
206209 1 ,
@@ -493,10 +496,12 @@ def test_signal_draw():
493496 # a DFT so that the recovered signal is produced at a higher sample rate. This allows us to
494497 # analyze a signal in 8-bit values, but produce a recovered signal over 2x 4-bit hex nibbles, or
495498 # 8x 1-bit bits.
496- print ()
497- print ( '' .join ( signal_draw ( s ) for s in range ( - 128 , 128 )))
498- print ( '' .join ( signal_draw ( s , pos = True ) for s in range ( - 128 , 128 )))
499- print ( '' .join ( signal_draw ( s , neg = True ) for s in range ( - 128 , 128 )))
499+ assert '' .join ( signal_draw ( s ) for s in range ( - 128 , 128 )) \
500+ == ',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.....................................____________________________________~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' """"""""""""""""""""""""""""""""""""'
501+ assert '' .join ( signal_draw ( s , pos = True ) for s in range ( - 128 , 128 )) \
502+ == ' ,,,,,,,,,,,,,,,,,,,..................__________________~~~~~~~~~~~~~~~~~~~‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' """"""""""""""""""'
503+ assert '' .join ( signal_draw ( s , neg = True ) for s in range ( - 128 , 128 )) \
504+ == ',,,,,,,,,,,,,,,,,,..................__________________~~~~~~~~~~~~~~~~~~~‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' \' """"""""""""""""""" '
500505
501506 for entropy in (
502507 SEED_HIGH , SEED_MID , SEED_LOW ,
@@ -529,10 +534,25 @@ def test_signal_draw():
529534 print ( "Signal from DFT x 8 deduced (for bin output):" )
530535 sigR8 = signal_recover_real ( dfts , scale = 8 , integer = True )
531536 print ( f"{ entropy_bin } " )
532- print ( '' .join ( signal_draw ( s ) * 8 for s in sigR ) + " (low-frequency, expanded x8)" )
533- print ( '' .join ( signal_draw ( s ) for s in sigR8 ) + " (scaled x8)" )
534- print ( '' .join ( signal_draw ( s , neg = False ) for s in sigR8 ))
535- print ( '' .join ( signal_draw ( s , neg = True ) for s in sigR8 ))
537+ sigRx8_1 = '' .join ( signal_draw ( s ) * 8 for s in sigR ) + " (low-frequency, expanded x8)"
538+ print ( sigRx8_1 )
539+ sigR8_1 = '' .join ( signal_draw ( s ) for s in sigR8 ) + " (scaled x8)"
540+ print ( sigR8_1 )
541+ sigR8_pos = '' .join ( signal_draw ( s , neg = False ) for s in sigR8 )
542+ print ( sigR8_pos )
543+ sigR8_neg = '' .join ( signal_draw ( s , neg = True ) for s in sigR8 )
544+ print ( sigR8_neg )
545+
546+ # Validate the very last set of renderings
547+ assert sigRx8_1 \
548+ == '""""""""\' \' \' \' \' \' \' \' ~~~~~~~~........,,,,,,,,........~~~~~~~~\' \' \' \' \' \' \' \' """"""""\' \' \' \' \' \' \' \' ~~~~~~~~........,,,,,,,,........~~~~~~~~\' \' \' \' \' \' \' \' """"""""\' \' \' \' \' \' \' \' ~~~~~~~~........,,,,,,,,........~~~~~~~~\' \' \' \' \' \' \' \' """"""""\' \' \' \' \' \' \' \' ~~~~~~~~........,,,,,,,,........~~~~~~~~\' \' \' \' \' \' \' \' (low-frequency, expanded x8)'
549+ assert sigR8_1 \
550+ == '""""""""\' \' \' \' ‾‾‾~~~___....,,,,,,,,,,,,,,,....___~~~‾‾‾\' \' \' \' """""""""""""""\' \' \' \' ‾‾‾~~~___....,,,,,,,,,,,,,,,....___~~~‾‾‾\' \' \' \' """""""""""""""\' \' \' \' ‾‾‾~~~___....,,,,,,,,,,,,,,,....___~~~‾‾‾\' \' \' \' """""""""""""""\' \' \' \' ‾‾‾~~~___....,,,,,,,,,,,,,,,....___~~~‾‾‾\' \' \' \' """"""" (scaled x8)'
551+ assert f"{ sigR8_pos } \n { sigR8_neg } " \
552+ == '''\
553+ """"""''‾‾~~__.,, ,,.__~~‾‾''"""""""""""''‾‾~~__.,, ,,.__~~‾‾''"""""""""""''‾‾~~__.,, ,,.__~~‾‾''"""""""""""''‾‾~~__.,, ,,.__~~‾‾''"""""
554+ "''‾~~__..,,,,,,,,,,,..__~~‾''" "''‾~~__..,,,,,,,,,,,..__~~‾''" "''‾~~__..,,,,,,,,,,,..__~~‾''" "''‾~~__..,,,,,,,,,,,..__~~‾''" \
555+ '''
536556
537557
538558def test_denoise_mags ():
@@ -541,7 +561,14 @@ def test_denoise_mags():
541561 symbols = 32
542562 stride = 8
543563 threshold = 200 / 100
544- for npct in range ( 10 ):
564+
565+ # Test thru some percentage signal to noise; too high, and we'll overflow our symbols
566+ noise_pct = 40
567+
568+ snr_dB_strides = {}
569+ for npct in range ( noise_pct ):
570+ print ()
571+ print ( f"For { npct :2d} % noise:" )
545572 seed_noisy = [ 128 + noise ( 128 * npct / 100 ) for _ in range ( symbols ) ] # median 1% noise floor
546573 for i in range ( len ( seed_noisy )):
547574 seed_noisy [i ] += math .cos ( math .pi * 2 * i / (32 / 16 ) ) * 16 # max frequency bin
@@ -570,6 +597,14 @@ def test_denoise_mags():
570597 signal = signal_entropy ( SEED_NOISY , stride = stride , symbols = symbols , threshold = threshold )
571598 print ( f"{ signal } " )
572599
600+ snr_dB_strides [npct ] = (signal .dB , signal .stride )
601+
602+ for npct ,(dB ,stride ) in snr_dB_strides .items ():
603+ print ( f"{ npct :02d} %: { stride :2d} bits/symbol, at { dB :7.2f} dB" )
604+
605+ # We should find the signal at all these noise levels
606+ assert all ( dBS [1 ] == 8 for dBS in snr_dB_strides .values () )
607+
573608
574609def test_signal_entropy ():
575610 # See if we can detect patterns of bits in various frequency bins. With 8x 8-bit real-valued
@@ -584,7 +619,6 @@ def test_signal_entropy():
584619 #
585620 # We can estimate what perfect noise looks like across all energy bins, and compare our signal
586621 # against that baseline. So, our signal has some noise added to it.
587-
588622 print ()
589623 SEED_SINE = bytes ([
590624 # 255, 255, 255, 255,
0 commit comments