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

📄 newtaps.cpp

📁 Intel开发的IPP库的应用例程
💻 CPP
字号:
/*
//
//               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.
//
*/

// NewTaps.cpp: implementation of the CNewTaps class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ippsDemo.h"
#include "ippsRun.h"
#include "NewTaps.h"
#include "NewTapsDlg.h"


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

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

CNewTaps::CNewTaps()
{
   m_Type = pp32f;
   m_Filter = 0;
   m_length = 27;
   m_freqLow = 0.2;
   m_freqHigh = 0.3;
}

CNewTaps::~CNewTaps()
{

}

BOOL CNewTaps::Dialog()
{
   CNewTapsDlg dlg;
   dlg.m_Type     = m_Type    ;
   dlg.m_Filter   = m_Filter  ;
   dlg.m_length   = m_length  ;
   dlg.m_freqLow  = m_freqLow ;
   dlg.m_freqHigh = m_freqHigh;
   if (dlg.DoModal() != IDOK) return FALSE;
   m_Type     = dlg.m_Type    ;
   m_Filter   = dlg.m_Filter  ;
   m_length   = dlg.m_length  ;
   m_freqLow  = dlg.m_freqLow ;
   m_freqHigh = dlg.m_freqHigh;
   return TRUE;
}

static BOOL SetFIRTaps(Ipp64f* pTaps, int len, Ipp64f freqLow, Ipp64f freqHigh, int filter)
{
   IppWinType winType = ippWinHamming;
   switch (filter) {
   case CNewTapsDlg::FILTER_LOW:
      CHECK_CALL(ippsFIRGenLowpass_64f,(freqLow, pTaps, len, winType, ippTrue));
      break;
   case CNewTapsDlg::FILTER_HIGH:
      CHECK_CALL(ippsFIRGenHighpass_64f,(freqHigh, pTaps, len, winType, ippTrue));
      break;
   case CNewTapsDlg::FILTER_BANDPASS:
      CHECK_CALL(ippsFIRGenBandpass_64f,(freqLow, freqHigh, pTaps, len, winType, ippTrue));
      break;
   case CNewTapsDlg::FILTER_BANDSTOP:
      CHECK_CALL(ippsFIRGenBandstop_64f,(freqLow, freqHigh, pTaps, len, winType, ippTrue));
      break;
   }
   return TRUE;
}

static Ipp64f* SetFIRTaps_NoZero(Ipp64f* pTaps, int len, Ipp64f freqLow, Ipp64f freqHigh, int filter)
{
   Ipp64f eps = 1.e-12;
   int offset = 0;
   if (!SetFIRTaps(pTaps, len, freqLow, freqHigh, filter)) return NULL;
//   if (pTaps[0] > eps) 
      return pTaps;
   if (!SetFIRTaps(pTaps, len + 2, freqLow, freqHigh, filter)) return NULL;
   return pTaps + 1;
}


int scaleTapsTo32s(Ipp64f* pTaps, int len)
{
   double max, min;

   ippsMax_64f(pTaps, len, &max);
   ippsMin_64f(pTaps, len, &min);
   if (max < -min) max = -min;

   int tapsFactor = 0;
   double mpy = 1;
   if (max > IPP_MAX_32S) {
       while (max > IPP_MAX_32S) {
           tapsFactor++;
           max *= 0.5;
           mpy *= 0.5;
       }
   } else {
       while ((max < IPP_MAX_32S) && (tapsFactor > -17)) {
           tapsFactor--;
           max += max;
           mpy += mpy;
       }
       tapsFactor++;
       mpy *= 0.5;
   }
   ippsMulC_64f_I(mpy, pTaps, len);
   return tapsFactor;
}

BOOL CNewTaps::CreateVector(CVector* pVector) 
{
   const Ipp64f Q15 = IPP_MAX_16S;
   int len = (m_Filter == CNewTapsDlg::FILTER_NONE) ? 0 : m_length;
   pVector->Init(m_Type, len);
   if (len <= 0) return TRUE;
   Ipp64f* pBuffer = new Ipp64f[len + 2];
   Ipp64f* pTaps = SetFIRTaps_NoZero(pBuffer, len, m_freqLow, m_freqHigh, m_Filter);
   if (!pTaps) {
      delete[] pBuffer;
      return FALSE;
   }
   void* pData = pVector->GetData();
   void* pRe = NULL;
   void* pIm = NULL;
   switch (m_Type) {
   case pp64f:
      ippsCopy_64f(pTaps, (Ipp64f*)pData, len);
      break;
   case pp64fc:
      pIm = new Ipp64f[len];
      ippsZero_64f((Ipp64f*)pIm,len);
      ippsRealToCplx_64f(pTaps, (Ipp64f*)pIm, (Ipp64fc*)pData, len);
      break;
   case pp32f:
      ippsConvert_64f32f(pTaps, (Ipp32f*)pData, len);
      break;
   case pp32fc:
      pRe = new Ipp32f[len];
      pIm = new Ipp32f[len];
      ippsConvert_64f32f(pTaps, (Ipp32f*)pRe, len);
      ippsZero_32f((Ipp32f*)pIm,len);
      ippsRealToCplx_32f((Ipp32f*)pRe, (Ipp32f*)pIm, (Ipp32fc*)pData, len);
      break;
   case pp32s:
      pVector->SetTapsFactor(scaleTapsTo32s(pTaps, len));
      ippsConvert_64f32s_Sfs(pTaps, (Ipp32s*)pData, len, ippRndNear, 0);
      break;
   case pp32sc:
      pVector->SetTapsFactor(scaleTapsTo32s(pTaps, len));
      pIm = new Ipp32s[len];
      pRe = new Ipp32s[len];
      ippsConvert_64f32s_Sfs(pTaps, (Ipp32s*)pRe, len, ippRndNear, 0);
      ippsZero_32f((Ipp32f*)pIm,len);
      ippsRealToCplx_32f((Ipp32f*)pRe, (Ipp32f*)pIm, (Ipp32fc*)pData, len);
      break;
   case pp16s:
      ippsMulC_64f_I(Q15, pTaps, len);
      pIm = new Ipp32f[len];
      ippsConvert_64f32f(pTaps, (Ipp32f*)pIm, len);
      ippsConvert_32f16s_Sfs((Ipp32f*)pIm, (Ipp16s*)pData, len, ippRndNear, 0);
      break;
   case pp16sc:
      ippsMulC_64f_I(Q15, pTaps, len);
      pIm = new Ipp32f[len];
      pRe = new Ipp16s[len];
      ippsConvert_64f32f(pTaps, (Ipp32f*)pIm, len);
      ippsConvert_32f16s_Sfs((Ipp32f*)pIm, (Ipp16s*)pRe, len, ippRndNear, 0);
      delete[] pIm;
      pIm = new Ipp16s[len];
      ippsZero_16s((Ipp16s*)pIm,len);
      ippsRealToCplx_16s((Ipp16s*)pRe, (Ipp16s*)pIm, (Ipp16sc*)pData, len);
      break;
   }
   if (pRe) delete[] pRe;
   if (pIm) delete[] pIm;
   return TRUE;
}

⌨️ 快捷键说明

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