示例#1
0
        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();
            }
        }
示例#2
0
		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();
			}
		}