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; }
public RawAudioData Mp3ToPcm(string fileName) { var resStream = new MemoryStream(); var result = new RawAudioData(); if (File.Exists(fileName)) { using (var mp3 = new Mp3FileReader(fileName)) { var frame0 = mp3.ReadNextFrame(); result.SampleRate = frame0.SampleRate; result.BitRate = frame0.BitRate; mp3.Seek(0, SeekOrigin.Begin); mp3.CopyTo(resStream); } } result.Data = resStream.ToArray(); return result; }