public List<Vector<double>> ListDWT(Vector<double> signal, int n, Wavelet_Type waveType)
{
double[] Hfilter = { 0 };
double[] Lfilter = { 0 };
int filterSize = 0;
//generated from wfilters Matlab function
switch (waveType)
{
case Wavelet_Type.haar:
return ListHaarDWT(signal, n);
case Wavelet_Type.db2:
Hfilter = new double []{ -0.482962913144690 , 0.836516303737469, -0.224143868041857 ,-0.129409522550921};
Lfilter = new double[] { -0.129409522550921, 0.224143868041857, 0.836516303737469, 0.482962913144690 };
filterSize = 4;
break;
case Wavelet_Type.db3:
Hfilter = new double[] { -0.332670552950957, 0.806891509313339, - 0.459877502119331, - 0.135011020010391, 0.0854412738822415, 0.0352262918821007 };
Lfilter = new double[] { 0.0352262918821007, - 0.0854412738822415, - 0.135011020010391, 0.459877502119331, 0.806891509313339, 0.332670552950957 };
filterSize = 6;
break;
}
int decompSize = signal.Count();
Vector<double> outVec = Vector<double>.Build.Dense(decompSize);
Vector<double> signalTemp = signal;
List<Vector<double>> listOut = new List<Vector<double>>();
for (int i = 0; i < n; i++)
{
decompSize /= 2;
for (int dataInd = 0; dataInd < decompSize; dataInd++)
{
outVec[dataInd] = 0;
outVec[decompSize + dataInd] = 0;
for( int filtIt = 0; filtIt < filterSize && (2*dataInd + filtIt) < signalTemp.Count ; filtIt++)
{
outVec[dataInd] += signalTemp[2 * dataInd + filtIt]*Lfilter[filterSize - filtIt - 1] ;
outVec[decompSize + dataInd] += signalTemp[2 * dataInd + filtIt]* Hfilter[filterSize - filtIt - 1];
}
}
signalTemp = outVec.SubVector(0, decompSize);
listOut.Add(outVec.SubVector(decompSize, decompSize));
}
return listOut;
}