Example #1
0
        private void CopyFromDomain()
        {
            var audioBuffer   = _gameBoy.APU.Buffer;
            var sampleCount   = _gameBoy.APU.SampleCount;
            var complexBuffer = new Complex[_fftSize * 2];
            var index         = 0;
            var originalIndex = 0;

            foreach (var value in audioBuffer)
            {
                if (originalIndex % 2 == 0)
                {
                    if (index >= sampleCount)
                    {
                        complexBuffer[index] = new Complex(0, 0);
                    }
                    else
                    {
                        complexBuffer[index] = new Complex(value, 0);
                    }

                    index++;
                    if (index == _fftSize * 2)
                    {
                        break;
                    }
                }
                originalIndex++;
            }
            FourierTransform.FFT(complexBuffer, FourierTransform.Direction.Forward);
            CopyFFTToFrameColumn(complexBuffer);
            Utils.TransferBytesToWriteableBitmap(_spectrogram, _spectrogramData);
        }
 protected BSDataObject ProcessUsingFourierDirection(BSDataObject iObject, FourierTransform.Direction iDir)
 {
     Complex[] complexDataArray = (from tmp in iObject.DataArray select new Complex(tmp, 0)).ToArray();
     FourierTransform.DFT(complexDataArray, iDir);
     double[] resultingArray = (from tmp in complexDataArray select Math.Sqrt(tmp.Re * tmp.Re + tmp.Im * tmp.Im)).ToArray();
     return(new BSDataObject(resultingArray, iObject.ObjName + "_Fouirer"));
 }
Example #3
0
        public void ReverseBitPasses()
        {
            Assert.AreEqual(0, FourierTransform.ReverseBit(0, 8));
            Assert.AreEqual(4, FourierTransform.ReverseBit(1, 8));
            Assert.AreEqual(2, FourierTransform.ReverseBit(2, 8));
            Assert.AreEqual(6, FourierTransform.ReverseBit(3, 8));
            Assert.AreEqual(1, FourierTransform.ReverseBit(4, 8));
            Assert.AreEqual(5, FourierTransform.ReverseBit(5, 8));
            Assert.AreEqual(3, FourierTransform.ReverseBit(6, 8));
            Assert.AreEqual(7, FourierTransform.ReverseBit(7, 8));

            Assert.AreEqual(0, FourierTransform.ReverseBit(0, 16));
            Assert.AreEqual(8, FourierTransform.ReverseBit(1, 16));
            Assert.AreEqual(4, FourierTransform.ReverseBit(2, 16));
            Assert.AreEqual(12, FourierTransform.ReverseBit(3, 16));
            Assert.AreEqual(2, FourierTransform.ReverseBit(4, 16));
            Assert.AreEqual(10, FourierTransform.ReverseBit(5, 16));
            Assert.AreEqual(6, FourierTransform.ReverseBit(6, 16));
            Assert.AreEqual(14, FourierTransform.ReverseBit(7, 16));
            Assert.AreEqual(1, FourierTransform.ReverseBit(8, 16));
            Assert.AreEqual(9, FourierTransform.ReverseBit(9, 16));
            Assert.AreEqual(5, FourierTransform.ReverseBit(10, 16));
            Assert.AreEqual(13, FourierTransform.ReverseBit(11, 16));
            Assert.AreEqual(3, FourierTransform.ReverseBit(12, 16));
            Assert.AreEqual(11, FourierTransform.ReverseBit(13, 16));
            Assert.AreEqual(7, FourierTransform.ReverseBit(14, 16));
            Assert.AreEqual(15, FourierTransform.ReverseBit(15, 16));
        }
Example #4
0
        private void TransformMethod()
        {
            if (SelectedSignal != null)
            {
                SampledSignal signal = new SampledSignal();
                signal.PointsY = SelectedSignal.PointsY;
                signal.Name    = $"{SelectedSignal.Name} {SelectedTransform}";
                Stopwatch timer = new Stopwatch();
                timer.Start();
                switch (SelectedTransform.Substring(1, 4))
                {
                case "F1.1":
                    signal.ComplexPoints = FourierTransform.Transform(signal.PointsY);
                    break;

                case "F1.2":
                    FastFourierTransform fourierTransform = new FastFourierTransform();
                    signal.ComplexPoints = fourierTransform.Transform(signal.PointsY);
                    break;

                case "F1.3":
                    signal.ComplexPoints = WaveletTransform.Transform(signal.PointsY);
                    break;
                }
                timer.Stop();
                Time = timer.ElapsedMilliseconds;
                SignalCreator.AddSignal(signal);
            }
        }
        //public int[] FFT(int[] y)
        public async Task <int[]> FFT(int[] y)
        {
            WvlLogger.Log(LogType.TraceAll, "FFT()");
            var input = new AForge.Math.Complex[y.Length];

            for (int i = 0; i < y.Length; i++)
            {
                input[i] = new AForge.Math.Complex(y[i], 0);
            }

            FourierTransform.FFT(input, FourierTransform.Direction.Forward);

            var result = new int[y.Length / 2];

            // getting magnitude
            for (int i = 0; i < y.Length / 2 - 1; i++)
            {
                var current = Math.Sqrt(input[i].Re * input[i].Re + input[i].Im * input[i].Im);
                current   = Math.Log10(current) * 10;
                result[i] = (int)current;
            }

            samplesUpdated(this, new SamplesUpdatedEventArgs(result));
            //PrepareHeatmapDataSeries(result);
            return(result);
        }
Example #6
0
        private void OnDataReceiverEvent(int[] real, int[] imaginary, int length, rx_metadata_t md)
        {
            if (length < numberOfPoints) // Insufficient data for FFT
            {
                return;
            }
            for (int i = 0; i < numberOfPoints; i++)
            {
                data[i] = new AForge.Math.Complex(real[i], imaginary[i]);
            }

            FourierTransform.FFT(data, FourierTransform.Direction.Forward);
            int count = 0;

            for (int i = numberOfPoints / 2; i < numberOfPoints; i++)
            {
                testValues[i, 1] = data[count++].Magnitude;
            }

            for (int i = 0; i < numberOfPoints / 2; i++)
            {
                testValues[i, 1] = data[count++].Magnitude;
            }

            chart.UpdateDataSeries("Test", testValues);
            //chart.RangeY = new AForge.Range(0, 2048);
        }
Example #7
0
        public static float[] ConvertWav2FFTMag(string wavfile, string outfile)
        {
            WAVFile audioFile = new WAVFile();
            String  warning   = audioFile.Open(wavfile, WAVFile.WAVFileMode.READ);

            Complex[] indata      = new Complex[MaxSamples];
            int       IterSamples = (audioFile.NumSamples < MaxSamples) ? audioFile.NumSamples : MaxSamples;

            float[] indata_mag = null;

            if (warning == "")
            {
                //short audioSample = 0;
                for (int sampleNum = 0; sampleNum < IterSamples; ++sampleNum)
                {
                    //audioSample = audioFile.GetNextSampleAs16Bit();
                    indata[sampleNum].Re = audioFile.GetNextSampleAs16Bit();
                }
                FourierTransform.FFT(indata, FourierTransform.Direction.Forward);
                indata_mag = GetMagnitude(indata);

                if (outfile != null)
                {
                    WriteData(indata_mag, outfile);
                }
            }
            audioFile.Close();
            return(indata_mag);
        }
Example #8
0
        // Moution Blur....................................
        public static ByteBitmap WienerFilterFromMoution(ByteBitmap aBitmap, float Length, int Angle, float Nsr)
        {
            //make fft from abitmap
            Point      lStart;
            ByteBitmap lLoc = FFTHelpers.FitByteBitmapForFFT2D(aBitmap, 10, out lStart, 255);

            Complex[,] lFx = FFTHelpers.ByteBitmapToComplex(lLoc);
            FourierTransform.FFT2(lFx, FourierTransform.Direction.Forward);

            //make moution FFT
            Complex[,] lHx = GetMotionComplexImage(new Size(lLoc.Width, lLoc.Height), Angle, Length);
            FourierTransform.FFT2(lHx, FourierTransform.Direction.Forward);

            //make wiener
            Complex[,] lWR = WienerFilter(lFx, lHx, Nsr);

            //backward result
            FourierTransform.FFT2(lWR, FourierTransform.Direction.Backward);

            //convert to bytebitmap
            ByteBitmap lRes = FFTHelpers.ComplexToByteBitmap(lWR);

            lRes = FFTHelpers.GetFittedByteBitmapFromFFT2D(lRes, lStart, new Size(aBitmap.Width, aBitmap.Height));
            return(lRes);
        }
Example #9
0
    public Form1()
    {
        InitializeComponent();
        Bitmap bmp = Bitmap.FromFile("lenagr.png") as Bitmap;

        pictureBox1.Image = bmp;
        Complex[,] cImage = ToComplex(bmp);
        for (int y = 0; y < cImage.GetLength(1); y++)
        {
            for (int x = 0; x < cImage.GetLength(0); x++)
            {
                if (((x + y) & 0x1) != 0)
                {
                    double real      = cImage[y, x].Real * (-1);
                    double imaginary = cImage[y, x].Imaginary * (-1);
                    cImage[y, x] = new Complex(real, imaginary);
                }
            }
        }
        FourierTransform.FFT2(cImage, FourierTransform.Direction.Forward);
        double[,] intImage = ToDouble(cImage);
        intImage           = Limit(intImage);
        Bitmap bmpMagImg = ToBitmap(intImage, PixelFormat.Format24bppRgb);

        pictureBox2.Image = bmpMagImg;
    }
Example #10
0
        private void button9_Click(object sender, EventArgs e)
        {
            var tmp = TestImageGenerator.GetTestPair(size0, size1, 5, 15);

            image     = tmp.Item1.images[0];
            image_res = tmp.Item2;
            fft_image = Complex.CreateComplexArray(image);
            FourierTransform.FFT2(fft_image, FourierTransform.Direction.Forward);
            CreateHilbertFilter();
            Complex.ApplyFilter(fft_image, filter_image);
            FourierTransform.FFT2(fft_image, FourierTransform.Direction.Backward);
            image = Tools.CalculatePhaseImageByHilbert(fft_image);
            unwrapper.UpdateParamsIfNeed(image);
            unwrapper.UnwrapParallel(image, out var scr);
            ImageSource.subtract_min(image);
            ImageSource.subtract_min(image_res);
            var d = ImageSource.diff(image, image_res);

            label1.Text = Math.Round(ImageSource.max(d), 5).ToString();;
            label2.Text = Math.Round(ImageSource.min(d), 5).ToString();;
            label3.Text = Math.Round(ImageSource.std(image, image_res), 5).ToString();;
            label1.Update();
            label2.Update();
            label3.Update();
            plot(d);
        }
Example #11
0
    /// <summary>
    /// Two dimensional Fast Fourier Transform.
    /// </summary>
    ///
    /// <param name="data">Data to transform.</param>
    /// <param name="direction">Transformation direction.</param>
    ///
    /// <remarks><para><note>The method accepts <paramref name="data"/> array of 2<sup>n</sup> size
    /// only in each dimension, where <b>n</b> may vary in the [1, 14] range. For example, 16x16 array
    /// is valid, but 15x15 is not.</note></para></remarks>
    ///
    /// <exception cref="ArgumentException">Incorrect data length.</exception>
    ///
    public static void FFT2(Complex[,] data, Direction direction)
    {
        int k = data.GetLength(0);
        int n = data.GetLength(1);

        // check data size
        //if (
        //    (!Tools.IsPowerOf2(k)) ||
        //    (!Tools.IsPowerOf2(n)) ||
        //    (k < minLength) || (k > maxLength) ||
        //    (n < minLength) || (n > maxLength)
        //    )
        if (
            (!Tools.IsPowerOf2(k)) ||
            (!Tools.IsPowerOf2(n)) ||
            (k < minLength) || (k > maxLength) ||
            (n < minLength) || (n > maxLength)
            )
        {
            throw new ArgumentException("Incorrect data length.");
        }

        // process rows
        Complex[] row = new Complex[n];

        for (int i = 0; i < k; i++)
        {
            // copy row
            for (int j = 0; j < n; j++)
            {
                row[j] = data[i, j];
            }
            // transform it
            FourierTransform.FFT(row, direction);
            // copy back
            for (int j = 0; j < n; j++)
            {
                data[i, j] = row[j];
            }
        }

        // process columns
        Complex[] col = new Complex[k];

        for (int j = 0; j < n; j++)
        {
            // copy column
            for (int i = 0; i < k; i++)
            {
                col[i] = data[i, j];
            }
            // transform it
            FourierTransform.FFT(col, direction);
            // copy back
            for (int i = 0; i < k; i++)
            {
                data[i, j] = col[i];
            }
        }
    }
Example #12
0
        private void bPFilterButton_Click(object sender, EventArgs e)
        {
            try
            {
                int threshold0 = (int)bPFilterNnumericUpDown0.Value;
                int threshold1 = (int)bPFilterNumericUpDown1.Value;

                if (bPFilterComboBox.Text == "Гц")
                {
                    threshold0 = (int)(threshold0 / (signal.Hz / signal.Count));
                    threshold1 = (int)(threshold1 / (signal.Hz / signal.Count));
                }

                FilterType type         = GetFourierTransformType();
                double[]   preparedData = FiltersUtils.PrepareDataToFilter(signal.Data, type);

                var filteredData = FourierTransform.BPFilter(preparedData, threshold0, threshold1, type);

                if (saveToFileCheckBox.Checked)
                {
                    WriteDataToFile(filteredData);
                }

                var form = new ShowChartForm(filteredData, filePath + " полосовой фильтр", signal.Type, signal.Hz);
                form.Show();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Example #13
0
        private void BuildAudioInChain(WaveFormat monoFormat)
        {
            filter = new ComplexFilter(
                monoFormat,
                new BlackmanHarrisWindowFunction(),
                new FirFilter());

            filter.Filters.Add(new DigitalFilter
            {
                FilterFunction       = new LowPassFilterFunction(),
                LowerCutOffFrequency = 10000f
            });

            filterNode = new MonoSignalNode(monoFormat, filter.FilterImplementation);

            fourier = new FourierTransform(
                new FastFourierTransformProvider(),
                new BlackmanHarrisWindowFunction(),
                2048);
            fourierNode        = new MonoSignalNode(monoFormat, fourier);
            fourier.DataReady += fourierControl.fourier_DataReady;

            flanger     = new Flanger(new SineWave());
            flangerNode = new MonoSignalNode(monoFormat, flanger);

            flangerNode.CentreIn.Source = asioInput.Sources.First();
            //flangerNode.CentreIn.Source = waveCard.Inputs.First();
            filterNode.CentreIn.Source           = flangerNode.CentreOut;
            fourierNode.CentreIn.Source          = filterNode.CentreOut;
            asioOutput.Sinks.ElementAt(0).Source = filterNode.CentreOut;
            asioOutput.Sinks.ElementAt(1).Source = filterNode.CentreOut;
            //waveCard.Outputs.ElementAt(0).Source = filterNode.CentreOut;
            //waveCard.Outputs.ElementAt(1).Source = filterNode.CentreOut;
        }
Example #14
0
        public static WriteableBitmap MakeFFT(WriteableBitmap image)
        {
            Complex[,] grayImage = ToGrayScale(image);
            FourierTransform.FFT2(grayImage, FourierTransform.Direction.Forward);

            return(ComplexToMagnitude(grayImage, image.PixelHeight));
        }
Example #15
0
        /// <summary>
        /// Calculates the fourier transforms and updates the axis scales.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BackgroundWorker_CalculateFourierTransforms(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = (BackgroundWorker)sender;

            float[] pidFFTW  = FourierTransform.CalculateFFTW(PIDOutput.ToArray());
            float[] adrcFFTW = FourierTransform.CalculateFFTW(ADRCOutput.ToArray());

            float[] pidAngleFFTW  = FourierTransform.CalculateFFTW(PIDAngle.ToArray());
            float[] adrcAngleFFTW = FourierTransform.CalculateFFTW(ADRCAngle.ToArray());

            this.BeginInvoke((Action)(() =>
            {
                double pidMax, adrcMax;

                pidMax = pidMaxValue.Filter((pidFFTW.Max() + Math.Abs(pidFFTW.Min())) / 2);
                adrcMax = adrcMaxValue.Filter((adrcFFTW.Max() + Math.Abs(adrcFFTW.Min())) / 2);

                pidScale.Text = "PID Scale: " + pidMax;
                adrcScale.Text = "ADRC Scale: " + adrcMax;

                chart3.ChartAreas[0].AxisY.Maximum = pidMax;
                chart3.ChartAreas[0].AxisY.Minimum = -pidMax;

                chart4.ChartAreas[0].AxisY.Maximum = adrcMax;
                chart4.ChartAreas[0].AxisY.Minimum = -adrcMax;
            }));

            e.Result = new float[4][] { pidFFTW, adrcFFTW, pidAngleFFTW, adrcAngleFFTW };
        }
Example #16
0
        static void Main(string[] args)
        {
            test1();
            CaculateTimes caculate = new CaculateTimes();

            caculate.StartTime();
            //4 3 2 6 7 8 9 0
            int[]     nums      = { 4, 3, 2, 6, 7, 8, 9, 0 };
            int[]     nums_2    = { 1, 2, 5, 4, 8, 6, 4, 5, 2, 3, 1 };
            Complex[] complices = new Complex[nums.Length];
            for (int i = 0; i < nums.Length; i++)
            {
                complices[i] = new Complex(nums[i], 0);
            }
            FourierTransform.DFT(complices, FourierTransform.Direction.Backward);
            for (int i = 0; i < nums.Length; i++)
            {
                Console.WriteLine(complices[i].Re + " " + complices[i].Im);
            }
            Console.WriteLine();
            Console.WriteLine("====================");
            Console.WriteLine();
            for (int i = 0; i < nums.Length; i++)
            {
                complices[i].Re = nums[i];
                complices[i].Im = 0;
            }
            FourierTransform.FFT(complices, FourierTransform.Direction.Backward);
            for (int i = 0; i < nums.Length; i++)
            {
                Console.WriteLine(complices[i].Re + " " + complices[i].Im);
            }
            Console.WriteLine(caculate.EndTime());
            Console.ReadKey();
        }
Example #17
0
        internal unsafe static Image <Complex, TDepth> FFT <TDepth>(this Image <Complex, TDepth> image, FourierTransform.Direction direction, bool inPlace = false)
            where TDepth : struct
        {
            Image <Complex, TDepth> dest = null;

            if (inPlace)
            {
                dest = image;
            }
            else
            {
                dest = image.Clone();
            }

            if (typeof(TDepth).Equals(typeof(float)))
            {
                FourierTransform.FFT2((ComplexF *)dest.ImageData, dest.Width, dest.Height, dest.Stride, direction);
            }
            else if (typeof(TDepth).Equals(typeof(double)))
            {
                throw new NotImplementedException(); //TODO: implement for double
                //FourierTransform.FFT2((Complex*)dest.ImageData, dest.Width, dest.Height, dest.Stride, direction);
            }
            else
            {
                throw new NotSupportedException();
            }

            return(dest);
        }
Example #18
0
        public static double[] Transform(double[] functionPoints, string transformate)
        {
            var copyofFunctionsPoints = functionPoints;


            switch (transformate)
            {
            case "FFT":
                var complexArray = Array.ConvertAll(copyofFunctionsPoints, x => new Complex(x, 0));

                FourierTransform.DFT(complexArray, FourierTransform.Direction.Forward);

                copyofFunctionsPoints = Array.ConvertAll(complexArray, z => z.Real);
                break;

            case "IFFT":
                var complexArray2 = Array.ConvertAll(copyofFunctionsPoints, x => new Complex(x, 0));

                FourierTransform.DFT(complexArray2, FourierTransform.Direction.Backward);

                copyofFunctionsPoints = Array.ConvertAll(complexArray2, z => z.Real);
                break;


            case "DST":
                SineTransform.DST(copyofFunctionsPoints);
                break;

            case "IDST":
                SineTransform.IDST(copyofFunctionsPoints);
                break;

            case "DCT":
                CosineTransform.DCT(copyofFunctionsPoints);
                break;

            case "IDCT":
                CosineTransform.IDCT(copyofFunctionsPoints);
                break;

            case "DHT":
                HartleyTransform.DHT(copyofFunctionsPoints);
                break;

            case "FHT":
                HilbertTransform.FHT(copyofFunctionsPoints,
                                     FourierTransform.Direction.Forward);
                break;

            case "IFHT":
                HilbertTransform.FHT(copyofFunctionsPoints,
                                     FourierTransform.Direction.Backward);
                break;

            default:
                throw new ArgumentException("Unknown transformation!");
            }
            return(copyofFunctionsPoints); //athenia programuje//dididididi//di/kocham PaciA// JJKAKAKK  K
        }
Example #19
0
        public override void FFT(bool forward)
        {
            data.CopyTo(copy, 0);

            FourierTransform.FFT(copy, forward ?
                                 FourierTransform.Direction.Forward :
                                 FourierTransform.Direction.Backward);
        }
Example #20
0
        public (double[] real, double[] imaginary) CalculateDFT()
        {
            var data = GetComplexData().ToArray();

            FourierTransform.DFT(data, FourierTransform.Direction.Forward);

            return(data.Re(), data.Im());
        }
Example #21
0
        public static void FastDFT(Complex[] x, int mode = 1)
        {
            var dir = FourierTransform.Direction.Forward;

            if (mode == -1)
            {
                dir = FourierTransform.Direction.Backward;
            }
            FourierTransform.FFT(x, dir);
        }
Example #22
0
        /// <summary>
        /// Initializes short-time Fourier transform.
        /// </summary>
        /// <param name="function">Windows function</param>
        /// <param name="normalized">Normalized transform or not</param>
        /// <param name="direction">Processing direction</param>
        public ShortTimeFourierTransform(IWindow function, bool normalized = true, Direction direction = Direction.Vertical)
        {
            // fourier transform initialization:
            this.FFT  = new FourierTransform(normalized, direction);
            Direction = direction;
            Window    = function;

            // sampling window function:
            this.coefs = function.GetWindow().Add(1e-64f);
        }
Example #23
0
        public void Proceed()
        {
            if (IsAllChecked())
            {
                PreviousMethod = CurrentMethod;

                IsBuilded    = true;
                OutputString = "";

                var InputSignal = ComplexConverter.FromList(Signal);

                if (CurrentMethod == Methods.FFT)
                {
                    if (IsForward)
                    {
                        Result = FourierTransform.ForwardFourierTransform(InputSignal);
                    }
                    else
                    {
                        Result = FourierTransform.InverseFourierTransform(InputSignal);
                    }
                }
                else
                {
                    if (IsForward)
                    {
                        Result = FourierTransform.ForwardDiscreteFourierTransform(InputSignal);
                    }
                    else
                    {
                        Result = FourierTransform.InverseDiscreteFourierTransform(InputSignal);
                    }
                }

                foreach (var item in Result)
                {
                    if (CurrentChartType == Charts.Signal)
                    {
                        OutputString += "  " + item.ToString() + "\n";
                    }
                    else if (CurrentChartType == Charts.Magnitude)
                    {
                        OutputString += $"  {item.Magnitude:F3}\n";
                    }
                    else if (CurrentChartType == Charts.Phase)
                    {
                        OutputString += $"  {item.Phase:F3}\n";
                    }
                }

                BindSeries();

                Output.Text = OutputString;
            }
        }
Example #24
0
        public void IFFTPasses()
        {
            var input = Enumerable.Range(0, 8)
                        .Select(_i => new Complex(SoundUtils.CalSinWave(_i, 0.25f, 250f, 8000), 0))
                        .ToArray();
            var fft    = new FourierTransform();
            var output = fft.FFT(input);
            var gots   = fft.IFFT(output);

            AssertionUtils.AreEqualComplexArray(input, gots, "逆変換に失敗しています", EPSILON);
        }
Example #25
0
        /// <summary>
		///   Performs the Fast Hilbert Transform over a double[] array.
		/// </summary>
        /// 
		public static void FHT(double[] data, FourierTransform.Direction direction)
		{
			int N = data.Length;
			
			
			// Forward operation
			if (direction == FourierTransform.Direction.Forward)
			{
				// Copy the input to a complex array which can be processed
				//  in the complex domain by the FFT
				Complex[] cdata = new Complex[N];
				for (int i = 0; i < N; i++)
					cdata[i].Re = data[i];
				
				// Perform FFT
				FourierTransform.FFT(cdata, FourierTransform.Direction.Forward);

				//double positive frequencies
				for (int i = 1; i < (N/2); i++)
				{
					cdata[i].Re *= 2.0;
					cdata[i].Im *= 2.0;
				}

				// zero out negative frequencies
				//  (leaving out the dc component)
				for (int i = (N/2)+1; i < N; i++)
				{
					cdata[i].Re = 0.0;
					cdata[i].Im = 0.0;
				}
				
				// Reverse the FFT
				FourierTransform.FFT(cdata, FourierTransform.Direction.Backward);

				// Convert back to our initial double array
				for (int i = 0; i < N; i++)
					data[i] = cdata[i].Im;
			}
			
			else // Backward operation
			{
				// The inverse Hilbert can be calculated by
				//  negating the transform and reapplying the
				//  transformation.
				//
				// H^–1{h(t)} = –H{h(t)}
				
				FHT(data, FourierTransform.Direction.Forward);

                for (int i = 0; i < data.Length; i++)
                    data[i] = -data[i];
			}
		}
Example #26
0
        public double[] Equalize(double[] gains, WavData wavData)
        {
            var n              = FourierHelper.GetExpandedPow2(_windowLength + _filterLength - 1);
            var size           = wavData.Samples.Length + n - _windowLength;
            var result         = new double[size];
            var windows        = new double[size / _windowHopSize][];
            var windowsComplex = new Complex[size / _windowHopSize][];

            for (int i = 0; i < windows.Length; i++)
            {
                windows[i]        = new double[n];
                windowsComplex[i] = new Complex[n];
            }

            var windowFactors = _window.WindowFactors(_windowLength);
            var gainsComplex  = GenerateGains(gains, wavData.FormatChunk.SampleRate, n);

            for (int i = 0; i < windows.Length; i++)
            {
                for (int j = 0; j < _windowLength; j++)
                {
                    if (i * _windowHopSize + j < wavData.Samples.Length)
                    {
                        windows[i][j] = windowFactors[j] * wavData.Samples[i * _windowHopSize + j];
                    }
                    else
                    {
                        windows[i][j] = 0;
                    }
                }
                for (int j = _windowLength; j < n; j++)
                {
                    windows[i][j] = 0;
                }

                windowsComplex[i] = FourierTransform.FFT(windows[i]);
                windowsComplex[i] = AdjustGain(gainsComplex, windowsComplex[i]);
                windows[i]        = FourierTransform.IFFT(windowsComplex[i]);
            }

            for (int i = 0; i < windows.Length; i++)
            {
                for (int j = 0; j < windows[i].Length; j++)
                {
                    if (i * _windowHopSize + j < wavData.Samples.Length)
                    {
                        result[i * _windowHopSize + j] += windows[i][j];
                    }
                }
            }

            return(result);
        }
Example #27
0
        /// <summary>
        ///   Converts a frame to log-power-spectrum bins.
        /// </summary>
        ///
        private double[] frame2logspec(params Int16[] p_frame)
        {
            double[] w_preEmp = pre_emphasis(p_frame);
            double[] w_win    = new double[m_win.Length];
            for (int w_i = 0; w_i < m_win.Length; w_i++)
            {
                w_win[w_i] = m_win[w_i];
            }

            // Each frame has to be multiplied with a hamming window in order to keep
            // the continuity of the first and the last points in the frame.
            double[] w_frame = new double[w_win.Length];
            for (int w_i = 0; w_i < w_win.Length; w_i++)
            {
                w_frame[w_i] = w_preEmp[w_i] * w_win[w_i];
            }

            Complex[] w_complexFrame = new Complex[m_nfft];
            for (int w_i = 0; w_i < w_frame.Length && w_i < m_nfft; w_i++)
            {
                w_complexFrame[w_i] = w_frame[w_i];
            }
            for (int w_i = w_frame.Length; w_i < m_nfft; w_i++)
            {
                w_complexFrame[w_i] = 0;
            }

            // Compute the one-dimensional discrete Fourier Transform for real input.
            FourierTransform.FFT(w_complexFrame, FourierTransform.Direction.Backward);

            // Square of absolute value
            double[] w_power = new double[m_nfft / 2 + 1];
            for (int w_i = 0; w_i < m_nfft / 2 + 1; w_i++)
            {
                w_power[w_i] = w_complexFrame[w_i].Real * w_complexFrame[w_i].Real
                               + w_complexFrame[w_i].Imaginary * w_complexFrame[w_i].Imaginary;
            }

            double[] w_dotMat = Matrix.Dot(w_power, m_filters);
            double[] w_ret    = new double[w_dotMat.Length];
            for (int w_i = 0; w_i < w_ret.Length; w_i++)
            {
                if (w_dotMat[w_i] < 1.0f / 100000.0f)
                {
                    w_ret[w_i] = System.Math.Log(1.0f / 100000.0f);
                }
                else
                {
                    w_ret[w_i] = System.Math.Log(w_dotMat[w_i]);
                }
            }
            return(w_ret);
        }
Example #28
0
    /// <summary>
    /// One dimensional Fast Fourier Transform.
    /// </summary>
    ///
    /// <param name="data">Data to transform.</param>
    /// <param name="direction">Transformation direction.</param>
    ///
    /// <remarks><para><note>The method accepts <paramref name="data"/> array of 2<sup>n</sup> size
    /// only, where <b>n</b> may vary in the [1, 14] range.</note></para></remarks>
    ///
    /// <exception cref="ArgumentException">Incorrect data length.</exception>
    ///
    public static void FFT(Complex[] data, Direction direction)
    {
        int n = data.Length;
        int m = Tools.Log2(n);

        // reorder data first
        ReorderData(data);

        // compute FFT
        int tn = 1, tm;

        for (int k = 1; k <= m; k++)
        {
            Complex[] rotation = FourierTransform.GetComplexRotation(k, direction);

            tm   = tn;
            tn <<= 1;

            for (int i = 0; i < tm; i++)
            {
                Complex t = rotation[i];

                for (int even = i; even < n; even += tn)
                {
                    int     odd = even + tm;
                    Complex ce  = data[even];
                    Complex co  = data[odd];

                    double tr = co.Real * t.Real - co.Imaginary * t.Imaginary;
                    double ti = co.Real * t.Imaginary + co.Imaginary * t.Real;

                    //data[even].Real+= tr;
                    //data[even].Imaginary += ti;
                    data[even] += new Complex(tr, ti);

                    //data[odd].Real= ce.Real- tr;
                    //data[odd].Imaginary = ce.Imaginary - ti;
                    data[odd] = new Complex((ce.Real - tr), (ce.Imaginary - ti));
                }
            }
        }

        if (direction == Direction.Forward)
        {
            for (int i = 0; i < n; i++)
            {
                //data[i].Real/= (double)n;
                //data[i].Imaginary /= (double)n;
                data[i] /= new Complex((double)n, (double)n);
            }
        }
    }
        public void FFT2_test1()
        {
            var tuple = TestImageGenerator.GetTestPair(1024, 1024, 4);

            Complex[,] test_image = Complex.CreateComplexArray(tuple.Item1.images[0]);
            FourierTransform.FFT2(test_image, FourierTransform.Direction.Forward);
            Complex[,] reserv = (Complex[, ])test_image.Clone();
            FourierTransform.FFT2(test_image, FourierTransform.Direction.Backward);
            double[,] inverse_result = Complex.CreateDoubleArray(test_image);
            double std = ImageSource.std(tuple.Item1.images[0], inverse_result);

            Assert.IsTrue(std < ImageSource.mean(tuple.Item1.images[0]) / 1000);
        }
        public void TestOneSignal()
        {
            var data = new double[4096];

            for (var i = 0; i < data.Length; i++)
            {
                var alpha  = i * 180 / System.Math.PI;
                var signal = System.Math.Cos(alpha) + 100;
                data[i] = signal;
            }

            var ampls = FourierTransform.Transform(data);
        }
Example #31
0
 /// <summary>
 /// Applies backward fast Fourier transformation to the complex signal.
 /// </summary>
 ///
 public void BackwardFourierTransform()
 {
     if (status == ComplexSignalStatus.FourierTransformed)
     {
         for (int i = 0; i < Channels; i++)
         {
             Complex[] channel = GetChannel(i);
             FourierTransform.FFT(channel, FourierTransform.Direction.Backward);
             SetChannel(i, channel);
         }
         status = ComplexSignalStatus.Normal;
     }
 }
        private void backToSpatialDomainToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                FourierTransform t = new FourierTransform();

                ImageForm frmImg = new ImageForm(Facilities.ToImage(Facilities.ToBitmap(t.ApplyReverseTransform(_complex))));
                frmImg.MdiParent = this.MdiParent;
                frmImg.Show();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.GetType().FullName, ex.Message);
            }
        }
        /// <summary>
        ///   Performs the transformation over a complex[] array.
        /// </summary>
        /// 
        public static void FHT(Complex[] data, FourierTransform.Direction direction)
        {
            int N = data.Length;

            // Forward operation
            if (direction == FourierTransform.Direction.Forward)
            {
                // Makes a copy of the data so we don't lose the
                //  original information to build our final signal
                Complex[] shift = (Complex[])data.Clone();

                // Perform FFT
                FourierTransform.FFT(shift, FourierTransform.Direction.Backward);

                //double positive frequencies
                for (int i = 1; i < (N/2); i++)
                {
                    shift[i].Re *= 2.0;
                    shift[i].Im *= 2.0;
                }
                // zero out negative frequencies
                //  (leaving out the dc component)
                for (int i = (N/2)+1; i < N; i++)
                {
                    shift[i].Re = 0.0;
                    shift[i].Im = 0.0;
                }

                // Reverse the FFT
                FourierTransform.FFT(shift, FourierTransform.Direction.Forward);

                // Put the Hilbert transform in the Imaginary part
                //  of the input signal, creating a Analytic Signal
                for (int i = 0; i < N; i++)
                    data[i].Im = shift[i].Im;
            }

            else // Backward operation
            {
                // Just discard the imaginary part
                for (int i = 0; i < data.Length; i++)
                    data[i].Im = 0.0;
            }
        }
Example #34
0
        private void fourierTransformToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                FourierTransform t = new FourierTransform();

                FourierForm frm = new FourierForm(
                    t.ApplyTransform(
                        Facilities.To8bppGreyScale(
                            Facilities.ToBitmap(pictureBoxImage.Image))));
                frm.MdiParent = MdiParent;
                frm.Show();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.GetType().FullName, ex.Message);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="img"></param>
        /// <param name="configs"></param>
        /// <returns></returns>
        public override byte[,] ApplyFilter(byte[,] img, SortedDictionary<string, object> configs)
        {
            byte[,] ret = null; FourierTransform ft = new FourierTransform();

            // Preprocess image.
            int width = img.GetLength(0), height = img.GetLength(1), x, y;
            double[,] imgProcessed = new double[width, height];

            const double magic = 0.5;

            //double min = double.MaxValue;
            //// Find min.
            //for (x = 0; x < width; ++x)
            //{
            //    for (y = 0; y < height; ++y)
            //    {
            //        min = Math.Min(img[x, y], min);
            //    }
            //}

            // "normalize"
            for (x = 0; x < width; ++x)
            {
                for (y = 0; y < height; ++y)
                {
                    imgProcessed[x, y] = Math.Log(img[x, y] + magic, Math.E);
                }
            }

            // Take fourier transform.
            ComplexImage homomorph = ft.ApplyTransformBase(imgProcessed);

            // (x)(a) Perform butterworth high pass to select reflectance;
            // perform butterworth low pass to select illuminance.
            // **** OR ****
            // (b) Apply butterworth-generated weigth to select reflectance (1.0 in center)
            // Apply (1.0 - butterworth-generated weigth) to select illuminance (0.0 in center)
            // **** OR ****
            // (c) Apply high pass buttwerworth. only.

            SortedDictionary<string, object> hConfigs = reflectGetter.GetDefaultConfigs();
            hConfigs["D0"] = configs["Butterworth-D0"];
            hConfigs["n"] = configs["Butterworth-n"];

            ComplexImage reflect = reflectGetter.ApplyFilter(homomorph, hConfigs);
            ComplexImage illumin = illuminGetter.ApplyFilter(homomorph, hConfigs);

            // (1, 1) = imagem original
            // (1, 0) = high pass
            // (0, 1) = low pass
            double alpha = double.Parse(configs["Alpha"].ToString());
            double beta = double.Parse(configs["Beta"].ToString());

            // Generate new, Homomorphic-treated image

            //(c)
            //homomorph = illumin;

            // Split into reflectance and illuminance
            // - Sharp reflectance, smooth illuminance
            // - sum
            for (x = 0; x < homomorph.Width; ++x)
            {
                for (y = 0; y < homomorph.Height; ++y)
                {
                    //(a)
                    homomorph[x, y] = new Complex(
                            reflect[x, y].real * beta + // Reflectance part
                            illumin[x, y].real * alpha  // Illuminance part
                            ,
                            reflect[x, y].imag * beta + // Reflectance part
                            illumin[x, y].imag * alpha  // Illuminance part
                            );
                }
            }

            // ... back to spatial domain.
            imgProcessed = ft.ApplyReverseTransformBase(homomorph);

            // Pos-process image.
            ret = new byte[width, height];

            for (x = 0; x < width; ++x)
            {
                for (y = 0; y < height; ++y)
                {
                    ret[x, y] = (byte)Math.Max(byte.MinValue, Math.Min(byte.MaxValue, Math.Exp(imgProcessed[x, y]) - magic));
                }
            }

            return ret;
        }
Example #36
0
        public double[] Extract(float[] frame, out bool isEmpty)
        {
            HammingWindowDef.HammingWindow hammingWindow;
            if (!_hammingWindows.TryGetValue(frame.Length, out hammingWindow))
            {
                hammingWindow = new HammingWindowDef.HammingWindow(new HammingWindowDef(), frame.Length);
                _hammingWindows.Add(frame.Length, hammingWindow);
            }

            var windowedSample = hammingWindow.Apply(frame);

            FourierTransform ft = new FourierTransform();
            var nummberOfCoeff = ft.ComputeFft(windowedSample, _numberOfFftCoeff);
            double frameEnergy;
            var result = ft.GetMagnitudeSquared(nummberOfCoeff, out frameEnergy);

            if (_filterBankCoefficients == null)
            {
                _filterBankCoefficients = ComputeMelFilterBank(result.Length, _lowerfrequency, _higherfrequency,
                    _samplingRate, _numberOfFilterBanks + 2);
            }

            var cepstra = ApplyFilterbankFilter(result, _filterBankCoefficients);
            var ret = _dct.Apply(cepstra);
            ret[0] = Utils.Log(frameEnergy);
            isEmpty = false;
            return ret;
        }