private static void TestFFT(string title, kiss_fft_cpx <float>[] timeDomain, kiss_fft_cpx <float>[] frequencyDomain) { System.Console.WriteLine(title); { // FFT KissFFT <float> kissFft = new KissFFT <float>(timeDomain.Length, false, new FloatArithmetic()); kissFft.kiss_fft(new Array <kiss_fft_cpx <float> >(timeDomain), new Array <kiss_fft_cpx <float> >(frequencyDomain)); for (int i = 0; i < frequencyDomain.Length; ++i) { frequencyDomain[i].r /= (float)frequencyDomain.Length; frequencyDomain[i].i /= (float)frequencyDomain.Length; } System.Console.Write("Offset = {0} + {1} * i\n", frequencyDomain[0].r, frequencyDomain[0].i); for (int i = 1; i < frequencyDomain.Length / 2 + 1; ++i) { System.Console.Write("f({0}): {1} + {2} * i, ", i, frequencyDomain[i].r * 2.0f, frequencyDomain[i].i * 2.0f); PrintEuler(frequencyDomain[i].r * 2.0f, frequencyDomain[i].i * 2.0f); System.Console.WriteLine(); } } { // inverse FFT kiss_fft_cpx <float>[] inverted = new kiss_fft_cpx <float> [frequencyDomain.Length]; KissFFT <float> kissFft = new KissFFT <float>(frequencyDomain.Length, true, new FloatArithmetic()); kissFft.kiss_fft(new Array <kiss_fft_cpx <float> >(frequencyDomain), new Array <kiss_fft_cpx <float> >(inverted)); for (int i = 0; i < frequencyDomain.Length; ++i) { const float treshold = 0.00001f; if (!(Math.Abs(timeDomain[i].r - inverted[i].r) < treshold && Math.Abs(timeDomain[i].i - inverted[i].i) < treshold)) { System.Console.Write("{0} ({1}, {2}) != ({3}, {4})\n", i, timeDomain[i].r, timeDomain[i].i, inverted[i].r, inverted[i].i); } } System.Console.WriteLine(); } }
private static void TestFFT(string title, kiss_fft_cpx<float>[] timeDomain, kiss_fft_cpx<float>[] frequencyDomain) { System.Console.WriteLine(title); { // FFT KissFFT<float> kissFft = new KissFFT<float>(timeDomain.Length, false, new FloatArithmetic()); kissFft.kiss_fft(new Array<kiss_fft_cpx<float>>(timeDomain), new Array<kiss_fft_cpx<float>>(frequencyDomain)); for (int i = 0; i < frequencyDomain.Length; ++i) { frequencyDomain[i].r /= (float) frequencyDomain.Length; frequencyDomain[i].i /= (float) frequencyDomain.Length; } System.Console.Write("Offset = {0} + {1} * i\n", frequencyDomain[0].r, frequencyDomain[0].i); for (int i = 1; i < frequencyDomain.Length / 2 + 1; ++i) { System.Console.Write("f({0}): {1} + {2} * i, ", i, frequencyDomain[i].r * 2.0f, frequencyDomain[i].i * 2.0f); PrintEuler(frequencyDomain[i].r * 2.0f, frequencyDomain[i].i * 2.0f); System.Console.WriteLine(); } } { // inverse FFT kiss_fft_cpx<float>[] inverted = new kiss_fft_cpx<float>[frequencyDomain.Length]; KissFFT<float> kissFft = new KissFFT<float>(frequencyDomain.Length, true, new FloatArithmetic()); kissFft.kiss_fft(new Array<kiss_fft_cpx<float>>(frequencyDomain), new Array<kiss_fft_cpx<float>>(inverted)); for (int i = 0; i < frequencyDomain.Length; ++i) { const float treshold = 0.00001f; if (!(Math.Abs(timeDomain[i].r - inverted[i].r) < treshold && Math.Abs(timeDomain[i].i - inverted[i].i) < treshold)) { System.Console.Write("{0} ({1}, {2}) != ({3}, {4})\n", i, timeDomain[i].r, timeDomain[i].i, inverted[i].r, inverted[i].i); } } System.Console.WriteLine(); } }