Exemplo n.º 1
0
        public CrossTimeEngine(string configurationFilePath, CrossTimeEngineLog log)
        {
            this.Configuration = CrossTimeDspConfiguration.Load(configurationFilePath);
            this.disposed      = false;
            this.log           = log;
            this.Stopping      = false;

            MediaFoundationApi.Startup();

            Filter firstReverseTimeFilter = this.Configuration.Filters.FirstOrDefault(filter => filter.TimeDirection == TimeDirection.Reverse);

            if (firstReverseTimeFilter != null)
            {
                firstReverseTimeFilter.AdjustGain(this.Configuration.Engine.ReverseTimeAntiClippingAttenuationInDB);
            }
        }
Exemplo n.º 2
0
        public void InverseAllpassAndWav()
        {
            // remove any existing output files to guarantee test runs on up to date data
            string outputFileName16Bit  = "inverseAllpassAndWav.44100.16.double.wav";
            string outputFileName24Bit  = "inverseAllpassAndWav.44100.24.double.wav";
            string outputFileNameQ31x63 = "inverseAllpassAndWav.44100.24.Q31_32x64.wav";

            this.RemoveExistingOutputFiles(outputFileName16Bit, outputFileName24Bit, outputFileNameQ31x63);

            // run test cases
            // check 24 bit cases
            CrossTimeEngine engine = new CrossTimeEngine(TestConstant.DefaultConfigurationFile, this);

            engine.FilterFiles(Environment.CurrentDirectory, TestConstant.SourceFilePath16Bit, outputFileName24Bit);
            this.VerifyWaveFilesEquivalent(outputFileName24Bit, TestConstant.ReferenceFilePath24Bit, TestConstant.ReferenceFileScaleFactor, 1.5 * TestConstant.Q23ToQ31TruncationErrorIncrease, true);

            // check cross bitness case - cases in the same bitness are less likely to catch conversion and 24 bit handling defects
            // Scale factor is bit length times anti-clipping gain.
            // Tolerance here may seem loose but comparing 24 bit samples to their truncated 16 bit form is inexact.
            this.VerifyWaveFilesEquivalent(outputFileName24Bit, TestConstant.ReferenceFilePath16Bit, 0.3162 * 256.0, 40.5 * TestConstant.Q23ToQ31TruncationErrorIncrease, false);

            // check fixed point
            engine.Configuration.Engine.Precision = FilterPrecision.Q31_32x64;
            engine.FilterFiles(Environment.CurrentDirectory, TestConstant.SourceFilePath16Bit, outputFileNameQ31x63);
            this.VerifyWaveFilesEquivalent(outputFileNameQ31x63, TestConstant.ReferenceFilePath24Bit, TestConstant.ReferenceFileScaleFactor, 1.6 * TestConstant.Q23ToQ31TruncationErrorIncrease, false);

            // check 16 bit cases
            double adjustmentToUnityGain = -engine.Configuration.Engine.ReverseTimeAntiClippingAttenuationInDB;

            engine.Configuration.Engine.Precision = FilterPrecision.Double;
            engine.Configuration.Engine.ReverseTimeAntiClippingAttenuationInDB += adjustmentToUnityGain;
            Filter firstReverseTimeFilter = engine.Configuration.Filters.FirstOrDefault(filter => filter.TimeDirection == TimeDirection.Reverse);

            if (firstReverseTimeFilter != null)
            {
                firstReverseTimeFilter.AdjustGain(adjustmentToUnityGain);
            }
            engine.Configuration.Output.BitsPerSample = 16;
            engine.FilterFiles(Environment.CurrentDirectory, TestConstant.SourceFilePath16Bit, outputFileName16Bit);
            this.VerifyWaveFilesEquivalent(outputFileName16Bit, TestConstant.ReferenceFilePath16Bit, 1.0, 1.0 * TestConstant.Q15ToQ31TruncationErrorIncrease, true);
        }