CSharpSynth.Wave.WaveHelper.ReSample C# (CSharp) Метод

ReSample() публичный статический Метод

public static ReSample ( int NewRate, int OldRate, float data ) : ].float[
NewRate int
OldRate int
data float
Результат ].float[
        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;
        }