Ignore:
Timestamp:
06/07/12 11:01:27 (12 years ago)
Author:
tbretz
Message:
Added step remove algorithm.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Mars/mcore/DrsCalib.h

    r14080 r14101  
    208208            vec[i] = double(v)*scalegain/div;
    209209        }
     210    }
     211
     212    static double FindStep(const size_t ch0, const float *vec, int16_t roi, const int16_t pos, const uint16_t *map)
     213    {
     214        if (pos<=1 || pos>=roi)
     215            return 0;
     216
     217        double step = 0; // before
     218
     219        // Exclude TM channel
     220        for (int p=0; p<8; p++)
     221        {
     222            const size_t hw = ch0+p;
     223            const size_t sw = map[hw]*roi + pos;
     224
     225            step += vec[sw]-vec[sw-1];
     226        }
     227
     228        return step/8;
     229    }
     230
     231    static void SubtractStep(const size_t ch0, const double avg, float *vec, int16_t roi, uint32_t dist, const uint16_t *map)
     232    {
     233        const int begin  = avg>0 ? dist :    0;
     234        const int end    = avg>0 ?  roi : dist;
     235
     236        const double sub = fabs(avg);
     237
     238        for (int p=0; p<9; p++)
     239        {
     240            for (int j=begin; j<end; j++)
     241            {
     242                const size_t hw = ch0+p;
     243                const size_t sw = map[hw]*roi + j;
     244
     245                vec[sw] -= sub;
     246            }
     247        }
     248    }
     249
     250    struct Step
     251    {
     252        Step() : avg(0), rms(0), pos(0), cnt(0) { }
     253        double   avg;
     254        double   rms;
     255        double   pos;
     256        uint16_t cnt;
     257    };
     258
     259    static Step CorrectStep(float *vec, uint16_t nch, uint16_t roi,
     260                            const int16_t *prev, const int16_t *start,
     261                            const int16_t offset, const uint16_t *map)
     262    {
     263        Step rc;
     264
     265        for (size_t ch=0; ch<nch; ch += 9)
     266        {
     267            if (prev[ch]<0 || start[ch]<0)
     268                continue;
     269
     270            const int16_t dist = (prev[ch]-start[ch]+1024+offset)%1024;
     271            const double  step = FindStep(ch, vec, roi, dist, map);
     272            if (step==0)
     273                continue;
     274
     275            rc.pos += dist;
     276            rc.avg += step;
     277            rc.rms += step*step;
     278            rc.cnt++;
     279        }
     280
     281        if (rc.cnt==0 || rc.avg==0)
     282            return Step();
     283
     284        rc.pos /= rc.cnt;
     285        rc.avg /= rc.cnt;
     286        rc.rms /= rc.cnt;
     287
     288        rc.rms = sqrt(rc.rms-rc.avg*rc.avg);
     289
     290        for (size_t ch=0; ch<nch; ch += 9)
     291        {
     292            const int16_t dist = (prev[ch]-start[ch]+1024+offset)%1024;
     293            SubtractStep(ch, rc.avg, vec, roi, dist, map);
     294        }
     295
     296        return rc;
    210297    }
    211298
Note: See TracChangeset for help on using the changeset viewer.