Exemple #1
0
        public static IEnumerable <Complex> ChirpTransform(Complex[] input, LocalRange range, int sampleRate)
        {
            var samplesLength = input.Length;
            var NM1           = samplesLength + range.ZoomOptions.TargetNumberOfSamples - 1;
            var A             = Complex.Exp(new Complex(0, -2 * Math.PI * range.LeftThreshold / sampleRate));
            var W             = Complex.Exp(new Complex(0, -2 * Math.PI * ((range.RightThreshold - range.LeftThreshold) / (2 * (range.ZoomOptions.TargetNumberOfSamples - 1)) / sampleRate)));

            var y1 = new Complex[NM1];
            var y2 = new Complex[NM1];

            for (int k = 0; k < NM1 - 1; k++)
            {
                if (k < samplesLength)
                {
                    y1[k] = Complex.Pow(A * Complex.Pow(W, k), k) * input[k];
                }
                else
                {
                    y1[k] = 0;
                }

                if (k < range.ZoomOptions.TargetNumberOfSamples)
                {
                    y2[k] = Complex.Pow(W, -Math.Pow(k, 2));
                }
                else
                {
                    y2[k] = Complex.Pow(W, (-Math.Pow((NM1 - k), 2)));
                }
            }

            Convolve(y1, y2);

            //that can be improved by move scaling from Convolve to this and process only target number of samples
            for (int k = 0; k < range.ZoomOptions.TargetNumberOfSamples; k++)
            {
                y1[k] *= Complex.Pow(W, Math.Pow(k, 2));
            }

            return(y1.Take(range.ZoomOptions.TargetNumberOfSamples));
        }
Exemple #2
0
        public static void AssignZoomedValues(this ObservableDataSource <Point> source, List <double> newValues, LocalRange range)
        {
            source.SuspendUpdate();
            source.Collection.Clear();
            var length = newValues.Count;
            var skip   = (range.RightThreshold - range.LeftThreshold) / range.ZoomOptions.TargetNumberOfSamples;

            for (int i = 0; i < length; i += 5)
            {
                var x = range.LeftThreshold + i * skip;
                source.Collection.Add(new Point {
                    X = x, Y = newValues[i]
                });
            }
            source.ResumeUpdate();
        }
        private static IEnumerable <Complex> ChirpFFT(float[] data, ChirpModel model, LocalRange range)
        {
            if (model == null)
            {
                return(null);
            }

            var fftComplex = new Complex[data.Length]; // the FFT function requires complex format

            for (int i = 0; i < fftComplex.Length; i++)
            {
                fftComplex[i] = new Complex(data[i], 0.0);// make it complex format (imaginary = 0)
            }

            return(FFTProcessor.ChirpTransform(fftComplex, range, model.SampleRate));
        }