📄 rake.h
字号:
/* | | Copyright disclaimer: | This software was developed at the National Institute of Standards | and Technology by employees of the Federal Government in the course | of their official duties. Pursuant to title 17 Section 105 of the | United States Code this software is not subject to copyright | protection and is in the public domain. | | We would appreciate acknowledgement if the software is used. |*//* | Project: WCDMA simulation environment | Module: WCDMA rake receiver | Author: Maarit Melvasalo/NIST and | Tommi Makelainen /Nokia Research Center | Date: February 12, 1999 | | History: | February 20, 1999 | Initial version. | | April 7, 1999 | Modified finger processing and restructured | algorithm. | | May 7, 1999 Tommi Makelainen | Corrected indexing error in finger combining. | | May 20, 1999 Tommi Makelainen | Corrected indexing error in spreading of | delayed chips. | If channel changes, finger allocation | now changes allocation after FAST_FADE_TIME | slots. | */#ifndef RAKE_H#define RAKE_H/* ------------ D E F I N E S ---------------------------------------- *//* * Maximum number of slots that allocated channel tap can * be non-existing before the finger is released. */#define FAST_FADE_TIME 2/* * Maximum change in tap location (in chip/10). */#define CHANNEL_TAP_DRIFT 0/* * Threshold to for tap amplitude level to select finger. */#define FINGER_ALLOC_THRESHOLD 0.001#if 0/* * Max spreading factor. */#define MAX_SPREADING_FACTOR 256#endif/* * Maximum number of channel taps. */#define MAX_CHANNEL_LEN MAX_CHANNEL_TAPS/* * Maximum number of fingers. */#define MAX_FINGERS MAX_CHANNEL_LEN/* * Maximum number of receiver output symbols (soft bits). */#define MAX_OUTPUT_SYMBOLS 6000#define FINGER_OUT_BUFFER 2*MAX_OUTPUT_SYMBOLS/* * Maximum number of rake receivers in simulation. */#ifndef MAX_RAKES#define MAX_RAKES 4#endif /* MAX_RAKES *//* ------------ D A T A T Y P E S ---------------------------------- *//* * Data type for each finger. */struct rake_finger_type { int delay; /* finger delay in chips */ double amplitude; /* relative tap amplitude (0-1) */ double weight; /* weight of finger output */ /* optional */ int status; /* -1 = not allocated, 0 = active, >0 = N block times not on its place in channel estimate. */ int old_chips; /* old chips affecting the current output */ double output[FINGER_OUT_BUFFER]; /* finger output symbols */ int nOutputs; /* number of available output */ int fill_index; /* index to put next output symbols */ int combine_index; /* index to put next output symbols */};typedef struct rake_finger_type finger_type;/* * Data type to store unused chips from previous function call. */struct old_chips_type { int len; /* Number of old samples saved */ double chips[MAX_SPREADING_FACTOR]; /* old chips */};typedef struct old_chips_type mem_chips_t;/* * Misc. data related to rake receiver. */struct rake_misc_data_t { int min_delay; /* delay of shortest path in fingers */ int max_delay; /* delay of longest path in fingers */ int output_symbols; /* number of soft bits we on this round */};typedef struct rake_misc_data_t rake_data_type;/* * Misc. debug related data. */#define DEBUG_DATA_LEN 10int debug_data[DEBUG_DATA_LEN];/* ------------------------------------------------------------------- */int wcdma_rake_init( int pilot_len, /* IN: length of pilot in a slot, in chips */ double finger_inc_level,/* IN: finger selection threshold */ int nFingers); /* IN: amount of fingers to use */int wcdma_rake_finger_alloc( int instance, /* IN: rake instance number */ int init_flag, /* IN: TRUE = first call, FALSE otherwise */ int tap_delays[], /* IN: vector of tap delays (in chips) */ double tap_amplitudes[], /* IN: vector of tap amplitudes (0-1) */ int ch_len, /* IN: number of taps in channel estimate */ int code_len, /* IN: length of spreading code */ int data_len, /* IN: length of input data vector */ int nFingers, /* IN: number of rake fingers to use */ finger_type *fingers, /* IN/OUT: vector of finger data structures */ mem_chips_t *prev_rake_chips, /* IN: data for old chips in memory */ rake_data_type *misc_data); /* OUT: rake data */int wcdma_rake_symbol_direct( int finger_id, /* IN: id number of current finger */ double input[], /* IN: input received samples */ int in_len, /* IN: length of input vector */ int code[], /* IN: spreading code */ int code_len, /* IN: length of spreading code */ finger_type *fingers, /* IN/OUT: vector of finger data structures */ mem_chips_t *prev_samples); /* IN: old saved samples */int wcdma_rake_symbol_delayed( int finger_id, /* IN: id number of current finger */ double input[], /* IN: input received samples */ int in_len, /* IN: length of input vector */ int code[], /* IN: spreading code */ int code_len, /* IN: length of spreading code */ finger_type *fingers, /* IN/OUT: vector of finger data structures */ mem_chips_t *prev_samples); /* IN: old saved samples */int wcdma_rake_finger_memory_save( double *input, /* IN: input received samples */ int in_len, /* IN: input length */ int code_len, /* IN: spreading code length */ mem_chips_t *prev_samples); /* IN/OUT: old saved samples */int wcdma_rake_fingers_combine( finger_type *fingers, /* IN: vector of finger data structures */ int nFingers, /* IN: number of fingers to combine */ double output[], /* OUT: output symbols */ int *nOutputs); /* OUT: length of output vector */int wcdma_rake_receiver( int instance, /* IN: instance number */ double data[], /* IN: input data symbol vector */ int data_len, /* IN: length of input data vector */ int code[], /* IN: spreading code vector */ int code_len, /* IN: length of spreading code */ int sf, /* IN: Chip/data rate, i.e. spreading factor */ int ch_delays[], /* IN: Channel estimate */ double ch_amplitudes[], /* IN: Channel estimate */ int ch_len, /* IN: Channel estimate */ int *out_len, /* OUT: Number of of output symbols */ int *out_delay, /* OUT: Tx to Rx delay in chips */ double out[]); /* OUT: desreaded output symbol vector */ #endif /* RAKE_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -