1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
#include <string.h>
#include "haar.h"
HaarWavelet::HaarWavelet(int nNumPoints, int nLevel)
{
m_dRoot2 = 1.0 / 2.0;
m_pTape = new double[nNumPoints];
m_nNumPoints = nNumPoints;
m_nLevel = nLevel;
}
HaarWavelet::~HaarWavelet()
{
delete [] m_pTape;
}
void HaarWavelet::Transform(double* pBuf)
{
int nMidPoint = m_nNumPoints / 2;
int i = 0;
int j = 0;
// pass one to get the average vals
for (i = 0; i < m_nNumPoints; i += 2)
{
m_pTape[j] = pBuf[i] + pBuf[i+1];
m_pTape[j + nMidPoint] = pBuf[i] - pBuf[i+1];
j++;
}
// seperate the multiply into 4 part sections, to speed up fpu usage
for (i = 0; i < m_nNumPoints; i+=4)
{
m_pTape[i] *= m_dRoot2;
m_pTape[i+1] *= m_dRoot2;
m_pTape[i+2] *= m_dRoot2;
m_pTape[i+3] *= m_dRoot2;
}
//Print();
if (m_nLevel > 1)
{
int nStop = 0;
int nLevel = 1;
double* dTemp = new double[nMidPoint];
while (nLevel < m_nLevel)
{
nStop = nMidPoint;
nMidPoint /= 2;
memcpy(dTemp, m_pTape, sizeof(double)*nStop);
j = 0;
for (i = 0; i < nStop; i+=2)
{
dTemp[j] = m_pTape[i] + m_pTape[i+1];
dTemp[nMidPoint+j] = m_pTape[i] - m_pTape[i+1];
j++;
}
memcpy(m_pTape, dTemp, sizeof(double)*nStop);
for (i = 0; i < nStop; i += 2)
{
m_pTape[i] *= m_dRoot2;
m_pTape[i+1] *= m_dRoot2;
}
nLevel++;
//Print();
}
delete [] dTemp;
}
}
|