Ejemplo n.º 1
0
/**
* \brief         Generates points based on selected signal type
* \param[out]    -
* \param[in]     Signal Type
* \return        void
* \authors       Arunkumar Karri
* \date          03.02.2012 Created
*/
void CSignalDefinerDlg::vGenerateWave()
{
    UpdateData();

    SIGNAL_TYPE enSignalType = (SIGNAL_TYPE)(m_ctrSignalType.GetCurSel());
    int nPointCount;
    double dblFrqStep, dblTimePeriod;

    /*Setting the Frequency Resolution to nResolution*/
    dblFrqStep = m_dblSamplingTimePeriod;

    /* Calculate Time period per each cycle */
    dblTimePeriod = 1 / m_fFrequency;

    //Calculate number of points to be plotted
    nPointCount = ((dblTimePeriod * 1000) + (dblFrqStep / 10)) * (m_nSelCycle+1);

    /*For variant packing purpose*/
    CComVariant varrX, varrY;
    varrX.parray = SafeArrayCreateVector(VT_R8, 0, nPointCount);
    if(varrX.parray == NULL)
    {
        return;
    }
    varrX.vt = VT_ARRAY|VT_R8;

    varrY.parray = SafeArrayCreateVector(VT_R8, 0, nPointCount);
    if(varrY.parray == NULL)
    {
        return;
    }
    varrY.vt = VT_ARRAY|VT_R8;

    LONG lngCount = 0;

    if(dblFrqStep > 0)
    {
        /*Currently using the Peak to Peak Amplitude as 0 to 2*Amplitude
        instead of -Amplitude to +Amplitude*/
        for(double dblCounter=0; dblCounter<nPointCount; dblCounter+=dblFrqStep)
        {
            double dblX, dblY;
            dblCounter /= 1000;
            switch(enSignalType)
            {
                case SINE_WAVE:
                    dblX = dblCounter*1000;

                    dblY = m_fAmplitude +
                           m_fAmplitude * sin( DegreesToRadians(2 * 180 * m_fFrequency * dblCounter) );

                    break;
                case COS_WAVE:
                    dblX = dblCounter*1000;

                    dblY = m_fAmplitude +
                           m_fAmplitude * cos( DegreesToRadians(2 * 180 * m_fFrequency * dblCounter) );
                    break;
                case TRIANGULAR_WAVE:
                    double dblSamplingPoint;
                    dblSamplingPoint = dblCounter;
                    while ( dblSamplingPoint > dblTimePeriod )
                    {
                        dblSamplingPoint -= dblTimePeriod;
                    }
                    dblX = dblCounter*1000;
                    dblY = m_fAmplitude +
                           CalculateYatXForTriangleWave(dblSamplingPoint, m_fAmplitude, dblTimePeriod);

                    break;
            }
            HRESULT hr;
            hr = SafeArrayPutElement(varrX.parray, &lngCount, &dblX);
            hr = SafeArrayPutElement(varrY.parray, &lngCount, &dblY);
            lngCount++;

            dblCounter *= 1000;
        }
    }

    SetGraphData(&varrX, &varrY);
}
Ejemplo n.º 2
0
/**
* \brief         Generates points based on selected signal type
* \param[out]    -
* \param[in]     Signal Type
* \return        void
* \authors       Arunkumar Karri
* \date          03.02.2012 Created
*/
void CSignalDefinerDlg::vGenerateWave()
{
    UpdateData();

    SIGNAL_TYPE enSignalType = (SIGNAL_TYPE)(m_ctrSignalType.GetCurSel());
    int nPointCount;
    double dblFrqStep, dblTimePeriod, dblSamplingPoint;;

    /*Setting the Frequency Resolution to nResolution*/
    dblFrqStep = m_dblSamplingTimePeriod;

    /* Calculate Time period per each cycle */
    dblTimePeriod = 1 / m_fFrequency;

    if(m_fFrequency == 0.0)
    {
        (GetDlgItem(IDC_EDIT_SIGNAL_FREQUENCY))->SetFocus();
        return;
    }
    //Calculate number of points to be plotted
    nPointCount = ((dblTimePeriod * 1000) + (dblFrqStep / 10)) * (m_nSelCycle+1);

    if(m_btnAutoCorrect.GetCheck() == BST_CHECKED )
    {
        if((nPointCount/(dblFrqStep*(m_nSelCycle+1))) < 8)          //the no. of points in a cycle should be more than 8 to plot a proper graph
        {
            dblFrqStep = nPointCount/(9* (m_nSelCycle+1)); //set the number of required points to 9
            if(dblFrqStep > MAX_SAMPLING_TIME_PERIOD)
            {
                (GetDlgItem(IDC_EDIT_SIGNAL_FREQUENCY))->SetFocus();
                return;
            }
            if(dblFrqStep < 1)
            {
                (GetDlgItem(IDC_EDIT_SIGNAL_FREQUENCY))->SetFocus();
                return;
            }
            m_dblSamplingTimePeriod = dblFrqStep;
            CString omSamplingPeriod;
            omSamplingPeriod.Format(_T("%d"),(int)m_dblSamplingTimePeriod);
            SetDlgItemText(IDC_EDIT_SIGNAL_SAMPLING_TIME, omSamplingPeriod);            //This command will call this function continously, hence the above logic.
            nPointCount = ((dblTimePeriod * 1000) + (dblFrqStep / 10)) * (m_nSelCycle+1);
        }
    }
    else if(m_btnAutoCorrect.GetCheck() == BST_UNCHECKED )
    {
        if(m_fFrequency > MAX_FREQUENCY)
        {
            (GetDlgItem(IDC_EDIT_SIGNAL_FREQUENCY))->SetFocus();
            return;
        }
        if(dblFrqStep == 0)
        {
            (GetDlgItem(IDC_EDIT_SIGNAL_FREQUENCY))->SetFocus();
            return;
        }
        if(dblFrqStep > MAX_SAMPLING_TIME_PERIOD)
        {
            (GetDlgItem(IDC_EDIT_SIGNAL_FREQUENCY))->SetFocus();
            return;
        }
    }
    /*For variant packing purpose*/
    CComVariant varrX, varrY;
    varrX.parray = SafeArrayCreateVector(VT_R8, 0, nPointCount);
    if(varrX.parray == NULL)
    {
        return;
    }
    varrX.vt = VT_ARRAY|VT_R8;

    varrY.parray = SafeArrayCreateVector(VT_R8, 0, nPointCount);
    if(varrY.parray == NULL)
    {
        return;
    }
    varrY.vt = VT_ARRAY|VT_R8;

    LONG lngCount = 0;

    if(dblFrqStep > 0)
    {
        /*Currently using the Peak to Peak Amplitude as 0 to 2*Amplitude
        instead of -Amplitude to +Amplitude*/
        for(double dblCounter=0; dblCounter<nPointCount; dblCounter+=dblFrqStep)
        {
            double dblX, dblY;
            dblCounter /= 1000;
            switch(enSignalType)
            {
                case SINE_WAVE:
                    dblX = dblCounter*1000;

                    dblY = m_fAmplitude +
                           m_fAmplitude * sin( DegreesToRadians(2 * 180 * m_fFrequency * dblCounter) );

                    break;
                case COS_WAVE:
                    dblX = dblCounter*1000;

                    dblY = m_fAmplitude +
                           m_fAmplitude * cos( DegreesToRadians(2 * 180 * m_fFrequency * dblCounter) );
                    break;
                case TRIANGULAR_WAVE:
                    dblSamplingPoint = dblCounter;
                    while ( dblSamplingPoint > dblTimePeriod )
                    {
                        dblSamplingPoint -= dblTimePeriod;
                    }
                    dblX = dblCounter*1000;
                    dblY = m_fAmplitude +
                           CalculateYatXForTriangleWave(dblSamplingPoint, m_fAmplitude, dblTimePeriod);

                    break;
                case SAWTOOTH_WAVE:
                    dblSamplingPoint = dblCounter;
                    while ( dblSamplingPoint > dblTimePeriod )
                    {
                        dblSamplingPoint -= dblTimePeriod;
                    }
                    dblX = dblCounter*1000;
                    dblY = m_fAmplitude +   (((2 * m_fAmplitude * dblSamplingPoint)/dblTimePeriod )-  m_fAmplitude);/* Sawtooth :((2A t /T) - A) */

                    break;
            }
            HRESULT hr;
            hr = SafeArrayPutElement(varrX.parray, &lngCount, &dblX);
            hr = SafeArrayPutElement(varrY.parray, &lngCount, &dblY);
            lngCount++;

            if ( (dblY >= 2* m_fAmplitude) && enSignalType == SAWTOOTH_WAVE )
            {
                dblY = 0;
                hr = SafeArrayPutElement(varrX.parray, &lngCount, &dblX);
                hr = SafeArrayPutElement(varrY.parray, &lngCount, &dblY);
                lngCount++;
            }
            dblCounter *= 1000;
        }
    }

    SetGraphData(&varrX, &varrY);
}