/// <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); }
/// <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); }