tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_convolverNodeDelay.html (2293B)


      1 <!DOCTYPE html>
      2 <title>Test convolution to delay a triangle pulse</title>
      3 <script src="/resources/testharness.js"></script>
      4 <script src="/resources/testharnessreport.js"></script>
      5 <script>
      6 const sampleRate = 48000;
      7 const LENGTH = 12800;
      8 // tolerate 16-bit math.
      9 const EPSILON = 1.0 / Math.pow(2, 15);
     10 
     11 // Triangle pulse
     12 var sourceBuffer = new OfflineAudioContext(1, 1, sampleRate).
     13  createBuffer(1, 2 * 128, sampleRate);
     14 var channelData = sourceBuffer.getChannelData(0);
     15 for (var i = 0; i < 128; ++i) {
     16  channelData[i] = i/128;
     17  channelData[128 + i] = 1.0 - i/128;
     18 }
     19 
     20 function test_delay_index(delayIndex) {
     21 
     22  var context = new OfflineAudioContext(2, LENGTH, sampleRate);
     23 
     24  var merger = context.createChannelMerger(2);
     25  merger.connect(context.destination);
     26 
     27  var impulse = context.createBuffer(1, delayIndex + 1, sampleRate);
     28  impulse.getChannelData(0)[delayIndex] = 1.0;
     29  var convolver = context.createConvolver();
     30  convolver.normalize = false;
     31  convolver.buffer = impulse;
     32  convolver.connect(merger, 0, 0);
     33 
     34  var delayTime = delayIndex/sampleRate;
     35  var delay = context.createDelay(delayTime || 1/sampleRate);
     36  delay.delayTime.value = delayTime;
     37  delay.connect(merger, 0, 1);
     38 
     39  var source = context.createBufferSource();
     40  source.buffer = sourceBuffer;
     41  source.connect(convolver);
     42  source.connect(delay);
     43  source.start(0);
     44 
     45  return context.startRendering().
     46    then((buffer) => {
     47      var convolverOutput = buffer.getChannelData(0);
     48      var delayOutput = buffer.getChannelData(1);
     49      var maxDiff = 0.0;
     50      var maxIndex = 0;
     51      for (var i = 0; i < buffer.length; ++i) {
     52        var diff = Math.abs(convolverOutput[i] - delayOutput[i]);
     53        if (diff > maxDiff) {
     54          maxDiff = diff;
     55          maxIndex = i;
     56        }
     57      }
     58      // The convolver should produce similar output to the delay.
     59      assert_approx_equals(convolverOutput[maxIndex], delayOutput[maxIndex],
     60                           EPSILON, "output at " + maxIndex);
     61    });
     62 }
     63 
     64 // The 5/4 ratio provides sampling across a range of delays and offsets within
     65 // blocks.
     66 for (var delayIndex = 0;
     67     delayIndex < LENGTH;
     68     delayIndex = Math.floor((5 * (delayIndex + 1)) / 4)) {
     69  promise_test(test_delay_index.bind(null, delayIndex),
     70               "Delay " + delayIndex);
     71 }
     72 </script>