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