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