FreeCalypso > hg > fc-selenite
diff src/cs/layer1/gtt_include/ctm/wait_for_sync.h @ 0:b6a5e36de839
src/cs: initial import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 15 Jul 2018 04:39:26 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cs/layer1/gtt_include/ctm/wait_for_sync.h Sun Jul 15 04:39:26 2018 +0000 @@ -0,0 +1,192 @@ +/* +******************************************************************************* +* +* COPYRIGHT (C) 2000 BY ERICSSON EUROLAB DEUTSCHLAND GmbH +* 90411 NUERNBERG, GERMANY, Tel Int + 49 911 5217 100 +* +* The program(s) may be used and/or copied only with the +* written permission from Ericsson or in accordance +* with the terms and conditions stipulated in the agreement or +* contract under which the program(s) have been supplied. +* +******************************************************************************* +* +* File : wait_for_sync.h +* Purpose : synchronization routine for the deinterleaver +* +******************************************************************************* +*/ +#ifndef wait_for_sync_h +#define wait_for_sync_h "$Id: $" + +/* +******************************************************************************* +* INCLUDE FILES +******************************************************************************* +*/ + +#include "ctm_typedefs.h" + +/* +******************************************************************************* +* DECLARATION OF PROTOTYPES +******************************************************************************* +*/ + +typedef struct { + WORD16 *shift_reg; /* shift register */ + WORD16 *m_sequence; /* maximum length sequence (preamble) */ + WORD16 *m_sequence_resync; /* maximum length sequence (resync) */ + WORD16 *sync_index_vec; /* positions/indices of the preamble */ + WORD16 *resync_index_vec; /* positions/indices of the resync sequence */ + WORD16 length_shift_reg; /* length of the vector shift_reg */ + WORD16 offset; /* */ + WORD16 num_sync_bits; /* length of the preamble */ + BOOL sync_found; /* true if receiver is "in sync" */ + BOOL alreadyCTMreceived; /* true if burst has been received earlier */ + WORD16 *xcorr1_shiftreg; + WORD16 *xcorr2_shiftreg; + UWORD16 cntSymbolsSinceEndOfBurst; +} wait_for_sync_state_t; + + + +/* ----------------------------------------------------------------------- */ +/* Function init_wait_for_sync() */ +/* ***************************** */ +/* Initialization of the synchronization detector. The dimensions of the */ +/* corresponding interleaver at the TX side must be specified: */ +/* B (horizontal) blocklength */ +/* D (vertical) interlace factor */ +/* num_sync_lines2 number of interleaver lines with additional sync bits */ +/* ptr_wait_state pointer to the state variable of the sync detector */ +/* ----------------------------------------------------------------------- */ + +void init_wait_for_sync(wait_for_sync_state_t *ptr_wait_state, + WORD16 B, WORD16 D, + WORD16 num_sync_lines2); + +/* + *********************************************************************** + * Shutdown_wait_for_sync() * + * ************************ * + * Deallocate dyamically created buffers. * + * * + * Input variables: * + * intl_state : pointer to a variable of wait_for_sync_state_t * + * containing the wait_for_sync state machine. * + *********************************************************************** +*/ +void Shutdown_wait_for_sync(wait_for_sync_state_t *ptr_wait_state); + +/* ----------------------------------------------------------------------- */ +/* Function reinit_wait_for_sync() */ +/* ******************************* */ +/* Reinitialization of synchronization detector. This function is used in */ +/* case that a burst has been finished and the transmitter has switched */ +/* into idle mode. After calling reinit_wait_for_sync(), the function */ +/* wait_for_sync() inhibits the transmission of the demodulated bits to */ +/* the deinterleaver, until the next synchronization sequence can be */ +/* detected. */ +/* ----------------------------------------------------------------------- */ + +void reinit_wait_for_sync(wait_for_sync_state_t *ptr_wait_state); + + + +/* ----------------------------------------------------------------------- */ +/* Function wait_for_sync() */ +/* ************************ */ +/* This function shall be inserted between the demodulator and the */ +/* deinterleaver. The function searches the synchronization bitstream */ +/* and cuts all received heading bits. As long as no sync is found, this */ +/* function returns *ptr_num_valid_out_bits=0 so that the main program */ +/* is able to skip the deinterleaver as long as no valid bits are */ +/* available. If the sync info is found, the complete internal shift */ +/* register is copied to out_bits so that wait_for_sync can be transparent */ +/* and causes no delay for future calls. */ +/* *ptr_wait_interval returns a value of 0 after such a synchronization */ +/* indicating that this was a regular synchronization. */ +/* */ +/* Regularly, the initial preamble of each burst is used as sync info. */ +/* In addition, the resynchronization sequences, which occur periodically */ +/* during a running burst, are used as "back-up" synchronization in order */ +/* to avoid loosing all characters of a burst, if the preamble was not */ +/* detected. */ +/* If the receiver is already synchronized on a running burst */ +/* and the resynchronization sequence is detected, *ptr_resync_detected */ +/* returns a non-negative value in the range 0...num_in_bits-1 indicating */ +/* at which bit the resynchronization sequence has been detected. If no */ +/* resynchronization has been detected, *ptr_resync_detected is -1. */ +/* If the receiver is NOT synchronized and the resynchronization sequence */ +/* is detected, the resynchronization sequence is used as initial */ +/* synchronization. *ptr_wait_interval returns a value of 32 in this case */ +/* due to the different alignments of the synchronizations based on the */ +/* preamble or the resynchronization sequence, respectively. */ +/* */ +/* In order to carry all bits, the minimum length of the vector out_bits */ +/* must be: */ +/* in_bits.size()-1 + ptr_wait_state->shift_reg_length */ +/* */ +/* in_bits Vector with bits from the demodulator. The */ +/* vector's length can be arbitrarily chosen, */ +/* i.e. according to the block length of the */ +/* signal processing of the main program. */ +/* num_in_bits length of vector in_bits */ +/* num_received_idle_symbols number of idle symbols received coherently */ +/* out_bits Vector with bits for the deinterleaver. */ +/* The number of the valid bits is indicated */ +/* by *ptr_num_valid_out_bits. */ +/* *ptr_num_valid_out_bits returns the number of valid output bits */ +/* *ptr_wait_interval returns either 0 or 32 */ +/* *ptr_resync_detected returns a value -1, 0,...num_in_bits */ +/* *ptr_early_muting_required returns whether the original audio signal */ +/* must not be forwarded. This is to guarantee */ +/* that the preamble or resync sequence is */ +/* detected only by the first CTM device, if */ +/* several CTM devices are cascaded */ +/* subsequently. */ +/* *ptr_wait_state state information. This variable must be */ +/* initialized with init_wait_for_sync() */ +/* ----------------------------------------------------------------------- */ + +#if(TTY_SYNC_MCU_2 == 0) +BOOL wait_for_sync(WORD16 *out_bits, + WORD16 *in_bits, + WORD16 num_in_bits, + WORD16 num_received_idle_symbols, + WORD16 *ptr_num_valid_out_bits, + WORD16 *ptr_wait_interval, + WORD16 *ptr_resync_detected, + BOOL *ptr_early_muting_required, + wait_for_sync_state_t *ptr_wait_state); +#else +BOOL wait_for_sync(WORD16 *out_bits, + WORD16 *in_bits, + WORD16 num_in_bits, + WORD16 num_received_idle_symbols, + WORD16 *ptr_num_valid_out_bits, + WORD16 *ptr_wait_interval, + WORD16 *ptr_resync_detected, + BOOL *ptr_early_muting_required, + wait_for_sync_state_t *ptr_wait_state, + BOOL *sync_after_resync); +#endif + + + + +/* ----------------------------------------------------------------------- */ +/* Function generate_resync_sequence() */ +/* *********************************** */ +/* Generation of the sequence for resynchronization. The sequence, which */ +/* has a length according to the value of the constant RESYNC_SEQ_LENGTH, */ +/* is written to the vector *sequence, which must have been allocated */ +/* before calling this function. */ +/* ----------------------------------------------------------------------- */ + +void generate_resync_sequence(WORD16 *sequence); + + +#endif +