Пример #1
0
        private void FillResultImages(Bitmap bitmap)
        {
            var phaseInterval     = MathHelper.CalculateMinMax(ComplexData, Spectrum.Phase);
            var magnitudeInterval = MathHelper.CalculateMinMax(ComplexData, Spectrum.Magnitude);

            FourierHelper.SwapQuadrants(ComplexData);

            using (var phaseBitmapData = new SingleBitmapData(bitmap, PixelFormat.Format8bppIndexed))
                using (var magnitudeBitmapData = new SingleBitmapData(bitmap, PixelFormat.Format8bppIndexed))
                {
                    for (int y = 0; y < phaseBitmapData.HeightInPixels; y++)
                    {
                        for (int x = 0;
                             x < phaseBitmapData.WidthInBytes;
                             x += phaseBitmapData.BytesPerPixel)
                        {
                            var index = x + y * phaseBitmapData.WidthInBytes;
                            phaseBitmapData.FirstPixelPtr[index]     = (byte)FourierHelper.LogNormalize(ComplexData[y][x].Phase, phaseInterval.Max, 255);
                            magnitudeBitmapData.FirstPixelPtr[index] = (byte)FourierHelper.LogNormalize(ComplexData[y][x].Magnitude, magnitudeInterval.Max, 255);
                        }
                    }

                    PhaseImage     = phaseBitmapData.Bitmap;
                    MagnitudeImage = magnitudeBitmapData.Bitmap;
                }

            FourierHelper.SwapQuadrants(ComplexData);
        }
Пример #2
0
        public static double[] IFFT(Complex[] complexData)
        {
            FourierHelper.Conjugate(complexData);
            FFT1D(complexData);
            FourierHelper.Conjugate(complexData);

            return(complexData.Select(c => (c / complexData.Length).Real).ToArray());
        }
Пример #3
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);
        }
Пример #4
0
        public static unsafe ImageComponents ProcessFourierImage(
            ImageComponents imageComponents,
            IProcessingFourierOperation fourierOperation)
        {
            var clonedData = CollectionHelper.Clone(imageComponents.ComplexData);

            FourierHelper.SwapQuadrants(clonedData);
            fourierOperation.ProcessImage(clonedData);
            FourierHelper.SwapQuadrants(clonedData);

            var processedData = CollectionHelper.Clone(clonedData);
            var bitmap        = FastFourierTransform.IFFT2D(processedData, imageComponents.Image);

            return(new ImageComponents(clonedData, bitmap));
        }
Пример #5
0
    public void Test()
    {
        var points = GetComponent <PointsHolder>().Points;

        //var interpolatedPoints = Data.drawing.Where((d, i) => i%10==0).Select(d => new ComplexNumber(d.x, -d.y)).ToList();

        var interpolatedPoints = new List <ComplexNumber>();

        for (var i = 0; i < takePoints; i++)
        {
            var v = GetComponent <PointsHolder>().GetPoint(i / (float)takePoints);
            interpolatedPoints.Add(new ComplexNumber(v.x, v.y));
        }

/*
 *      var interpolatedPoints = new List<ComplexNumber>(points.Count * 2);
 *      for (var i = 0; i < points.Count; i++)
 *      {
 *          interpolatedPoints.Add(points[i]);
 *          interpolatedPoints.Add((points[i] + points[(i + 1) % points.Count]) / 2f);
 *      }
 */

        //var interpolatedPoints = GetComponent<PointsHolder>().Points;

        res.Clear();
        restored.Clear();

        res.AddRange(FourierHelper.DFT(interpolatedPoints).OrderByDescending(d => d.amplitude));

        for (var tn = 0; tn < 500; tn++)
        {
            var time = tn / 500f * 2f * Mathf.PI;

            var pos = Vector2.zero;
            for (var i = 0; i < res.Count; i++)
            {
                var t = res[i].frequency * time + res[i].phase;
                pos += new Vector2(Mathf.Cos(t), Mathf.Sin(t)) * res[i].amplitude;
            }

            restored.Add(pos);
        }

        ExportString();
    }
Пример #6
0
        public List <Sound> Calculate(WavData wavData)
        {
            var frequencies = new List <Sound>();

            for (int i = 0; i < wavData.ChunkedSamples.Length; i++)
            {
                var samples = wavData.ChunkedSamples[i];

                var reducedSamples = FourierHelper.ReduceToPow2(samples);
                reducedSamples = FourierHelper.PreEmphasis(reducedSamples);
                reducedSamples = _fourierWindow.Windowing(reducedSamples);

                var complexSamples = FourierTransform.FFT(reducedSamples);
                complexSamples = complexSamples.Take(complexSamples.Length / 2).ToArray();

                var threshold = complexSamples.Max(c => c.Magnitude) / 10;
                var localMax  = 0;

                for (int j = 1; j < complexSamples.Length; j++)
                {
                    if (complexSamples[j].Magnitude > threshold && complexSamples[j].Magnitude > complexSamples[j - 1].Magnitude && complexSamples[j].Magnitude > complexSamples[j + 1].Magnitude)
                    {
                        localMax = j;
                        break;
                    }
                }

                var frequency = (wavData.FormatChunk.SampleRate / (complexSamples.Length * 2)) * localMax;
                if (frequencies.Any() && frequencies.Last().Frequency == frequency)
                {
                    frequencies.Last().EndTime += 50;
                }
                else
                {
                    frequencies.Add(new Sound
                    {
                        StartTime = i * 50,
                        EndTime   = i * 50 + 50,
                        Frequency = frequency,
                        Result    = complexSamples.Select(c => c.Magnitude).ToArray()
                    });
                }
            }

            return(frequencies);
        }
Пример #7
0
        public static Bitmap IFFT2D(Complex[][] data, Bitmap originalBitmap)
        {
            FourierHelper.Conjugate(data);
            for (int i = 0; i < data.Length; i++)
            {
                FFT1D(data[i]);
            }
            FourierHelper.Conjugate(data);

            CollectionHelper.ApplyOperation(data, c => c / data[0].Length);

            var swappedData = CollectionHelper.SwapRowColumn(data);

            FourierHelper.Conjugate(swappedData);
            for (int i = 0; i < swappedData.Length; i++)
            {
                FFT1D(swappedData[i]);
            }
            FourierHelper.Conjugate(swappedData);

            CollectionHelper.ApplyOperation(swappedData, c => c / swappedData[0].Length);

            using (var bitmapData = new SingleBitmapData(originalBitmap, PixelFormat.Format8bppIndexed))
            {
                for (int y = 0; y < bitmapData.HeightInPixels; y++)
                {
                    for (int x = 0;
                         x < bitmapData.WidthInBytes;
                         x += bitmapData.BytesPerPixel)
                    {
                        bitmapData.FirstPixelPtr[x + y * bitmapData.WidthInBytes] = (byte)ImageHelper.FixOverflow(swappedData[y][x].Real);
                    }
                }

                return(bitmapData.Bitmap);
            }
        }
Пример #8
0
        public double[] Process(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];
            }

            if (_gain < 0)
            {
                _gain = 1 / Math.Abs(_gain) - 1;
            }

            var windowFactors = _window.WindowFactors(_windowLength);

            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;
                }
            }

            var freq       = wavData.FormatChunk.SampleRate / _lfo;
            var filterSize = _endBandFreq - _bandSize - _startBandFreq;

            for (int i = 0; i < windows.Length; i++)
            {
                var highPass = (Math.Sin(2 * Math.PI * i * _windowHopSize / freq) * 0.5 + 0.5) * filterSize + _startBandFreq;
                var lowPass  = highPass + _bandSize;

                var bandFilterFactors = BasicFilter.BandPassFilterFactors(lowPass, highPass, wavData.FormatChunk.SampleRate, _filterLength, n);

                windowsComplex[i] = FourierTransform.FFT(windows[i]);
                for (int j = 0; j < windowsComplex[i].Length; j++)
                {
                    windowsComplex[i][j] += windowsComplex[i][j] * bandFilterFactors[j] * _gain;
                }
                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);
        }