orion-sdr 0.0.49

DSP/SDR block library targeting HF-to-EHF, satellites, and Python bindings. Roadmap inside.
Documentation
+
�Y\j�2c���Rt^RIt^RIHuHt^RIt^RI	t	^RI
tRt^@t
^tRRltRtRRRllt!RR	4t!R
R4tRR
lt!RR4t!RR4t!RR4tR#)u�Tests for OFDM Python bindings (Phase 9 / Release I).

All tests are noiseless / synthetic — no hardware or RF noise required.
Ngp�@c�8�V^8�dQhR\P/#)��return��np�ndarray)�formats"�5/Users/glenn/work/orion-sdr/python/tests/test_ofdm.py�__annotate__r	s��X�X��
�
�X�c	���\^,p\P!\\	^V44\\	V^,
)^44,\P
R7#)r��dtype)�N_FFTr�array�list�range�int32)�halfs r�_data_carriersrsB���A�:�D�
�8�8�D��q�$��(�4���q��k�1�0E�+F�F�b�h�h�W�Wr
c��\P!^\PR7\P!^\PR73#)�r)r�zerosr�	complex64�r
r�
_no_pilotsrs0��
����"�(�(�#�
����"�,�,�'��r
c�4�V^8�dQhR\R\RR/#)r�
constellation�rf_hzrzsdr.OfdmConfig)�str�float)rs"rr	r	s"����3����@P�r
c�~�\4wr#\P!\\\4VV\VRV4	#)��?)r�sdr�
OfdmConfigr�CP_LENr�FS)rr�	pilot_idx�	pilot_vals&&  r�_configr(s;��%�<��I��>�>�
������
�
���
�
r
c�8a�]tRt^/toRtRtRtRtRtVt	R#)�TestOfdmConfigc���\4pVPp^q2V8�qD'g�\P!R
V3RW#34RR\P
!49g\P!V4'd\P!V4MRR\P!V4R\P!V4/,pRRV/,p\\P!V44hR;p;rCVPp\\,qrV8HqD'Eg]\P!RV3RW'34RR\P
!49g\P!V4'd\P!V4MRR\P!V4RR	\P
!49g!\P!\4'd\P!\4MR	RR
\P
!49g!\P!\4'd\P!\4MR
/,pRRV/,p	\\P!V	44hR;p;rGR#)r�py0�cfg�py2�py5�assert %(py7)s�py7N�py4rr$�assert %(py8)s�py8��>)z;%(py2)s
{%(py2)s = %(py0)s.bits_per_ofdm_symbol
} > %(py5)s��==)zK%(py2)s
{%(py2)s = %(py0)s.samples_per_ofdm_symbol
} == (%(py4)s + %(py5)s))
r(�bits_per_ofdm_symbol�
@pytest_ar�_call_reprcompare�@py_builtins�locals�_should_repr_global_name�	_saferepr�AssertionError�_format_explanation�samples_per_ofdm_symbolrr$)
�selfr-�@py_assert1�@py_assert4�@py_assert3�@py_format6�@py_format8�@py_assert6�@py_format7�@py_format9s
&         r�test_basic_construction�&TestOfdmConfig.test_basic_construction0s5���i���'�'�+�!�+�!�+�+�+�+�+�'�+�+�+�+�+�+�s�+�+�+�+�s�+�+�+�'�+�+�+�!�+�+�+�+�+�+�+�+��*�*�<�e�f�n�<�n�<�<�<�<�<�*�<�<�<�<�<�<�s�<�<�<�<�s�<�<�<�*�<�<�<�<�<�<�e�<�<�<�<�e�<�<�<�<�<�<�<�f�<�<�<�<�f�<�<�<�<�<�<�<�<r
c
���\R4p\R4pVPp^qAPqTV,qcV8Hqw'Eg+\P!RV3R
W634RR\P
!49g\P!V4'd\P!V4MRR\P!V4R\P!V4RR\P
!49g\P!V4'd\P!V4MRR\P!V4/,pR	R
V/,p	\\P!V	44hR;p;p;p;rVR#)�qpsk�qam16r,�	cfg_qam16r.r/�py6�cfg_qpskr4zassert %(py11)s�py11Nr7)zr%(py2)s
{%(py2)s = %(py0)s.bits_per_ofdm_symbol
} == (%(py5)s * %(py8)s
{%(py8)s = %(py6)s.bits_per_ofdm_symbol
}))
r(r9r:r;r<r=r>r?r@rA)
rCrSrQrDrE�@py_assert7�@py_assert9rF�@py_format10�@py_format12s
&         r�*test_bits_per_symbol_matches_constellation�9TestOfdmConfig.test_bits_per_symbol_matches_constellation5s����6�?���G�$�	��-�-�R��R�5R�5R�R�5R�1R�R�1R�R�R�R�R�R�-�R�R�R�R�R�R�y�R�R�R�R�y�R�R�R�-�R�R�R��R�R�R�R�R�R�X�R�R�R�R�X�R�R�R�5R�R�R�R�R�R�R�R�R�Rr
c
�
�\4wr\P!\\34;_uu_4\
P!\\\4W\RRR4	RRR4R# +'giR#;i)�r!znot-a-real-constellationN)r�pytest�raises�
ValueError�	Exceptionr"r#rr$rr%�rCr&r's&  r�!test_unknown_constellation_raises�0TestOfdmConfig.test_unknown_constellation_raises:sQ��)�|��	�
�]�]�J�	�2�
3�
3��N�N��v�~�/���C��8�
�4�
3�
3�
3�s�2A1�1B	c
��\P!^.\PR7p\P!R.\PR7p\P
!\\34;_uu_4\P!\\\4W\RRR4	RRR4R# +'giR#;i)�rr!r\rON��?)rrrrr]r^r_r`r"r#rr$rr%ras&  r�test_invalid_plan_raises�'TestOfdmConfig.test_invalid_plan_raisesBsr���H�H�a�S����1�	��H�H�j�\����>�	�
�]�]�J�	�2�
3�
3��N�N��v�~�/���C��f�
�4�
3�
3�
3�s�72B3�3C	rN)
�__name__�
__module__�__qualname__�__firstlineno__rLrYrbrg�__static_attributes__�__classdictcell__��
__classdict__s@rr*r*/s����=�
S�
��r
r*c�8a�]tRt^QtoRtRtRtRtRtVt	R#)�TestOfdmRoundtripc�6�\4p\P!V4p\P!VP
\PR7pVPV4pVPqQP3qeV8Hqw'g�\P!R
V3RWV34RR\P!49g\P!V4'd\P!V4MRR\P!V4R\P!V4/,pRRV/,p	\!\P"!V	44hR;p;rvVP$p\P&q�V
8Hqw'Eg\P!R
V3RWZ34RR\P!49g\P!V4'd\P!V4MRR\P!V4RR	\P!49g!\P!\4'd\P!\4MR	R
\P!V
4/,pRRV/,p\!\P"!V44hR;p;rzR#)rr,�iqr.r/r0r1Nr2rrRr3r4r7�z-%(py2)s
{%(py2)s = %(py0)s.shape
} == %(py5)s�zL%(py2)s
{%(py2)s = %(py0)s.dtype
} == %(py6)s
{%(py6)s = %(py4)s.complex64
})r(r"�OfdmModrrr9�uint8�modulate�shaperBr:r;r<r=r>r?r@rAr
r)
rCr-�mod�bitsrtrDrErFrGrH�@py_assert5rJrKs
&            r�test_mod_shape� TestOfdmRoundtrip.test_mod_shapeRsR���i���k�k�#����x�x��0�0����A��
�\�\�$�
���x�x�9�7�7�9�9�9�9�9�9�9�9�x�9�9�9�9�9�9�r�9�9�9�9�r�9�9�9�x�9�9�9�9�9�9�9�9�9�9�9�9��x�x�'�2�<�<�'�<�'�'�'�'�'�x�'�'�'�'�'�'�r�'�'�'�'�r�'�'�'�x�'�'�'�'�'�'�2�'�'�'�'�2�'�'�'�<�'�'�'�'�'�'�'�'r
c�	�\R4p^pVPp\PP	R4pVP^^W#,\PR7p\P!V4pVPV4pVPp\Pq�V	8Hq�'Eg\P!RV
3RW�34RR\P!49g\P !V4'd\P"!V4MRR\P"!V4RR\P!49g!\P !\4'd\P"!\4MRR\P"!V	4/,pR	R
V/,p\%\P&!V44hR;p;r�VP(q�VP*,3q�V
8Hq�'g�\P!RV
3RW�34RR\P!49g\P !V4'd\P"!V4MRR\P"!V4R\P"!V
4/,pR
RV/,p\%\P&!V44hR;p;r�\P,!V4pVP*p\P.!^\PR7p\1V4FDpVVV,V^,V,p\P2!VVP5V4.4pKF	VPp\Pq�V	8Hq�'Eg\P!RV
3RW�34RR\P!49g\P !V4'd\P"!V4MRR\P"!V4RR\P!49g!\P !\4'd\P"!\4MRR\P"!V	4/,pR	R
V/,p\%\P&!V44hR;p;r�\P6P9VV4R#)rOi���sizer
r,rtr.r2rrRr3r4Nr/r0r1r�bits_outr7rvru)zH%(py2)s
{%(py2)s = %(py0)s.dtype
} == %(py6)s
{%(py6)s = %(py4)s.uint8
})r(r9r�random�default_rng�integersrxr"rwryr
rr:r;r<r=r>r?r@rArzrB�	OfdmDemodrr�concatenate�
demodulate�testing�assert_array_equal)rCr-�	n_symbols�bps�rng�bits_inr{rtrDr}rFrJrKrErGrH�demod�spsr��s�chunks&                    r�test_roundtrip_qpsk_noiseless�/TestOfdmRoundtrip.test_roundtrip_qpsk_noiselessZs����f�o���	��&�&���i�i�#�#�D�)���,�,�q�!�)�/����,�J���k�k�#���
�\�\�'�
"���x�x�'�2�<�<�'�<�'�'�'�'�'�x�'�'�'�'�'�'�r�'�'�'�'�r�'�'�'�x�'�'�'�'�'�'�2�'�'�'�'�2�'�'�'�<�'�'�'�'�'�'�'�'��x�x�E��(C�(C�C�E�E�E�E�E�E�E�E�x�E�E�E�E�E�E�r�E�E�E�E�r�E�E�E�x�E�E�E�E�E�E�E�E�E�E�E�E��
�
�c�"���)�)���8�8�A�R�X�X�.���y�!�A��q�3�w��A���}�-�E��~�~�x��1A�1A�%�1H�&I�J�H�"��~�~�)����)��)�)�)�)�)�~�)�)�)�)�)�)�x�)�)�)�)�x�)�)�)�~�)�)�)�)�)�)��)�)�)�)��)�)�)��)�)�)�)�)�)�)�)�
�
�
�%�%�h��8r
c��\R4p^pVPp\PP	R4pVP^^W#,\PR7p\P!V4pVPV4p\P!V4pVPp	\P!^\PR7p
\V4FBpW{V	,V^,V	,p\P!W�PV4.4p
KD	\P P#W�4R#)rPi.r�rN)r(r9rr�r�r�rxr"rwryr�rBrrr�r�r�r�)
rCr-r�r�r�r�r{rtr�r�r�r�r�s
&            r�test_roundtrip_qam16_noiseless�0TestOfdmRoundtrip.test_roundtrip_qam16_noiselessqs����g����	��&�&���i�i�#�#�D�)���,�,�q�!�)�/����,�J���k�k�#���
�\�\�'�
"���
�
�c�"���)�)���8�8�A�R�X�X�.���y�!�A��3�w��A���}�-�E��~�~�x�1A�1A�%�1H�&I�J�H�"�	�
�
�%�%�h�8r
c	�:�\4p\P!V4p\P!\
\34;_uu_4VP\P!^\PR74RRR4R# +'giR#;i)�rN)r(r"r�r]r^r_r`r�rrr)rCr-r�s&  r�test_demod_too_short_raises�-TestOfdmRoundtrip.test_demod_too_short_raises�sW���i���
�
�c�"��
�]�]�J�	�2�
3�
3����R�X�X�a�r�|�|�<�=�4�
3�
3�
3�s�	6B	�	B	rN)
rirjrkrlr~r�r�r�rmrnros@rrrrrQs����(�9�.9�(>�>r
rrc�x�V^8�dQhR\PR\PR\P/#)rrt�tapsrr)rs"rr	r	�s-��$�$�2�:�:�$�R�Z�Z�$�B�J�J�$r
c��\P!W4R\V4pVP\P4#)z�Causal FIR channel; taps[0] is the direct path. Delay spread
(len(taps)-1) must stay within cp_len for the per-bin equalizer to hold.N)r�convolve�len�astyper)rtr��outs&& r�_apply_fir_channelr��s0��
�+�+�b�
�	�#�b�'�
*�C��:�:�b�l�l�#�#r
c�8a�]tRt^�toRtRtRtRtRtVt	R#)�TestOfdmEqualizerc���\4p\P!\\34;_uu_4\
P!VR4RRR4R# +'giR#;i)znot-a-real-equalizerN)r(r]r^r_r`r"r�)rCr-s& r�test_unknown_equalizer_raises�/TestOfdmEqualizer.test_unknown_equalizer_raises�s;���i��
�]�]�J�	�2�
3�
3��M�M�#�5�6�4�
3�
3�
3�s�A�A&	c�p�\P!^
R	.\PR7p\P!R
R
.\PR7p\^,p\\
^V44\\
V^,
)^44,Uu.uFpVR9gKVNK	pp\P!\\\P!V\PR7W\RRR4	p^pVPp\PPR4p	V	P^^Wx,\PR7p
\P !V4pVP#V
4p\P$!VR4p
VP&p\P(!^\PR7p\
V4FCpVVV,V^,V,p\P*!W�P-V4.4pKE	\P.P1W�4R#uupi)�
rr!r\rOi�r��pilot_interpN�����rf)r�r�)rrrrrrrr"r#r$r%r9r�r�r�rxrwryr�rBrr�r�r�r�)rCr&r'r�c�datar-r�r�r�r�r{rtr�r�r�r�r�s&                 r�0test_pilot_interp_constructs_and_roundtrips_flat�BTestOfdmEqualizer.test_pilot_interp_constructs_and_roundtrips_flat�s����H�H�b�#�Y�b�h�h�7�	��H�H�j�*�5�R�\�\�J�	���z����a���/�$�u�t�a�x�[�!�7L�2M�M�'�M�a��I�%���M��'��n�n��6�2�8�8�D����9��"�c�3��
��
�	��&�&���i�i�#�#�D�)���,�,�q�!�)�/����,�J���k�k�#���
�\�\�'�
"���
�
�c�>�2���)�)���8�8�A�R�X�X�.���y�!�A��q�3�w��A���}�-�E��~�~�x�1A�1A�%�1H�&I�J�H�"�	�
�
�%�%�h�8��-'s�	H3�%H3c
�h�\R4p^^ r2VPp^pVPp\PP^c4pVP
^^WV,\PR7p\P!V4p	V	PV4p
\P!WV\\4p\P!W�.4P\P 4p\P"!.RO\P R7p
\%V
4p^q�V,
pV\8*pV'Egx\&P(!RV3RV\34RR\*P,!49g!\&P.!\$4'd\&P0!\$4MRRR\*P,!49g\&P.!V
4'd\&P0!V
4MRR\&P0!V4R\&P0!V4R	R
\*P,!49g!\&P.!\4'd\&P0!\4MR
/,pRRV/,p\3\&P4!V44hR
;p;p;pp\7W�4pW#,pVVVV,p\P8!VR4pVP;V4VV,p\P<!^\PR7p\?V4FRpVVVV,,VV^,V,,p\P!VVPAV4.4pKT	\PBPEVV4R
#)rPr�rr,r��py1r��py3r/r4r$zassert %(py10)s�py10N�training_symbol�y�������?�������?yy�?333333ÿ)�<=)z<(%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} - %(py5)s) <= %(py8)s)#r(rBr9rr�r�r�rxr"rwry�generate_ofdm_preamblerr$r�r�rrr�r:r;r<r=r>r?r@rAr�r��estimate_channelrrr�r�r�)rCr-�num_repeats�
repeat_lenr�r�r�r�r�r{�data_iq�preamble_iq�cleanr��@py_assert2rErIrUrK�@py_format11�	channeled�training_start�training_iqr��
data_startr�r�r�s&                           r�/test_training_symbol_estimate_channel_multipath�ATestOfdmEqualizer.test_training_symbol_estimate_channel_multipath�sU���g���"#�R�Z��)�)���	��&�&���i�i�#�#�B�'���,�,�q�!�)�/����,�J���k�k�#����,�,�w�'���0�0��j�%��
������5�6�=�=�b�l�l�K���x�x�>�b�l�l�S���4�y�&�1�&�1�}�&�}��&�&�&�&�&�}��&�&�&�&�&�&�s�&�&�&�&�s�&�&�&�&�&�&�&�4�&�&�&�&�4�&�&�&�y�&�&�&�1�&�&�&�&�&�&��&�&�&�&��&�&�&�&�&�&�&�&�&�u�3�	�$�1����~��/C�D���
�
�c�#4�5��
���{�+�#�c�)�
��8�8�A�R�X�X�.���y�!�A��j�1�s�7�2�:��Q��#�
�3M�N�E��~�~�x��1A�1A�%�1H�&I�J�H�"�	�
�
�%�%�h��8r
c��aaaaa�\R4o^^ r!SPoSPp\PP^4pVP
^^^V,\PR7p\P!S4pVPV4p\P!SW\\4p\P!W�.4P\P 4p	\P"!.RO\P R7p
\%W�4oW,pSW�S,oVS,oRVVVVV3Rllp\'\P(!V!R4V8g44p
^q�V8�q�'g�\*P,!RV3RW�34RR\.P0!49g\*P2!V
4'd\*P4!V
4MRR\*P4!V4/,p\*P6!R	4R
,RV/,p\9\*P:!V44hR;r�\P<P?V!R
4V4R#)rPr�rc�D�V^8�dQhR\R\P/#)r�estimater)�boolrr)rs"rr	�MTestOfdmEqualizer.test_estimate_channel_is_load_bearing.<locals>.__annotate__s��	�	��	�"�*�*�	r
c�t<�\P!SR4pV'dVPS	4\P!^\P
R7p\
^4FQpSSVS,,SV^,S,,p\P!W!PV4.4pKS	V#)r�r)	r"r�r�rrrxrr�r�)
r�r�r�r�r�r-r�r�r�r�s
&    �����r�
demod_bits�KTestOfdmEqualizer.test_estimate_channel_is_load_bearing.<locals>.demod_bitss�����M�M�#�'8�9�E���&�&�{�3��(�(�1�B�H�H�-�C��1�X��!�*�q�3�w�"6�z�Q��U�c�M�7Q�R���n�n�c�+;�+;�E�+B�%C�D����Jr
Fr,�
errors_no_estr�z6multipath with no channel estimate should corrupt bitsz
>assert %(py5)sr/NTr�r5)z%(py0)s > %(py3)s) r(rBr9rr�r�r�rxr"rwryr�rr$r�r�rrr��int�
count_nonzeror:r;r<r=r>r?�_format_assertmsgr@rAr�r�)rCr�r�r�r�r�r{r�r�r�r�r�r�r�r�rD�@py_format4rGr-r�r�r�r�s&                 @@@@@r�%test_estimate_channel_is_load_bearing�7TestOfdmEqualizer.test_estimate_channel_is_load_bearing�s�����g���"#�R�Z��)�)���&�&���i�i�#�#�A�&���,�,�q�!�!�c�'����,�B���k�k�#����,�,�w�'���0�0���%��
������5�6�=�=�b�l�l�K���x�x�>�b�l�l�S��&�u�3�	�$�1�����/C�D��#�c�)�
�	�	��B�,�,�Z��->�'�-I�J�K�
� �Z�q� �Z�Z�Z�Z�}�Z�Z�Z�Z�Z�Z�}�Z�Z�Z�Z�}�Z�Z�Z�q�Z�Z�Z�Z�"Z�Z�Z�Z�Z�Z�Z�Z�	�
�
�%�%�j��&6��@r
rN)
rirjrkrlr�r�r�r�rmrnros@rr�r��s"����7�
9�@)9�V)A�)Ar
r�c�,a�]tRtRtoRtRtRtVtR#)�TestOfdmSyncic��\4p^^ r2\P!WV4p^2p\P!V\P
R7p\P!Wd\P!^@\P
R7.4p\P!V\W#^\V44p\V4p^q�V	8�q�'Eg\P!RV
3RW�34RR\P!49g!\P!\4'd\P!\4MRRR\P!49g\P!V4'd\P!V4MRR\P!V4R\P!V	4/,pRR	V/,p\!\P"!V44hR
;p;r�V^,p
V
R,q�V8Hq�'g�\P!RV3RW�34R\P!V4RR\P!49g\P!V4'd\P!V4MR/,pR
RV/,p\!\P"!V44hR
;r�V
R,pRpVV8�q�'gz\P!RV3RVV34R\P!V4R\P!V4/,pRRV/,p\!\P"!V44hR
;p;ppR
#)r�rr,r�r��resultsr�rRr3r4N�start_sample�time_offsetzassert %(py5)sr/�scoreg�������?r2�assert %(py6)sr5)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sr7)z%(py1)s == %(py3)s)z%(py1)s > %(py4)s)r(r"r�rrrr��	ofdm_syncr%r�r:r;r<r=r>r?r@rA)rCr-r�r�r�r��bufr�r�r}rErJrK�best�@py_assert0r�rGrF�@py_format5s&                  r�test_finds_known_offset�$TestOfdmSync.test_finds_known_offsets����i��"#�R�Z��0�0��:�N�����h�h�{�"�,�,�7���n�n�c�����2�<�<�0P�Q�R���-�-��R��!�S��X�N���7�|��a��a������|�������s�����s��������7�����7����|����a����������q�z���N�#�2�{�2�2�2�2�2�#�2�2�2�#�2�2�2�2�2�2�{�2�2�2�2�{�2�2�2�2�2�2�2�2��G�}�"�s�"�}�s�"�"�"�"�"�}�s�"�"�"�}�"�"�"�s�"�"�"�"�"�"�"�"r
c�\�\4p?\P!R\PR7p\P
!V\^^ ^\V44p\V\4qD'Eg9RRR\P!49g!\P!\4'd\P!\4MRRR\P!49g\P!V4'd\P!V4MRRR\P!49g!\P!\4'd\P!\4MRR	\P!V4/,p\\P !V44hR
pR
#)i�rz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r,�
isinstancer�r�r.rr2N)r(rrrr"r�r%r�r�rr<r=r:r>r?r@rA)rCr-rtr�rFr�s&     r�test_empty_on_silence�"TestOfdmSync.test_empty_on_silence*s����i���
�X�X�d�"�,�,�
/���-�-��B��2�q�#�b�'�:���'�4�(�(�(�(�(�(�(�(�(�z�(�(�(�(�z�(�(�(�(�(�(�(�'�(�(�(�(�'�(�(�(�(�(�(�(�4�(�(�(�(�4�(�(�(�(�(�(�(�(�(�(r
rN)rirjrkrlr�r�rmrnros@rr�r�s����
#�)�)r
r�c�&a�]tRtRtoRtRtVtR#)�TestOfdmRxFramei6c	��\R4p^pVPp\PP	^*4pVP^^W#,\PR7p\P!V4pVPV4p\P!V4pVPp	.p
\P!^\PR7p\V4FWpW|V	,V^,V	,p
VPV
4wr�V
PV4\P !W�.4pKY	\P"P%W�4\P !V
4p\P&!VVV4p\P"P%VP(V4VP*pVV8HpV'Eg\,P.!RV3RVV34RR\0P2!49g\,P4!V4'd\,P6!V4MRR\,P6!V4RR\0P2!49g\,P4!V4'd\,P6!V4MR/,pRR	V/,p\9\,P:!V44hR
;ppVP<pR
pVVJpV'g�\,P.!RV3RVV34RR\0P2!49g\,P4!V4'd\,P6!V4MRR\,P6!V4R\,P6!V4/,pRR
V/,p\9\,P:!V44hR
;p;ppVP<pRpV)pVV8pV'g�\,P.!RV3RVV34RR\0P2!49g\,P4!V4'd\,P6!V4MRR\,P6!V4R\,P6!V4/,pRRV/,p\9\,P:!V44hR
;p;p;ppVP>pR
pVVJpV'g�\,P.!RV3RVV34RR\0P2!49g\,P4!V4'd\,P6!V4MRR\,P6!V4R\,P6!V4/,pRR
V/,p\9\,P:!V44hR
;p;ppVP@pR
pVVJpV'g�\,P.!RV3RVV34RR\0P2!49g\,P4!V4'd\,P6!V4MRR\,P6!V4R\,P6!V4/,pRR
V/,p\9\,P:!V44hR
;p;ppVPBpR
pVVJpV'g�\,P.!RV3RVV34RR\0P2!49g\,P4!V4'd\,P6!V4MRR\,P6!V4R\,P6!V4/,pRR
V/,p\9\,P:!V44hR
;p;ppR
#)rOr�rr,�framer.r2r�r�rRNr/r0r1g4@r3r4r7)z3%(py2)s
{%(py2)s = %(py0)s.num_symbols
} == %(py4)s)�is not)z2%(py2)s
{%(py2)s = %(py0)s.evm_db
} is not %(py5)s)�<)z.%(py2)s
{%(py2)s = %(py0)s.evm_db
} < -%(py5)s)�is)z.%(py2)s
{%(py2)s = %(py0)s.cfo_hz
} is %(py5)s)z=%(py2)s
{%(py2)s = %(py0)s.timing_offset_samples
} is %(py5)s)z3%(py2)s
{%(py2)s = %(py0)s.channel_mse
} is %(py5)s)"r(r9rr�r�r�rxr"rwryr�rBrr�demodulate_soft�appendr�r�r��build_ofdm_rx_framer|�num_symbolsr:r;r<r=r>r?r@rA�evm_db�cfo_hz�timing_offset_samples�channel_mse)rCr-r�r�r�r�r{rtr�r��soft_allr�r�r��softr|�soft_concatr�rDrFr�rJrErGrHrIrKs&                          r�test_evm_present_cfo_absent�+TestOfdmRxFrame.test_evm_present_cfo_absent7s'���f�o���	��&�&���i�i�#�#�B�'���,�,�q�!�)�/����,�J���k�k�#���
�\�\�'�
"���
�
�c�"���)�)�����8�8�A�R�X�X�.���y�!�A��3�w��A���}�-�E��.�.�u�5�J�D��O�O�D�!��~�~�x�&6�7�H�	"�	�
�
�%�%�h�8��n�n�X�.���'�'��[�(�C��
�
�
�%�%�e�j�j�(�;�� � �-� �I�-�-�-�-�-� �I�-�-�-�-�-�-�u�-�-�-�-�u�-�-�-� �-�-�-�-�-�-�I�-�-�-�-�I�-�-�-�-�-�-�-�-��|�|�'�4�'�|�4�'�'�'�'�'�|�4�'�'�'�'�'�'�u�'�'�'�'�u�'�'�'�|�'�'�'�4�'�'�'�'�'�'�'�'��|�|�#�t�#�t�e�#�|�e�#�#�#�#�#�|�e�#�#�#�#�#�#�u�#�#�#�#�u�#�#�#�|�#�#�#�t�#�#�#�#�#�#�#�#��|�|�#�t�#�|�t�#�#�#�#�#�|�t�#�#�#�#�#�#�u�#�#�#�#�u�#�#�#�|�#�#�#�t�#�#�#�#�#�#�#�#��*�*�2�d�2�*�d�2�2�2�2�2�*�d�2�2�2�2�2�2�u�2�2�2�2�u�2�2�2�*�2�2�2�d�2�2�2�2�2�2�2�2�� � �(�D�(� �D�(�(�(�(�(� �D�(�(�(�(�(�(�u�(�(�(�(�u�(�(�(� �(�(�(�D�(�(�(�(�(�(�(�(r
rN)rirjrkrlr�rmrnros@rr�r�6s����)�)r
r�)rOr\)�__doc__�builtinsr<�_pytest.assertion.rewrite�	assertion�rewriter:�numpyrr]�	orion_sdrr"r%rr$rrr(r*rrr�r�r�r�rr
r�<module>rsw���
���
��
��
��	
��X�
��&��D8>�8>�B$�zA�zA�B)�)�8 )� )r