Exemplo n.º 1
0
        void CalculateCorrections()
        {
            // Calculate the initial correlation value
            float Gamma  = 0;
            float Energy = 0;
            IQ    Sample;
            IQ    ShiftedSample;

            IQ    PrevSample, PrevShiftedSample;
            float Value;
            float Diff;

            int Idx        = 0;
            int ShiftedIdx = FFTSize;

            for (; Idx < CPSize; Idx++, ShiftedIdx++)
            {
                Sample        = DataBuffer[Idx];
                ShiftedSample = DataBuffer[ShiftedIdx];
                Gamma        += (Sample / ShiftedSample).R2;
                Energy       += (Sample * Sample).R2 + (ShiftedSample * ShiftedSample).R2;
            }

            Value         = Gamma - 0.5f * SNRValue * Energy;
            Diff          = Value - PrevValue;
            CorrBuffer[0] = Value;

            DiffFIR.Process(Diff, out DiffFIRBuffer[0]);
            DiffIIR          = OneMinusAlpha * DiffIIR + Alpha * Diff;
            DiffIIRBuffer[0] = DiffIIR;

            PrevValue = Value;
            // Now, calculate all other correlations
            Idx        = CPSize;
            ShiftedIdx = BlockSize;
            for (int i = 1; i < BlockSize; i++, Idx++, ShiftedIdx++)
            {
                Sample            = DataBuffer[Idx];
                ShiftedSample     = DataBuffer[ShiftedIdx];
                PrevSample        = DataBuffer[i - 1];
                PrevShiftedSample = DataBuffer[i - 1 + FFTSize];
                Gamma            += (Sample / ShiftedSample).R2 -
                                    (PrevSample / PrevShiftedSample).R2;
                Energy += (Sample * Sample).R2 + (ShiftedSample * ShiftedSample).R2 -
                          ((PrevSample * PrevSample).R2 + (PrevShiftedSample * PrevShiftedSample).R2);
                Value = Gamma - 0.5f * SNRValue * Energy;
                Diff  = Value - PrevValue;

                CorrBuffer[i] = Value;
                DiffFIR.Process(Diff, out DiffFIRBuffer[i]);

                DiffIIR          = OneMinusAlpha * DiffIIR + Alpha * Diff;
                DiffIIRBuffer[i] = DiffIIR;

                PrevValue = Value;
            }
        }