示例#1
0
        public void ComputeTest_Shifted_Impulse()
        {
            data[0] = new Complex(0, 0);
            data[1] = new Complex(1, 0);
            data[2] = new Complex(0, 0);
            data[3] = new Complex(0, 0);

            var output = FFT.Compute(data);

            for (int i = 0; i < data.Length; i++)
            {
                Assert.AreEqual(1.0 / data.Length, output[i].Magnitude);
            }
        }
示例#2
0
        public void ComputeTest_Impulse()
        {
            data[0] = new Complex(1, 0);
            data[1] = new Complex(0, 0);
            data[2] = new Complex(0, 0);
            data[3] = new Complex(0, 0);

            var output = FFT.Compute(data);

            for (int i = 0; i < data.Length; i++)
            {
                Assert.AreEqual(1.0 / data.Length, output[i].Real);
                Assert.AreEqual(0, output[i].Imaginary);
            }
        }
示例#3
0
        private void OnAudioFilterRead(float[] data, int channels)
        {
            try
            {
                float[] sdata = new float[data.Length / channels];
                for (int i = 0; i < sdata.Length; i++)
                {
                    sdata[i] = data[i * channels];
                }
                float[] realout = new float[sdata.Length];
                float[] imagout = new float[sdata.Length];
                float[] pamlout = new float[sdata.Length];
                FFT.Compute((uint)sdata.Length, sdata, null, realout, imagout, false);
                FFT.Norm((uint)sdata.Length, realout, imagout, pamlout);
                float[] odata      = new float[freqLength];
                int     centerFreq = 22050;
                for (int i = 0; i < freqLength; ++i)
                {
                    if (FREQUENCY[i] > centerFreq)
                    {
                        odata[i] = 0;
                    }
                    else
                    {
                        int indice = (int)((float)FREQUENCY[i] * (float)pamlout.Length / (float)44100);
                        if (indice >= pamlout.Length)
                        {
                            indice = pamlout.Length - 1;
                        }
                        float v = Mathf.Sqrt(pamlout[indice]);
                        v = Mathf.Sqrt(v);

                        odata[i] = v;
                    }
                }
                SetDataSafe(odata);
            }
            catch
            {
                print("FFT err.");
            }
        }