summaryrefslogtreecommitdiff
path: root/src/lib/gsm_receiver_cf.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/gsm_receiver_cf.h')
-rw-r--r--src/lib/gsm_receiver_cf.h36
1 files changed, 29 insertions, 7 deletions
diff --git a/src/lib/gsm_receiver_cf.h b/src/lib/gsm_receiver_cf.h
index 98df34d..cc3fc15 100644
--- a/src/lib/gsm_receiver_cf.h
+++ b/src/lib/gsm_receiver_cf.h
@@ -32,6 +32,7 @@
//TODO !! - move this classes to some other place
#include <vector>
#include <algorithm>
+#include <math.h>
typedef enum {empty, fcch_burst, sch_burst, normal_burst, rach_burst, dummy} burst_type;
typedef enum {unknown, multiframe_26, multiframe_51} multiframe_type;
@@ -85,20 +86,30 @@ class multiframe_configuration
class burst_counter
{
private:
+ const int d_OSR;
uint32_t d_t1, d_t2, d_t3, d_timeslot_nr;
+ double d_first_sample_offset;
+ double d_offset;
public:
- burst_counter():
+ burst_counter(int osr):
+ d_OSR(osr),
d_t1(0),
d_t2(0),
d_t3(0),
- d_timeslot_nr(0) {
+ d_timeslot_nr(0),
+ d_first_sample_offset(0),
+ d_offset(0) {
}
- burst_counter(uint32_t t1, uint32_t t2, uint32_t t3, uint32_t timeslot_nr):
+ burst_counter(int osr, uint32_t t1, uint32_t t2, uint32_t t3, uint32_t timeslot_nr):
+ d_OSR(osr),
d_t1(t1),
d_t2(t2),
d_t3(t3),
- d_timeslot_nr(timeslot_nr) {
+ d_timeslot_nr(timeslot_nr),
+ d_offset(0) {
+ double first_sample_position = (get_frame_nr()*8+timeslot_nr)*TS_BITS;
+ d_first_sample_offset = first_sample_position - floor(first_sample_position);
}
burst_counter & operator++(int) {
@@ -113,6 +124,10 @@ class burst_counter
d_t2 = (d_t2 + 1) % 26;
d_t3 = (d_t3 + 1) % 51;
}
+
+ d_first_sample_offset += GUARD_FRACTIONAL * d_OSR;
+ d_offset = floor(d_first_sample_offset);
+ d_first_sample_offset = d_first_sample_offset - d_offset;
return (*this);
}
@@ -121,6 +136,9 @@ class burst_counter
d_t2 = t2;
d_t3 = t3;
d_timeslot_nr = timeslot_nr;
+ double first_sample_position = (get_frame_nr()*8+timeslot_nr)*TS_BITS;
+ d_first_sample_offset = first_sample_position - floor(first_sample_position);
+ d_offset = 0;
}
uint32_t get_t1() {
@@ -140,7 +158,11 @@ class burst_counter
}
uint32_t get_frame_nr() {
- return (51 * 26 * d_t1) + (51 * (((d_t3 + 26) - d_t2) % 26)) + d_t3;
+ return (51 * 26 * d_t1) + (51 * (((d_t3 + 26) - d_t2) % 26)) + d_t3;
+ }
+
+ unsigned get_offset(){
+ return (unsigned)d_offset;
}
};
@@ -180,7 +202,7 @@ burst_type channel_configuration::get_burst_type(burst_counter burst_nr)
uint32_t timeslot_nr = burst_nr.get_timeslot_nr();
multiframe_type m_type = d_timeslots_descriptions[timeslot_nr].get_type();
uint32_t nr;
-
+
switch (m_type) {
case multiframe_26:
nr = burst_nr.get_t2();
@@ -227,7 +249,7 @@ class gsm_receiver_cf : public gr_block
gr_complex d_sch_training_seq[N_SYNC_BITS]; //encoded training sequence of a SCH burst
gr_feval_dd *d_tuner;
- int d_counter;
+ unsigned d_counter;
//variables used to store result of the find_fcch_burst fuction
int d_fcch_start_pos;
personal git repositories of Harald Welte. Your mileage may vary