public double[] TimeFiltration(int filterLength = 1025, double cutFreq = 550, int windowType = 2)
        {
            // d³ugoœæ sygna³u wynikowego bêdzie wynosi³a K(iloœæ próbek) + L(d³ugoœæ odpowiedzi impulsowej) - 1
            double[] result = new double[dataNormalized.Length + filterLength - 1];

            // obliczenie wspó³czynników filtra
            double[] filterFactors = SoundUtil.LowPassFilterFactors(cutFreq, sampleRate, filterLength);

            // wymno¿enie wspó³czynników przez funkcjê okna
            double[] filtered = SoundUtil.Windowing(filterFactors, windowType);

            List <float> data = dataNormalized.ToList();

            float[] zeros = new float[filterLength - 1];

            // uzupe³nienie okna zerami na pocz¹tku i koñcu
            data.InsertRange(0, zeros);
            data.AddRange(zeros);

            // wykonanie operacji splotu
            for (int i = filterLength - 1; i < data.Count; i++)
            {
                for (int j = 0; j < filtered.Length; j++)
                {
                    result[i - filterLength + 1] += data[i - j] * filtered[j];
                }
            }

            return(result);
        }