📄 tmbsl10086scanauto.c
字号:
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 + -