public static float[,] ReSample(int NewRate, int OldRate, float[,] data)
{
if (NewRate == OldRate)
return data;
int a = NewRate, b = OldRate, r;
//finds the biggest factor between the rates
while (b != 0)
{
r = a % b;
a = b;
b = r;
}
NewRate = NewRate / a;
OldRate = OldRate / a;
if (NewRate < OldRate) //DownSample
{
if (OldRate % NewRate == 0) //Simple DownSample
{
data = BiQuadLowPass.OfflineProcess(NewRate * a, (NewRate * a) / 2.0, 1, data);
data = DownSample(OldRate / NewRate, data);
}
else //UpSample then DownSample
{
data = UpSample(NewRate, data);
//filter here
double upCutOff = (OldRate * a) / 2.0;
double downCutOff = (NewRate * a) / 2.0;
if (upCutOff <= downCutOff)
data = BiQuadLowPass.OfflineProcess(NewRate * a, upCutOff, 1, data);
else
data = BiQuadLowPass.OfflineProcess(NewRate * a, downCutOff, 1, data);
data = DownSample(OldRate, data);
}
}
else if (NewRate > OldRate) //UpSample
{
if (NewRate % OldRate == 0) //Simple UpSample
{
data = UpSample(NewRate / OldRate, data);
data = BiQuadLowPass.OfflineProcess(NewRate * a, (OldRate * a) / 2.0, 1, data);
}
else //UpSample then DownSample
{
data = UpSample(NewRate, data);
//filter here
double upCutOff = (OldRate * a) / 2.0;
double downCutOff = (NewRate * a) / 2.0;
if (upCutOff <= downCutOff)
data = BiQuadLowPass.OfflineProcess(NewRate * a, upCutOff, 1, data);
else
data = BiQuadLowPass.OfflineProcess(NewRate * a, downCutOff, 1, data);
data = DownSample(OldRate, data);
}
}
return data;
}