Laser Diode의 Threshold Current 계산 알고리즘 - Least Square Method

반응형

LD(Laser Diode)는 낮은 전류에서는 LED처럼 동작하지만 일정전류 이상(임계전류) 부터는 발진이 되면서 광출력이 급격히 증가하는 현상이 나타나게 됩니다. LD 의 특성 평가에서 이 임계전류값은 중요한 특성지표로 사용이 됩니다.  

임계전류를 계산하는 방식은 여러 방법이 있습니다. 이번장에서는 대표적인 방법으로 Least Square(직선근사) 방식을 이용한 Threshold Current 계산 코드를 적용하였습니다. 

Threshold Current
Threshold Current  정의

1. 계산 파라메타 ( 아래 이미지 참조 )

  *  Pth1, Pth2 : 전체 측정 파워데이타 중에서 직선근사를 적용할 파워의 범위 ( 가능한 낮은 파워구간을 선택하는것이 좋다.)

  * vector<float> Power : 측정된 파워 데이타 

  * vector<float> Current : 측정된 전류 데이타

Threshold Current
측정 파라메타 정보

2. 계산 알고리즘 코드 ( C++ )

vector<float> Current ;
vector<float> Power ;

float Ith_LeastSquare_Method(const float Pth1, const float Pth2)
{
    float fDegree, fYvalue, result ;

    tuple<float, float>value = LeastSquare(Current, Power, powerLow, powerHigh) ;

    fDegree = get<0>(value) ;    // 직선의 방정식의 기울기 
    fYvalue = get<1>(value) ;    // 직선의 방정식의 Y 절편 

    if(fDegree == 0) result = -1 ;
    else
    {
        try
        {
            result = -fYvalue / fDegree ;    // 직선의 방정식에서 X 절편값 계산(Ith)
        }
        catch(...)
        {
            result = -1 ;
        }
    }

    return result ;
}
//---------------------------------------------------------------------------
tuple<float, float> __fastcall CLIV_Calculate_Data::LeastSquare(const vector<float>& xAxis, const vector<float>& yAxis, const float lowValue, const float highValue)
{
    float sumx=0, sumy=0, sumxx=0, sumxy=0 ;
    float mother, child1, child2 ;
    float rDegree, rYvalue ;
    int index = 0, length = 0 ;

    auto endIt = cend(yAxis) ;
    auto startIt  = find_if(cbegin(yAxis), endIt, [lowValue](float i){ return i >= lowValue ; }) ;
    auto finishIt = find_if(cbegin(yAxis), endIt, [highValue](float i){ return i >= highValue ; }) ;

    if(finishIt == endIt)
    {
        rDegree = rYvalue = 0 ;
    }
    else
    {
        index = startIt - cbegin(yAxis);

        for(auto yIt = startIt ; yIt != finishIt ; ++yIt)
        {
            sumx += xAxis[index] ;
            sumy += *yIt ;
            sumxx += (xAxis[index] * xAxis[index]) ;
            sumxy += (xAxis[index] * (*yIt)) ;
            length ++ ;
            index ++ ;
        }

        mother = (length * sumxx) - (sumx * sumx) ;
        child1 = (length * sumxy) - (sumx * sumy) ;
        child2 = (sumxx  * sumy)  - (sumxy * sumx) ;

        if(mother == 0) rDegree = rYvalue = 0 ;
        else
        {
            rDegree = child1 / mother ;
            rYvalue = child2 / mother ;
        }
    }

    return make_tuple(rDegree, rYvalue) ;
}
//---------------------------------------------------------------------------

 

반응형

'Characteristics Data > LD(Laser Diode)' 카테고리의 다른 글

Laser Diode 의 Kink 특성값 계산 C++  (0) 2023.04.25

댓글()