⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tmbsl10086scanauto.c

📁 卫星接收机器卫星 自动搜索, 包括优化处理
💻 C
📖 第 1 页 / 共 4 页
字号:
            if (psObject->pbDeriv[uCounterMax] > uMaxVal)
                uMaxVal = psObject->pbDeriv[uCounterMax];
        }

        // store region
        if ((psObject->pbDeriv[uCounter+MINMAX_SEARCH_RANGE/2] >= uMaxVal) && 
            (psObject->pbDeriv[uCounter+MINMAX_SEARCH_RANGE/2] > 135))
        {
            UInt32 uCurrentRf = psObject->uStartFrequency + (uCounter+MINMAX_SEARCH_RANGE/2)*FREQ_STEP;

            // limit region
            if (psObject->uNbRegion < NB_MAX_REGION)
            {

                // test if the previous region can be merged with the current one
                if (psObject->uNbRegion > 0)
                {
                    // test that the previous RFmax is not the current RF - 2000000 (=same region)
                    if (uCurrentRf - psObject->puRegion[psObject->uNbRegion-1].uRfMax  <= EXTEND_RF_REGION)
                    {
                        // Do nothing
                    }
                    else
                    {
                        // another region
                        psObject->puRegion[psObject->uNbRegion].uDelta = 0;
                        psObject->puRegion[psObject->uNbRegion].uRfMin = uCurrentRf;
                        psObject->puRegion[psObject->uNbRegion].uRfMax = uCurrentRf;
                        psObject->puRegion[psObject->uNbRegion].uSrMin = 45000000;
                        psObject->puRegion[psObject->uNbRegion].uSrMax = 45000000;
                        psObject->uNbRegion++;
                    }
                }
                else
                {
                    psObject->puRegion[psObject->uNbRegion].uRfMin = uCurrentRf;
                    psObject->puRegion[psObject->uNbRegion].uRfMax = uCurrentRf;
                    psObject->puRegion[psObject->uNbRegion].uSrMin = 45000000;
                    psObject->puRegion[psObject->uNbRegion].uSrMax = 45000000;
                    psObject->uNbRegion++;
                }
            }
        }
    }


    // initialize last region to avoid side effect
    psObject->puRegion[psObject->uNbRegion].uRfMin = psObject->uStopFrequency;
    psObject->puRegion[psObject->uNbRegion].uRfMax = psObject->uStopFrequency;
    psObject->puRegion[psObject->uNbRegion].uSrMin = 45000000;
    psObject->puRegion[psObject->uNbRegion].uSrMax = 45000000;


    uCnt = 0;

    // find local minima of derivation
    for (uCounter = 3; uCounter < psObject->uNbSamples - 4 - MINMAX_SEARCH_RANGE; uCounter++)
    {
        UInt32 uCounterMin, uMinVal = 255;

        // find min
        for (uCounterMin = uCounter; uCounterMin < MINMAX_SEARCH_RANGE + uCounter; uCounterMin++)
        {
            if (psObject->pbDeriv[uCounterMin] < uMinVal)
                uMinVal = psObject->pbDeriv[uCounterMin];
        }

        // store region
        if (((psObject->pbDeriv[uCounter+MINMAX_SEARCH_RANGE/2] <= uMinVal) &&
             (psObject->pbDeriv[uCounter+MINMAX_SEARCH_RANGE/2] < 118)) ||
             (uCounter == psObject->uNbSamples - 5 - MINMAX_SEARCH_RANGE))
        {
            UInt32 uCurrentRf = psObject->uStartFrequency + (uCounter+MINMAX_SEARCH_RANGE/2)*FREQ_STEP;

            if (uCurrentRf <= psObject->puRegion[uCnt].uRfMin)
            {
                // Do nothing
            }
            else
            {
                while((psObject->puRegion[uCnt+1].uRfMin < uCurrentRf) && (uCnt < psObject->uNbRegion))
                {
                    // Skip regions that are before the current frequency
                    psObject->puRegion[uCnt].uRfMax = psObject->puRegion[uCnt].uRfMin;
                    psObject->puRegion[uCnt].uSrMin = SKIP_REGION;
                    psObject->puRegion[uCnt].uSrMax = SKIP_REGION;
                    uCnt++;
                }

                psObject->puRegion[uCnt].uRfMax = uCurrentRf;
                psObject->puRegion[uCnt].uMin = 255;
                psObject->puRegion[uCnt].uMax = 0;
                psObject->puRegion[uCnt].uUpperMin = 255;

                if ((psObject->puRegion[uCnt].uRfMax - psObject->puRegion[uCnt].uRfMin) < MIN_CHANNEL_WIDTH)
                {
                    // Skip region that are not large enough
                    psObject->puRegion[uCnt].uSrMin = SKIP_REGION;
                    psObject->puRegion[uCnt].uSrMax = SKIP_REGION;
                    SEND_TRACEAUTOSR1(0x801b,psObject->puRegion[uCnt].uRfMax - psObject->puRegion[uCnt].uRfMin);
                }
                else
                {
                    UInt32 i;
                    UInt32 uMax=0, uMin1=255, uMin2=255;
                    UInt32 uRfCenter;
                    UInt32 uSearchRange;
                    UInt32 uRollOff;
                    UInt32 uThreshold;
                    UInt32 uThresholdTriangle;
                    UInt32 uTriangleRfMin, uTriangleRfMax;
                    UInt32 uRfMin, uRfMax;

                    // find the maximun of spectrum in the current region
                    for(i = (psObject->puRegion[uCnt].uRfMin-psObject->uStartFrequency)/FREQ_STEP ; i<(psObject->puRegion[uCnt].uRfMax-psObject->uStartFrequency)/FREQ_STEP ; i++)
                    {
                        if(psObject->pbSpectrum[i]>uMax)
                            uMax = psObject->pbSpectrum[i];
                    }

                    uRfCenter = psObject->puRegion[uCnt].uRfMax/2 + psObject->puRegion[uCnt].uRfMin/2;

                    // Store the local max
                    psObject->puRegion[uCnt].uMax = uMax;

                    // find the minimum to the left
                    i=(uRfCenter-psObject->uStartFrequency)/FREQ_STEP;
                    uSearchRange = uRfCenter-psObject->uStartFrequency;

//                    SEND_TRACEAUTOSR1(0x8006, psObject->puRegion[uCnt].uRfMin);
//                    SEND_TRACEAUTOSR1(0x8006, uSearchRange+uRfCenter);

                    if(uSearchRange > MIN_SEARCH_RANGE)
                        uSearchRange -= MIN_SEARCH_RANGE;
                    else
                        uSearchRange = 0;

//                    SEND_TRACEAUTOSR1(0x8006, uSearchRange);

                    uSearchRange /= FREQ_STEP;
                    
                    while((i>uSearchRange)  && (i>2))
                    {
                        if(psObject->pbSpectrum[i] < uMin1)
                            uMin1 = psObject->pbSpectrum[i];

                        i--;
                        
//                        SEND_TRACESPECTRUM(TRACE_RED, DEBUG_XY, FREQ2INDEX(i*FREQ_STEP + psObject->uStartFrequency), psObject->pbSpectrum[i]-2);

                        if( (i<((psObject->puRegion[uCnt].uRfMin-psObject->uStartFrequency)/FREQ_STEP)) && // If we have searched for a minimum beyond the beginning of the region
                            (psObject->pbSpectrum[i]>(uMin1+MAX_AMP_REBOUND)) )                            // and there is a significant rebound of spectrum
                        {
//                            SEND_TRACEAUTOSR1(0x8006, i*FREQ_STEP + psObject->uStartFrequency);
                            break;                                                                         // Stop the minimum search
                        }
                    }

                    // find the minimum to the right
                    i=(uRfCenter-psObject->uStartFrequency)/FREQ_STEP;
                    uSearchRange = uRfCenter + MIN_SEARCH_RANGE;
                    if(uSearchRange > psObject->uStopFrequency)
                        uSearchRange = psObject->uStopFrequency;
                    uSearchRange -= psObject->uStartFrequency;
                    uSearchRange /= FREQ_STEP;

                    while((i<uSearchRange) && (i < (psObject->uNbSamples-2)))
                    {
                        if(psObject->pbSpectrum[i]<uMin2)
                            uMin2 = psObject->pbSpectrum[i];

                        i++;

//                        SEND_TRACESPECTRUM(TRACE_RED, DEBUG_XY, FREQ2INDEX(i*FREQ_STEP + psObject->uStartFrequency), psObject->pbSpectrum[i]-2);

                        if( (i>((psObject->puRegion[uCnt].uRfMax-psObject->uStartFrequency)/FREQ_STEP)) &&  // If we have searched for a minimum beyond the end of the region
                            (psObject->pbSpectrum[i]>(uMin2+MAX_AMP_REBOUND)) )                             // and there is a significant rebound of spectrum
                        {
//                            SEND_TRACEAUTOSR1(0x8006, i*FREQ_STEP + psObject->uStartFrequency);
                            break;                                                                         // Stop the minimum search
                        }
                    }

                    // Store the minimum of the minima
                    if ( uMin1 < uMin2) 
                    {
                        psObject->puRegion[uCnt].uMin = uMin1;
                        psObject->puRegion[uCnt].uUpperMin = uMin2;
                    }
                    else 
                    {
                        psObject->puRegion[uCnt].uMin = uMin2;
                        psObject->puRegion[uCnt].uUpperMin = uMin1;
                    }

                    if ( psObject->puRegion[uCnt].uMin < NoiseFloor )
                    {
                        NoiseFloor = psObject->puRegion[uCnt].uMin;
                    }

                    // Calculate the amplitude of the spectrum
//                    psObject->puRegion[uCnt].uDelta = psObject->puRegion[uCnt].uMax - psObject->puRegion[uCnt].uMin;
                    psObject->puRegion[uCnt].uDelta = psObject->puRegion[uCnt].uMax - NoiseFloor;

                  
                    // Find the limits of the region // THRESHOLDS

                    uThreshold = psObject->puRegion[uCnt].uUpperMin + (psObject->puRegion[uCnt].uMax - psObject->puRegion[uCnt].uUpperMin)/3;

//                    uThresholdTriangle = psObject->puRegion[uCnt].uUpperMin + (psObject->puRegion[uCnt].uMax - psObject->puRegion[uCnt].uUpperMin)*3/4;
                    uThresholdTriangle = uThreshold + (psObject->puRegion[uCnt].uMax - uThreshold)*4/5;

                    i=(uRfCenter-psObject->uStartFrequency)/FREQ_STEP;
                    while((psObject->pbSpectrum[i] > uThreshold) && (i>0))
                    {
                        i--;
                    }
                    psObject->puRegion[uCnt].uRfMin = i*FREQ_STEP - RF_OFFSET + psObject->uStartFrequency;


                    i=(uRfCenter-psObject->uStartFrequency)/FREQ_STEP;
                    while((psObject->pbSpectrum[i] > uThreshold) && (i < psObject->uNbSamples))
                    {
                        i++;
                    }
                    psObject->puRegion[uCnt].uRfMax = i*FREQ_STEP - RF_OFFSET + psObject->uStartFrequency;


                    i=(uRfCenter-psObject->uStartFrequency)/FREQ_STEP;
                    while((psObject->pbSpectrum[i] > uThresholdTriangle) && (i>0))
                    {
                        i--;
                    }
                    uTriangleRfMin = i*FREQ_STEP;

                    i=(uRfCenter-psObject->uStartFrequency)/FREQ_STEP;
                    while((psObject->pbSpectrum[i] > uThresholdTriangle) && (i < psObject->uNbSamples))
                    {
                        i++;
                    }
                    uTriangleRfMax = i*FREQ_STEP;
                    SEND_TRACEAUTOSR1(0x8033, uTriangleRfMax - uTriangleRfMin);

                    psObject->puRegion[uCnt].uTriangle = ((psObject->puRegion[uCnt].uRfMax - psObject->puRegion[uCnt].uRfMin)*100)/(uTriangleRfMax - uTriangleRfMin + 1);
                    SEND_TRACEAUTOSR1(0x8034, psObject->puRegion[uCnt].uTriangle);

                    // Trace the region
                    #ifdef BSL_DEBUG_GREEN_TRACE
                    {
                        if (psObject->puRegion[uCnt].uDelta >= psObject->sConfig.uDeltaThreshold)
                        {
                            UInt32 uFreq;

                            for (uFreq = psObject->puRegion[uCnt].uRfMin; uFreq <= psObject->puRegion[uCnt].uRfMax ; uFreq += DISPLAY_STEP)
                            {
//                                SEND_TRACESPECTRUM(TRACE_GREEN, DEBUG_XY, FREQ2INDEX(uFreq), uThreshold);
                            }
                        }
                    }
                    #endif
/*
                    // Reduction to take into account the amalysis window's width (1 MHz)
                    if(psObject->puRegion[uCnt].uRfMax - psObject->puRegion[uCnt].uRfMin > 1000000) //1500000)
                    {
                        psObject->puRegion[uCnt].uRfMin = psObject->puRegion[uCnt].uRfMin + 300000; //750000;
                        psObject->puRegion[uCnt].uRfMax = psObject->puRegion[uCnt].uRfMax - 300000; //750000;
                    }
*/
                    // Calculate the theorical symbol rate
                    if (psObject->sConfig.bDSS_DVB == (UInt8)tmhalFEStandardDVBS)
                        uRollOff = 135;
                    else
                        uRollOff = 120;

                    SEND_TRACEAUTOSR1(0x800a, psObject->puRegion[uCnt].uMax);
                    SEND_TRACEAUTOSR1(0x800b, psObject->puRegion[uCnt].uMin);
                    SEND_TRACEAUTOSR1(0x8016, psObject->puRegion[uCnt].uUpperMin);
                    SEND_TRACEAUTOSR1(0x800c, psObject->puRegion[uCnt].uDelta);
                    SEND_TRACEAUTOSR1(0x8027, psObject->puRegion[uCnt].uRfMax/2 + psObject->puRegion[uCnt].uRfMin/2);


                    // Calculate the limits of the region to scan
                    psObject->puRegion[uCnt].uSrMin = (((psObject->puRegion[uCnt].uRfMax-psObject->puRegion[uCnt].uRfMin)/uRollOff)*(100-psObject->sConfig.uSrMinMargin));
                    psObject->puRegion[uCnt].uSrMax = (((psObject->puRegion[uCnt].uRfMax-psObject->puRegion[uCnt].uRfMin)/uRollOff)*(100+psObject->sConfig.uSrMaxMargin));
                    SEND_TRACEAUTOSR1(0x8004, psObject->puRegion[uCnt].uSrMax);
                    SEND_TRACEAUTOSR1(0x8003, psObject->puRegion[uCnt].uSrMin);
                    psObject->puRegion[uCnt].uACI = NO_ACI;
                    if (psObject->puRegion[uCnt].uMin >= NoiseFloor + (psObject->puRegion[uCnt].uMax - NoiseFloor)/2)
                    {    // ACI on both sides
                        SEND_TRACEAUTOSR1(0x802C, 2);
                        uRollOff = uRollOff*85/100;
                        psObject->puRegion[uCnt].uACI = LU_ACI;
                    }
                    else
                    {    // ACI on one side
                        if (psObject->puRegion[uCnt].uUpperMin >= NoiseFloor + (psObject->puRegion[uCnt].uMax - NoiseFloor)/2)
                        {
                            SEND_TRACEAUTOSR1(0x802C, 1);
                            uRollOff = uRollOff*90/100;
                            if ( uMin1 < uMin2)        // ACI is on the right side
                            {
    //                            psObject->puRegion[uCnt].uRfMax -= 2000000;
    //                            psObject->puRegion[uCnt].uRfMin -= 1500000;
                                SEND_TRACEAUTOSR1(0x002F, 0);
                                psObject->puRegion[uCnt].uACI = U_ACI;
    //                            SEND_TRACEAUTOSR1(0x8027, psObject->puRegion[uCnt].uRfMax/2 + psObject->puRegion[uCnt].uRfMin/2);
                            }
                            else
                            {                        // ACI is on the left side
    //                            psObject->puRegion[uCnt].uRfMax += 1500000;
    //                            psObject->puRegion[uCnt].uRfMin += 1500000;
                                SEND_TRACEAUTOSR1(0x0030, 0);
                                psObject->puRegion[uCnt].uACI = L_ACI;
    //                            SEND_TRACEAUTOSR1(0x8027, psObject->puRegion[uCnt].uRfMax/2 + psObject->puRegion[uCnt].uRfMin/2);
                            }
                        }
                    }

//                    SEND_TRACEAUTOSR1(0x802E, uRollOff);
                    SEND_TRACEAUTOSR1(0x0006, 0);
                    psObject->puRegion[uCnt].uSrMin = (((psObject->puRegion[uCnt].uRfMax-psObject->puRegion[uCnt].uRfMin)/uRollOff)*(100-psObject->sConfig.uSrMinMargin));
                    psObject->puRegion[uCnt].uSrMax = (((psObject->puRegion[uCnt].uRfMax-psObject->puRegion[uCnt].uRfMin)/uRollOff)*(100+psObject->sConfig.uSrMaxMargin));
                    SEND_TRACEAUTOSR1(0x8004, psObject->puRegion[uCnt].uSrMax);
                    SEND_TRACEAUTOSR1(0x8003, psObject->puRegion[uCnt].uSrMin);

                    uRfCenter = psObject->puRegion[uCnt].uRfMax/2 + psObject->puRegion[uCnt].uRfMin/2;

                    uRfMax = psObject->puRegion[uCnt].uRfMax;
                    uRfMin = psObject->puRegion[uCnt].uRfMin;

                    psObject->puRegion[uCnt].uRfMin = 
                    	uRfCenter - (((uRfMax-uRfMin)/uRollOff)*lv_RF_Min_Margin);
                    psObject->puRegion[uCnt].uRfMax = 
                    	uRfCenter + (((uRfMax-uRfMin)/uRollOff)*lv_RF_Max_Margin);

                }

                uCnt++;

                while((psObject->puRegion[uCnt].uRfMin<uCurrentRf) && (uCnt < psObject->uNbRegion))
                {
                    psObject->puRegion[uCnt].uRfMax = psObject->puRegion[uCnt].uRfMin;
                    psObject->puRegion[uCnt].uSrMin = SKIP_REGION;
                    psObject->puRegion[uCnt].uSrMax = SKIP_REGION;
                    uCnt++;
                }

            }
        }
    }


    // release buffer for spectrum
#ifdef _WIN32
    free(psObject->pbSpectrum);
#else
	tmhpiCommonMemFree(psObject->pbSpectrum);
#endif
    psObject->pbSpectrum = 0;

    // 
    for (uCounter = 0; uCounter < psObject->uNbRegion; uCounter++)
    {
        if(psObject->puRegion[uCounter].uSrMin > psObject->sConfig.uStartSymbolRate)
            psObject->puRegion[uCounter].uSrMin = psObject->sConfig.uStartSymbolRate;
        if(psObject->puRegion[uCounter].uSrMax > psObject->sConfig.uStartSymbolRate)
            psObject->puRegion[uCounter].uSrMax = psObject->sConfig.uStartSymbolRate;
        if(psObject->puRegion[uCounter].uSrMin < psObject->sConfig.uStopSymbolRate)
            psObject->puRegion[uCounter].uSrMin = psObject->sConfig.uStopSymbolRate;
        if(psObject->puRegion[uCounter].uSrMax < psObject->sConfig.uStopSymbolRate)
            psObject->puRegion[uCounter].uSrMax = psObject->sConfig.uStopSymbolRate;

        // Display region
        SEND_TRACEAUTOSR1(0x0006,0);
        SEND_TRACEAUTOSR1(0x8019,uCounter);
        SEND_TRACEAUTOSR1(0x8028,NoiseFloor);
        SEND_TRACEAUTOSR1(0x8027,psObject->puRegion[uCounter].uRfMin/2000000 + psObject->puRegion[uCounter].uRfMax/2000000);
        SEND_TRACEAUTOSR1(0x8001,psObject->puRegion[uCounter].uRfMin);
        SEND_TRACEAUTOSR1(0x8002,psObject->puRegion[uCounter].uRfMax);
        SEND_TRACEAUTOSR1(0x8003,psObject->puRegion[uCounter].uSrMin);
        SEND_TRACEAUTOSR1(0x8004,psObject->puRegion[uCounter].uSrMax);
        SEND_TRACEAUTOSR1(0x800a,psObject->puRegion[uCounter].uMax);
        SEND_TRACEAUTOSR1(0x800b,psObject->puRegion[uCounter].uMin);
        SEND_TRACEAUTOSR1(0x800c,psObject->puRegion[uCounter].uDelta);
        SEND_TRACEAUTOSR1(0x8016,psObject->puRegion[uCounter].uUpperMin);
    }

    // Channels with an amplitude variation lower than the level define with MAX_MIN_THRESHOLD or with SR out of bounds must not be used.
    uLastValidRegion = 0;

    for (uCounter = 0; uCounter < psObject->uNbRegion; uCounter++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -