示例#1
0
        /// <summary>
        /// Извлечение данных из комплексной сонограммы (L+R)
        /// </summary>
        /// <param name="FFT_T"> Выходной набор векторов коэффициентов. </param>
        /// <param name="usePolyphase"> Использовать полифазное FFT? </param>
        /// <param name="fftObj"> Объект FFT, для которого вызывается функция. </param>
        /// <returns> Результат разбора выходных данных CFFT. </returns>
        public static CFFT_ExploreResult Explore(double[][] FFT_T, bool usePolyphase,
                                                 ExactFFT.CFFT_Object fftObj)
        {
            int plotRowsCount;
            CFFT_ExploreResult res;

            res = new CFFT_ExploreResult();

            if (FFT_T == null)
            {
                throw new Exception("ExactPlotter::Explore(): (FFT_T == null)");
            }

            // Считываем количество строк, которые имеет сонограмма...
            plotRowsCount = FFT_T.Length;

            // Подготавливаем выходные массивы...
            res.MagL    = new double[plotRowsCount][];
            res.MagR    = new double[plotRowsCount][];
            res.ACH     = new double[plotRowsCount][];
            res.ArgL    = new double[plotRowsCount][];
            res.ArgR    = new double[plotRowsCount][];
            res.PhaseLR = new double[plotRowsCount][];

            // Работаем по всем строкам сонограммы...
            Parallel.For(0, plotRowsCount, frame =>
            {
                // Количество гармоник в два раза меньше размера кадра FFT
                res.MagL[frame]    = new double[fftObj.N >> 1];
                res.MagR[frame]    = new double[fftObj.N >> 1];
                res.ACH[frame]     = new double[fftObj.N >> 1];
                res.ArgL[frame]    = new double[fftObj.N >> 1];
                res.ArgR[frame]    = new double[fftObj.N >> 1];
                res.PhaseLR[frame] = new double[fftObj.N >> 1];

                // Извлечение данных FFT из комплексной сонограммы
                ExactFFT.CFFT_Explore(FFT_T[frame],
                                      res.MagL[frame], res.MagR[frame], res.ACH[frame],
                                      res.ArgL[frame], res.ArgR[frame], res.PhaseLR[frame],
                                      usePolyphase,
                                      fftObj);
            });

            return(res);
        }
示例#2
0
        /// <summary>
        /// Исследование результатов комплексного FFT (идентично CFFT из MathCAD)
        /// </summary>
        /// <param name="FFT_T"> Выходной набор векторов коэффициентов. </param>
        /// <param name="usePolyphase"> Использовать полифазное FFT? </param>
        /// <param name="isMirror"> Зеркальное отображение спектра? </param>
        /// <param name="fftObj"> Объект FFT, для которого вызывается функция. </param>
        /// <returns> Результат разбора выходных данных CFFT. </returns>
        public static CFFT_ExploreResult ComplexExplore(double[][] FFT_T,
                                                        bool usePolyphase, bool isMirror,
                                                        ExactFFT.CFFT_Object fftObj)
        {
            int plotRowsCount;
            CFFT_ExploreResult res;

            res = new CFFT_ExploreResult();

            if (FFT_T == null)
            {
                throw new Exception("ExactPlotter::ComplexExplore(): (FFT_T == null)");
            }

            // Считываем количество строк, которые имеет сонограмма...
            plotRowsCount = FFT_T.Length;

            // Подготавливаем выходные массивы...
            res.Mag = new double[plotRowsCount][];
            res.Arg = new double[plotRowsCount][];

            // Работаем по всем строкам сонограммы...
            Parallel.For(0, plotRowsCount, frame =>
            {
                // Количество гармоник равно размеру кадра FFT
                res.Mag[frame] = new double[fftObj.N];
                res.Arg[frame] = new double[fftObj.N];

                // Извлечение данных FFT из комплексной сонограммы (режим COMPLEX)
                ExactFFT.CFFT_ComplexExplore(FFT_T[frame],
                                             res.Mag[frame], res.Arg[frame],
                                             usePolyphase,
                                             isMirror,
                                             fftObj);
            });

            return(res);
        }