Beispiel #1
0
        /// <summary>
        /// Forward short-time Fourier Transform.
        /// </summary>
        /// <param name="A">Array</param>
        /// <returns>Array</returns>
        public Complex32[] Forward(Complex32[] A)
        {
            // params
            int N = A.Length, i, j;

            Complex32[] B     = new Complex32[N];
            int         frame = coefs.Length;

            // Short-Time Fourier Transform
            for (i = 0; i < N; i += frame)
            {
                Complex32[] data = new Complex32[frame];

                for (j = 0; j < frame; j++)
                {
                    data[j] = A[i + j] * coefs[Maths.Mod(i - frame / 2, frame)];
                }

                data = FFT.Forward(data);

                for (j = 0; j < frame; j++)
                {
                    B[i + j] = data[j];
                }
            }

            return(B);
        }
Beispiel #2
0
        /// <summary>
        /// Forward Zak transform.
        /// </summary>
        /// <param name="A">Array</param>
        /// <returns>Array</returns>
        public float[] Forward(float[] A)
        {
            // Fast shaping orthogonalization algorithm
            // WH functions using a discrete Zak transform.
            // V.P. Volchkov, D.A. Petrov and V.M. Asiryan.
            // http://www.conf.mirea.ru/CD2017/pdf/p4/66.pdf

            int N = A.Length;

            float[] vort = new float[N];
            int     L = N / M, L2 = L * 2, i, j;

            Complex32[,] G = new Complex32[L2, N];
            Complex32[,] Z;

            for (i = 0; i < L2; i++)
            {
                for (j = 0; j < N; j++)
                {
                    G[i, j] = A[Maths.Mod(j + M / 2 * i, N)];
                }
            }

            if (Maths.IsPower(L2, 2))
            {
                Z = FFT.Forward(G);
            }
            else
            {
                Z = DFT.Forward(G);
            }

            float     w = 2 / (float)Math.Sqrt(M);
            float     even, odd, phi;
            Complex32 z1, z2;

            for (i = 0; i < L; i++)
            {
                for (j = 0; j < N; j++)
                {
                    z1 = Z[i, j];
                    z2 = Z[L + i, j];

                    even = (float)Math.Pow(z1.Abs, 2);
                    odd  = (float)Math.Pow(z2.Abs, 2);
                    phi  = w / (float)Math.Sqrt(even + odd);

                    Z[i, j]     = z1 * phi;
                    Z[L + i, j] = z2 * phi;
                }
            }

            Complex32 sum;

            for (i = 0; i < N; i++)
            {
                sum = 0;
                for (j = 0; j < L2; j++)
                {
                    sum += Z[j, i];
                }
                vort[i] = (sum / L2).Real;
            }

            return(vort);
        }