/// <summary> /// FFT inverse /// </summary> /// <param name="data">half-complex frequency series</param> /// <returns>real time series</returns> public static double[] Inverse(IEnumerable <double> data) { uint numDp = (uint)data.Count(); var trans = data.ToArray(); //buffer var work = new real_workspace(numDp); //real_wavetable real = new real_wavetable(); var real = new real_wavetable(numDp); //transform var error = halfcomplex_inverse(trans, 1, numDp, real.IntPtr, work.IntPtr); checkError(error, nameof(Inverse)); return(trans); }
/// <summary> /// Example Application - low pass filtering on square wave /// </summary> /// <param name="dataPrinter"></param> /// <returns></returns> public static double[] Test_Real(Action <double[], string> dataPrinter) { const uint n = 101; double[] data = new double[n]; //build time domain real data for (int j = 0; j < n; j++) { data[j] = 0; } for (uint j = n / 3; j < 2 * n / 3; j++) { data[j] = 1; } //print data dataPrinter?.Invoke(data, "Input"); //buffer var work = new real_workspace(n); //real_wavetable real = new real_wavetable(); var real = new real_wavetable(n); //transform var error = real_transform(data, 1, n, real.IntPtr, work.IntPtr); checkError(error, nameof(Test_Real)); //<<---- TEST ---- //var dataC = new double[data.Length * 2]; //halfcomplex_unpack(data, dataC, 1, n); //var z = new string[data.Length]; //for (int i = 0; i < data.Length; i++) z[i] = $"{dataC[2 * i]} + {dataC[2 * i + 1]}I"; //---- TEST ---->> //low pass for (int j = 11; j < n; j++) { data[j] = 0; } //<<---- TEST ---- //var dataC = new double[data.Length * 2]; //halfcomplex_unpack(data, dataC, 1, n); //var z = new string[data.Length]; //for (int i = 0; i < data.Length; i++) z[i] = $"{dataC[2 * i]} + {dataC[2 * i + 1]}I"; //---- TEST ---->> var hc = new halfcomplex_wavetable(n); //inverse transform error = halfcomplex_inverse(data, 1, n, hc.IntPtr, work.IntPtr); checkError(error, nameof(Test_Real)); //print data dataPrinter?.Invoke(data, "Output"); // //work.Dispose(); return(data); }