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

📄 newsignal.cpp

📁 Intel开发的IPP库的应用例程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
//
//               INTEL CORPORATION PROPRIETARY INFORMATION
//  This software is supplied under the terms of a license agreement or
//  nondisclosure agreement with Intel Corporation and may not be copied
//  or disclosed except in accordance with the terms of that agreement.
//        Copyright(c) 1999-2006 Intel Corporation. All Rights Reserved.
//
*/

// NewSignal.cpp: implementation of the CNewSignal class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ippsDemo.h"
#include "NewSignal.h"
#include "NewSignalDlg.h"
#include "Vector.h"
#include "ippsRun.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define STS_CALL(Func, Args) { \
   IppStatus status = Func Args; \
   if (status != ippStsNoErr) { \
      CippsRun::IppErrorMessage(#Func, status); \
      if (status < 0) return FALSE; \
   } \
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CNewSignal::CNewSignal()
{
   m_Form = newJaehne;
   m_Type = pp16s;
   m_Length = 512;
   m_Offset = 0;

   InitTone();
   InitTrian();
   InitJaehne();
   InitRandU();
   InitRandN();
   InitSpike();
}

CNewSignal::~CNewSignal()
{

}


void CNewSignal::InitTone() {
   int form = newTone;
   CDlgItem item;
   CValue value;

   InitMagn(value);
   item.Set(CDlgItem::varReal,value,"Magnitude");
   m_FormItems[form].Add(item);

   value.Init(pp32f, 0.02);
   item.Set(value,"Frequency (0 : 1)");
   m_FormItems[form].Add(item);

   value.Init(pp32f, 0);
   item.Set(value,"Phase (0 : 2)","PI");
   m_FormItems[form].Add(item);
}

BOOL CNewSignal::SetTone(CVector* pVector) 
{
   int form = newTone;
   CValue magnValue = m_FormItems[form][0].m_value;
   double rfreq = m_FormItems[form][1].m_value.GetDouble();
   double phase64 = m_FormItems[form][2].m_value.GetDouble() * (double)IPP_PI;
   float  phase32 = (float)phase64;
   double magn;
   magnValue.Get(magn);

   void* pDst = pVector->GetData();
   switch (m_Type) {
   case pp8u:
   case pp8s:   
   case pp16u:   
      pDst = ippMalloc(m_Length<<2); break;
   case pp8sc:  
      pDst = ippMalloc(m_Length<<3); break;
   case pp32u:  
   case pp32s:  
   case pp64s:  
      pDst = ippMalloc(m_Length<<3); break;
   case pp32sc: 
   case pp64sc: 
      pDst = ippMalloc(m_Length<<4); break;
   }

   switch (m_Type) {
   case pp8u:
   case pp8s:
   case pp16u:   
   case pp32f:
      STS_CALL(ippsTone_Direct_32f,(
         (Ipp32f*)pDst, m_Length, (Ipp32f)magn,
         (float)rfreq, &phase32, ippAlgHintFast))
      break;
   case pp8sc:
   case pp32fc:
      STS_CALL(ippsTone_Direct_32fc,(
         (Ipp32fc*)pDst, m_Length, (Ipp32f)magn,
         (float)rfreq, &phase32, ippAlgHintFast))
      break;
   case pp32u:
   case pp32s:
   case pp64s:
   case pp64f:
      STS_CALL(ippsTone_Direct_64f,(
         (Ipp64f*)pDst, m_Length, (Ipp64f)magn,
         rfreq, &phase64, ippAlgHintFast))
      break;
   case pp32sc:
   case pp64sc:
   case pp64fc:
      STS_CALL(ippsTone_Direct_64fc,(
         (Ipp64fc*)pDst, m_Length, (Ipp64f)magn,
         rfreq, &phase64, ippAlgHintFast))
      break;
   case pp16s:
      STS_CALL(ippsTone_Direct_16s,(
         (Ipp16s*)pDst, m_Length, (Ipp16s)magn,
         (float)rfreq, &phase32, ippAlgHintFast))
      break;
   case pp16sc:
      STS_CALL(ippsTone_Direct_16sc,(
         (Ipp16sc*)pDst, m_Length, (Ipp16s)magn,
         (float)rfreq, &phase32, ippAlgHintFast))
      break;
   default:
      return FALSE;
   }
   int len = (m_Type & PP_CPLX) ? m_Length*2 : m_Length;
   switch (m_Type) {
   case pp8u:
      STS_CALL(ippsAddC_32f_I,(
         -IPP_MIN_8S, (Ipp32f*)pDst, m_Length))
      STS_CALL(ippsConvert_32f8u_Sfs,(
         (Ipp32f*)pDst, (Ipp8u*)pVector->GetData(),
         len, ippRndNear, 0))
      break;
   case pp16u:   
      STS_CALL(ippsAddC_32f_I,(
         -IPP_MIN_16S, (Ipp32f*)pDst, m_Length))
      STS_CALL(ippsConvert_32f16u_Sfs,(
         (Ipp32f*)pDst, (Ipp16u*)pVector->GetData(),
         len, ippRndNear, 0))
      break;
   case pp8s:   
   case pp8sc: 
      STS_CALL(ippsConvert_32f8s_Sfs,(
         (Ipp32f*)pDst, (Ipp8s*)pVector->GetData(),
         len, ippRndNear, 0))
      break;
   case pp32s:  
   case pp32sc:
      STS_CALL(ippsConvert_64f32s_Sfs,(
         (Ipp64f*)pDst, (Ipp32s*)pVector->GetData(),
         len, ippRndNear, 0))
      break;
   case pp32u:  
      {
         Ipp32u* p32u = (Ipp32u*)pVector->GetData();
         Ipp64f* p64f = (Ipp64f*)pDst;
         for (int i=0; i<len; i++)
            p32u[i] = (Ipp32u)(p64f[i] - IPP_MIN_32S);
      }
      break;
   case pp64s:  
   case pp64sc:  
      {
         Ipp64s* p64s = (Ipp64s*)pVector->GetData();
         Ipp64f* p64f = (Ipp64f*)pDst;
         for (int i=0; i<len; i++)
            p64s[i] = (Ipp64s)(p64f[i]);
      }
      break;
   }
   if (pDst != pVector->GetData()) ippFree(pDst);
   return TRUE;
}

void CNewSignal::InitTrian() {
   int form = newTrian;
   CDlgItem item;
   CValue value;

   InitMagn(value);
   item.Set(CDlgItem::varReal,value,"Magnitude");
   m_FormItems[form].Add(item);

   value.Init(pp32f, 0.02);
   item.Set(value,"Frequency (0 : 1)");
   m_FormItems[form].Add(item);

   value.Init(pp32f, 0);
   item.Set(value,"Phase (0 : 2)","PI");
   m_FormItems[form].Add(item);

   value.Init(pp32f, 0);
   item.Set(value,"Asymmetry (-1 : 1)","PI");
   m_FormItems[form].Add(item);
}

BOOL CNewSignal::SetTrian(CVector* pVector) 
{
   int form = newTrian;
   CValue magnValue = m_FormItems[form][0].m_value;
   double rfreq = m_FormItems[form][1].m_value.GetDouble();
   double phase64 = m_FormItems[form][2].m_value.GetDouble() * (double)IPP_PI;
   float  phase32 = (float)phase64;
   double asym  = m_FormItems[form][3].m_value.GetDouble() * (double)IPP_PI;
   double magn;
   magnValue.Get(magn);

   void* pDst = pVector->GetData();
   switch (m_Type) {
   case pp8u:
   case pp8s:   
   case pp16u:   
      pDst = ippMalloc(m_Length<<2); break;
   case pp8sc:  
      pDst = ippMalloc(m_Length<<3); break;
   case pp32u:  
   case pp32s:  
   case pp64s:  
      pDst = ippMalloc(m_Length<<3); break;
   case pp32sc: 
   case pp64sc: 
      pDst = ippMalloc(m_Length<<4); break;
   }

   switch (m_Type) {
   case pp8u:
   case pp8s:
   case pp16u:   
   case pp32f:
      STS_CALL(ippsTriangle_Direct_32f,(
         (Ipp32f*)pDst, m_Length, (Ipp32f)magn,
         (float)rfreq, (float)asym, &phase32))
      break;
   case pp8sc:
   case pp32fc:
      STS_CALL(ippsTriangle_Direct_32fc,(
         (Ipp32fc*)pDst, m_Length, (Ipp32f)magn,
         (float)rfreq, (float)asym, &phase32))
      break;
   case pp32u:
   case pp32s:
   case pp64s:
   case pp64f:
      STS_CALL(ippsTriangle_Direct_64f,(
         (Ipp64f*)pDst, m_Length, (Ipp64f)magn,
         (float)rfreq, (float)asym, &phase64))
      break;
   case pp32sc:
   case pp64sc:
   case pp64fc:
      STS_CALL(ippsTriangle_Direct_64fc,(
         (Ipp64fc*)pDst, m_Length, (Ipp64f)magn,
         (float)rfreq, (float)asym, &phase64))
      break;
   case pp16s:
      STS_CALL(ippsTriangle_Direct_16s,(
         (Ipp16s*)pDst, m_Length, (Ipp16s)magn,
         (float)rfreq, (float)asym, &phase32))
      break;
   case pp16sc:
      STS_CALL(ippsTriangle_Direct_16sc,(
         (Ipp16sc*)pDst, m_Length, (Ipp16s)magn,
         (float)rfreq, (float)asym, &phase32))
      break;
   default:
      return FALSE;
   }

   int len = (m_Type & PP_CPLX) ? m_Length*2 : m_Length;
   switch (m_Type) {
   case pp8u:
      STS_CALL(ippsAddC_32f_I,(
         -IPP_MIN_8S, (Ipp32f*)pDst, m_Length))
      STS_CALL(ippsConvert_32f8u_Sfs,(
         (Ipp32f*)pDst, (Ipp8u*)pVector->GetData(),
         len, ippRndNear, 0))
      break;
   case pp16u:   
      STS_CALL(ippsAddC_32f_I,(
         -IPP_MIN_16S, (Ipp32f*)pDst, m_Length))
      STS_CALL(ippsConvert_32f16u_Sfs,(
         (Ipp32f*)pDst, (Ipp16u*)pVector->GetData(),
         len, ippRndNear, 0))
      break;
   case pp8s:   
   case pp8sc: 
      STS_CALL(ippsConvert_32f8s_Sfs,(
         (Ipp32f*)pDst, (Ipp8s*)pVector->GetData(),
         len, ippRndNear, 0))
      break;
   case pp32s:  
   case pp32sc:
      STS_CALL(ippsConvert_64f32s_Sfs,(
         (Ipp64f*)pDst, (Ipp32s*)pVector->GetData(),
         len, ippRndNear, 0))
      break;
   case pp32u:  
      {
         Ipp32u* p32u = (Ipp32u*)pVector->GetData();
         Ipp64f* p64f = (Ipp64f*)pDst;
         for (int i=0; i<len; i++)
            p32u[i] = (Ipp32u)(p64f[i] - IPP_MIN_32S);
      }
      break;
   case pp64s:  
   case pp64sc:  
      {
         Ipp64s* p64s = (Ipp64s*)pVector->GetData();
         Ipp64f* p64f = (Ipp64f*)pDst;
         for (int i=0; i<len; i++)
            p64s[i] = (Ipp64s)(p64f[i]);
      }
      break;
   }
   if (pDst != pVector->GetData()) ippFree(pDst);
   return TRUE;
}

void CNewSignal::InitJaehne() {
   int form = newJaehne;
   CDlgItem item;
   CValue value;

   InitMagn(value);
   item.Set(CDlgItem::varReal,value,"Magnitude");
   m_FormItems[form].Add(item);
}

BOOL CNewSignal::SetJaehne(CVector* pVector) 
{
   int form = newJaehne;
   CValue magnValue = m_FormItems[form][0].m_value;
   double magn;
   magnValue.Get(magn);

   void* pDst = pVector->GetData();
   switch (m_Type) {
   case pp8sc : pDst = ippMalloc(m_Length); break;
   case pp16sc: pDst = ippMalloc(m_Length<<1); break;
   case pp32sc: pDst = ippMalloc(m_Length<<2); break;
   case pp32fc: pDst = ippMalloc(m_Length<<2); break;
   case pp64s:
   case pp64sc:
   case pp64fc: pDst = ippMalloc(m_Length<<3); break;
   }

   switch (m_Type) {
   case pp8u:
      STS_CALL(ippsVectorJaehne_8u,((Ipp8u*) pDst, m_Length, (Ipp8u)magn ))
      break;
   case pp8s:
   case pp8sc :
      STS_CALL(ippsVectorJaehne_8s,((Ipp8s*) pDst, m_Length, (Ipp8s)magn ))
      break;
   case pp16u:
      STS_CALL(ippsVectorJaehne_16u,((Ipp16u*)pDst, m_Length, (Ipp16u)magn ))
      break;
   case pp16s:
   case pp16sc:
      STS_CALL(ippsVectorJaehne_16s,((Ipp16s*)pDst, m_Length, (Ipp16s)magn ))
      break;
   case pp32u:
      STS_CALL(ippsVectorJaehne_32u,((Ipp32u*)pDst, m_Length, (Ipp32u)magn ))
      break;
   case pp32s:
   case pp32sc:
      STS_CALL(ippsVectorJaehne_32s,((Ipp32s*)pDst, m_Length, (Ipp32s)magn ))
      break;
   case pp32f:
   case pp32fc:
      STS_CALL(ippsVectorJaehne_32f,((Ipp32f*)pDst, m_Length, (Ipp32f)magn))
      break;
   case pp64f:
   case pp64fc:
   case pp64s:
   case pp64sc:
      STS_CALL(ippsVectorJaehne_64f,((Ipp64f*)pDst, m_Length, (Ipp64f)magn))
      break;
   default:
      return FALSE;
   }

   switch (m_Type) {
   case pp8sc :
      {
         Ipp8s * pReal = (Ipp8s*)pDst;
         Ipp8sc* pCplx = (Ipp8sc*)pVector->GetData();
         for (int i=0; i<m_Length; i++) {
            (pCplx[i]).re = pReal[i];
            (pCplx[i]).im = pReal[i];
         }
      }
      break;
   case pp16sc:
      STS_CALL(ippsRealToCplx_16s,( (Ipp16s*)pDst,
         (Ipp16s*)pDst, (Ipp16sc*)pVector->GetData(), m_Length ))
      break;
   case pp32sc:
   case pp32fc:
      STS_CALL(ippsRealToCplx_32f,( (Ipp32f*)pDst,
         (Ipp32f*)pDst, (Ipp32fc*)pVector->GetData(), m_Length ))
      break;
   case pp64fc:
      STS_CALL(ippsRealToCplx_64f,( (Ipp64f*)pDst,
         (Ipp64f*)pDst, (Ipp64fc*)pVector->GetData(), m_Length ))
      break;
   case pp64s:
      {
         Ipp64f* p64f = (Ipp64f*)pDst;
         Ipp64s* p64s = (Ipp64s*)pVector->GetData();
         for (int i=0; i<m_Length; i++)
            p64s[i] = (Ipp64s)p64f[i];
      }
      break;
   case pp64sc:
      {
         Ipp64f * pReal = (Ipp64f*)pDst;
         Ipp64sc* pCplx = (Ipp64sc*)pVector->GetData();
         for (int i=0; i<m_Length; i++) {
            (pCplx[i]).re = (Ipp64s)pReal[i];
            (pCplx[i]).im = (Ipp64s)pReal[i];
         }
      }
      break;
   }
   if (pDst != pVector->GetData()) ippFree(pDst);
   return TRUE;
}

⌨️ 快捷键说明

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