public override void FftKernel(Complex[] x, Complex[] y, int y0, int dy, int sign) { // all we have to do here is convolve (b x) with b-star // to do this convolution, we need to multiply the DFT of (b x) with the DFT of b-star, the IDFT the result back // we have already stored the DFT of b-star // create c = b x and transform it into Fourier space Complex[] c = new Complex[Nb]; if (sign > 0) { for (int i = 0; i < R; i++) { c[i] = b[i] * x[i]; } } else { for (int i = 0; i < R; i++) { c[i] = b[i] * x[i].Conjugate; } } Complex[] ct = ft.Transform(c); // multiply b-star and c = b x in Fourier space, and inverse transform the product back into configuration space for (int i = 0; i < Nb; i++) { ct[i] = ct[i] * bt[i]; } c = ft.InverseTransform(ct); // read off the result if (sign > 0) { for (int i = 0; i < R; i++) { y[y0 + i * dy] = b[i] * c[i]; } } else { for (int i = 0; i < R; i++) { y[y0 + i * dy] = b[i].Conjugate * c[i].Conjugate; } } // for the sign < 0 case, we have used the fact that the convolution of (b-star x) with b is // just the convolution of (b x-star) with b-star, starred }
public BluesteinTransformlet(int R, int N, Complex[] u) : base(R, N, u) { // figure out the right Bluestein length and create a transformer for it Nb = SetBluesteinLength(2 * R - 1); ft = new FourierTransformer(Nb); // compute the Bluestein coeffcients and compute the FT of the filter based on them b = ComputeBluesteinCoefficients(R); Complex[] c = new Complex[Nb]; c[0] = 1.0; for (int i = 1; i < R; i++) { c[i] = b[i].Conjugate; c[Nb - i] = c[i]; } bt = ft.Transform(c); }
public static List<double> AmplitudeFromLR2(int snapsize, double[] l, int i_skip, int i_count, double lowpass = 2.5, Dictionary<int, double> mw = null) { FourierTransformer ft = new FourierTransformer(snapsize); var xxa = new Complex[i_count]; if (mw.Count == i_count) for (int j = 0; j < i_count; j++) xxa[j] = new Complex(l[j + i_skip] * mw[j], l[j + i_skip] * mw[j]); else return null; var ftt = ft.Transform(xxa).Take((int)(i_count / (2 * lowpass))); // TAKING ONLY LEFT HALF OF FFT RESULT List<double> pow_re_im = new List<double>(); //ftt.ToList().ForEach(t => pow_re_im.Add(Math.Log(ComplexMath.Abs(t)))); //ftt.ToList().ForEach(t => pow_re_im.Add(Math.Sqrt(Math.Max(Math.Log(ComplexMath.Abs(t)),0)))); ftt.ToList().ForEach(t => pow_re_im.Add(Math.Pow(Math.Max(Math.Log(ComplexMath.Abs(t)), 0), 2))); return pow_re_im; }
public bool MakeSnaps(int _snapsize, int _snapcount, string _path, int smooth_size) { try { using (Mp3FileReader pcm = new Mp3FileReader(_path)) { int samplesDesired = _snapsize; int blockscount = _snapcount; snap_size = _snapsize; snap_count = _snapcount; total_samples = pcm.Length; length = pcm.TotalTime.Seconds; path = _path; if ((pcm.WaveFormat.SampleRate != 44100) || (pcm.WaveFormat.BitsPerSample != 16)) return false; for (int i = 0; i < blockscount; i++) { byte[] buffer = new byte[samplesDesired * 4]; short[] left = new short[samplesDesired]; short[] right = new short[samplesDesired]; double[] leftd = new double[samplesDesired]; double[] rightd = new double[samplesDesired]; int bytesRead = 0; //for (int j = 0; j < 1; j++) /////////// int seek_counter = 0; seek: pcm.Seek((i + 1) * (i + 1) * (i + 1) * blockscount * samplesDesired % (total_samples - samplesDesired), SeekOrigin.Begin); seek_counter++; bytesRead = pcm.Read(buffer, 0, 4 * samplesDesired); int index = 0; for (int sample = 0; sample < bytesRead / 4; sample++) { left[sample] = BitConverter.ToInt16(buffer, index); index += 2; right[sample] = BitConverter.ToInt16(buffer, index); index += 2; } if (left.Average(t => Math.Abs(t)) == 0) if (seek_counter > 5) return false; else goto seek; //snap_log10_energy.Add(Math.Log10(left.Average(t => Math.Abs(t)))); leftd = Normalize(left, left.Length); rightd = Normalize(right, right.Length); //alglib.complex[] fl; //alglib.fftr1d(leftd, out fl); //fl[0].x; FourierTransformer ft = new FourierTransformer(samplesDesired); var xxa = new Complex[leftd.Length]; for (int j = 0; j < leftd.Length; j++) xxa[j] = new Complex(leftd[j], rightd[j]); var ftt = ft.Transform(xxa); List<double> pow_re_im = new List<double>(); //List<double> arg_re_im = new List<double>(); ftt.ToList().ForEach(t => pow_re_im.Add(ComplexMath.Abs(t))); //ftt.ToList().ForEach(t => arg_re_im.Add(ComplexMath.Arg(t))); /*if (Double.IsNaN(MC_Log10_Energy(pow_re_im))) if (seek_counter > 5) return false; else goto seek;*/ fft_snaps.Add(pow_re_im); //fft_smoothed_snaps.Add(Smoothen(pow_re_im, smooth_size)); //pow_re_im = Normalize(pow_re_im); /* var f_pwri = pow_re_im.Average(t => Math.Abs(t)); for (int k = 0; k < pow_re_im.Count; k++) pow_re_im[k] = (Math.Abs(pow_re_im[k]) >= f_pwri * 1.5) ? pow_re_im[k] : 0; */ /* FourierTransformer ft2 = new FourierTransformer(samplesDesired); var xx2 = new List<Complex>(); for (int j = 0; j < pow_re_im.Count; j++) { xx2.Add(new Complex(pow_re_im[j], arg_re_im[j])); } var ftt2 = ft2.Transform(xx2); //var ftt2 = ft2.Transform(ftt); List<double> pow_re_im2 = new List<double>(); ftt2.ToList().ForEach(t => pow_re_im2.Add(ComplexMath.Abs(t))); pow_re_im2 = Normalize(pow_re_im2); fft2_snaps.Add(pow_re_im2); fft2_smoothed_snaps.Add(Smoothen(pow_re_im2, smooth_size)); */ } pcm.Close(); } } catch (Exception e) { return false; } return true; }