static void EnumerateByFrequencyBands( WaveReader originalReader, WaveReader compressedReader, long compressedSamplesToSkip, Action<float[], float[]> highComparisonMethod, Action<float[], float[]> midComparisonMethod, Action<float[], float[]> lowComparisonMethod) { originalReader.Seek(0); compressedReader.Seek(compressedSamplesToSkip); var originalHighSamplesQueue = new Queue<float[]> (); var compressedHighSamplesQueue = new Queue<float[]> (); var originalMidSamples = SampleRateAdjustor.DownSample (originalReader.ReadAllSamples_Float (), originalReader.NumChannels, 16, originalHighSamplesQueue.Enqueue); var compressedMidSamples = SampleRateAdjustor.DownSample (compressedReader.ReadAllSamples_Float (), compressedReader.NumChannels, 16, compressedHighSamplesQueue.Enqueue); var originalMidSamplesQueue = new Queue<float[]> (); var compressedMidSamplesQueue = new Queue<float[]> (); var originalLowSamples = SampleRateAdjustor.DownSample (originalMidSamples, originalReader.NumChannels, 16, originalMidSamplesQueue.Enqueue); var compressedLowSamples = SampleRateAdjustor.DownSample (compressedMidSamples, compressedReader.NumChannels, 16, compressedMidSamplesQueue.Enqueue); using (var compressedSamplesItr = compressedLowSamples.GetEnumerator ()) { foreach (var originalSamples in originalLowSamples) { if (compressedSamplesItr.MoveNext ()) { var compressedSamples = compressedSamplesItr.Current; lowComparisonMethod (originalSamples.ToArray (), compressedSamples.ToArray ()); while (originalHighSamplesQueue.Count > 0 && compressedHighSamplesQueue.Count > 0) highComparisonMethod (originalHighSamplesQueue.Dequeue (), compressedHighSamplesQueue.Dequeue ()); while (originalMidSamplesQueue.Count > 0 && compressedMidSamplesQueue.Count > 0) midComparisonMethod (originalMidSamplesQueue.Dequeue (), compressedMidSamplesQueue.Dequeue ()); } else { Console.WriteLine ("Compressed file is shorter"); break; } } if (compressedSamplesItr.MoveNext ()) { Console.WriteLine ("Compressed file is longer"); } } }
static void EnumerateBySamples(WaveReader originalReader, WaveReader compressedReader, long compressedSamplesToSkip, Action<float[], float[]> compareMethod) { originalReader.Seek(0); compressedReader.Seek(compressedSamplesToSkip); using (var compressedSamplesItr = compressedReader.ReadAllSamples_Float ().GetEnumerator ()) { foreach (var originalSamples in originalReader.ReadAllSamples_Float ()) { if (compressedSamplesItr.MoveNext ()) { var compressedSamples = compressedSamplesItr.Current; compareMethod (originalSamples, compressedSamples); } else { Console.WriteLine ("Compressed file is shorter"); break; } } if (compressedSamplesItr.MoveNext ()) { Console.WriteLine ("Compressed file is longer"); } } }
static void EnumerateByFrequencies(WaveReader originalReader, WaveReader compressedReader, int numChannels, int windowSize, float samplesPerCheck, Dictionary<int, Action<float[], float[]>> comparisonMethods, long compressedSamplesToSkip) { originalReader.Seek(0); compressedReader.Seek(compressedSamplesToSkip); var fft = new ComplexFourierTransformation(); var originalQueue = new Queue<float[]> (); var compressedQueue = new Queue<float[]> (); using (var compressedSamplesItr = compressedReader.ReadAllSamples_Float ().GetEnumerator ()) { foreach (var originalSamples in originalReader.ReadAllSamples_Float ()) { if (compressedSamplesItr.MoveNext ()) { originalQueue.Enqueue (originalSamples); compressedQueue.Enqueue (compressedSamplesItr.Current); if (originalQueue.Count == windowSize) { for (var channelCtr = 0; channelCtr < numChannels; channelCtr++) { var originalSamplesToTransform = originalQueue.Select (s => new Complex (s [channelCtr], 0)).ToArray (); var compressedSamplesToTransform = compressedQueue.Select (s => new Complex (s [channelCtr], 0)).ToArray (); fft.TransformForward (originalSamplesToTransform); fft.TransformForward (compressedSamplesToTransform); foreach (var kvp in comparisonMethods) { var fftIndex = kvp.Key; var comparisonMethod = kvp.Value; comparisonMethod( new float[] { Convert.ToSingle (originalSamplesToTransform [fftIndex].Modulus) }, new float[] { Convert.ToSingle (compressedSamplesToTransform [fftIndex].Modulus) }); } } for (var ctr = 0; ctr < samplesPerCheck; ctr++) { originalQueue.Dequeue (); compressedQueue.Dequeue (); } } } else { Console.WriteLine ("Compressed file is shorter"); break; } } if (compressedSamplesItr.MoveNext ()) { Console.WriteLine ("Compressed file is longer"); } } }