Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: third_party/WebKit/LayoutTests/webaudio/resources/biquad-testing.js

Issue 1885723003: Implement Biquad lowpass and highpass filters according to spec (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Globals, to make testing and debugging easier. 1 // Globals, to make testing and debugging easier.
2 var context; 2 var context;
3 var filter; 3 var filter;
4 var signal; 4 var signal;
5 var renderedBuffer; 5 var renderedBuffer;
6 var renderedData; 6 var renderedData;
7 7
8 var sampleRate = 44100.0; 8 var sampleRate = 44100.0;
9 var pulseLengthFrames = .1 * sampleRate; 9 var pulseLengthFrames = .1 * sampleRate;
10 10
(...skipping 22 matching lines...) Expand all
33 var data = impulse.getChannelData(0); 33 var data = impulse.getChannelData(0);
34 for (var k = 1; k < data.length; ++k) { 34 for (var k = 1; k < data.length; ++k) {
35 data[k] = 0; 35 data[k] = 0;
36 } 36 }
37 data[0] = 1; 37 data[0] = 1;
38 38
39 return impulse; 39 return impulse;
40 } 40 }
41 41
42 42
43 function createTestAndRun(context, filterType, filterParameters) { 43 function createTestAndRun(context, filterType, testParameters) {
44 // To test the filters, we apply a signal (an impulse) to each of 44 // To test the filters, we apply a signal (an impulse) to each of
45 // the specified filters, with each signal starting at a different 45 // the specified filters, with each signal starting at a different
46 // time. The output of the filters is summed together at the 46 // time. The output of the filters is summed together at the
47 // output. Thus for filter k, the signal input to the filter 47 // output. Thus for filter k, the signal input to the filter
48 // starts at time k * timeStep. For this to work well, timeStep 48 // starts at time k * timeStep. For this to work well, timeStep
49 // must be large enough for the output of each filter to have 49 // must be large enough for the output of each filter to have
50 // decayed to zero with timeStep seconds. That way the filter 50 // decayed to zero with timeStep seconds. That way the filter
51 // outputs don't interfere with each other. 51 // outputs don't interfere with each other.
52 52
53 var filterParameters = testParameters.filterParameters;
53 nFilters = Math.min(filterParameters.length, maxFilters); 54 nFilters = Math.min(filterParameters.length, maxFilters);
54 55
55 signal = new Array(nFilters); 56 signal = new Array(nFilters);
56 filter = new Array(nFilters); 57 filter = new Array(nFilters);
57 58
58 impulse = createImpulseBuffer(context, pulseLengthFrames); 59 impulse = createImpulseBuffer(context, pulseLengthFrames);
59 60
60 // Create all of the signal sources and filters that we need. 61 // Create all of the signal sources and filters that we need.
61 for (var k = 0; k < nFilters; ++k) { 62 for (var k = 0; k < nFilters; ++k) {
62 signal[k] = context.createBufferSource(); 63 signal[k] = context.createBufferSource();
63 signal[k].buffer = impulse; 64 signal[k].buffer = impulse;
64 65
65 filter[k] = context.createBiquadFilter(); 66 filter[k] = context.createBiquadFilter();
66 filter[k].type = filterType; 67 filter[k].type = filterType;
67 filter[k].frequency.value = context.sampleRate / 2 * filterParameters[k] .cutoff; 68 filter[k].frequency.value = context.sampleRate / 2 * filterParameters[k] .cutoff;
68 filter[k].detune.value = (filterParameters[k].detune === undefined) ? 0 : filterParameters[k].detune; 69 filter[k].detune.value = (filterParameters[k].detune === undefined) ? 0 : filterParameters[k].detune;
69 filter[k].Q.value = filterParameters[k].q; 70 filter[k].Q.value = filterParameters[k].q;
70 filter[k].gain.value = filterParameters[k].gain; 71 filter[k].gain.value = filterParameters[k].gain;
71 72
72 signal[k].connect(filter[k]); 73 signal[k].connect(filter[k]);
73 filter[k].connect(context.destination); 74 filter[k].connect(context.destination);
74 75
75 signal[k].start(timeStep * k); 76 signal[k].start(timeStep * k);
76 } 77 }
77 78
78 context.oncomplete = checkFilterResponse(filterType, filterParameters); 79 context.oncomplete = checkFilterResponse(filterType, testParameters);
79 context.startRendering(); 80 context.startRendering();
80 } 81 }
81 82
82 function addSignal(dest, src, destOffset) { 83 function addSignal(dest, src, destOffset) {
83 // Add src to dest at the given dest offset. 84 // Add src to dest at the given dest offset.
84 for (var k = destOffset, j = 0; k < dest.length, j < src.length; ++k, ++j) { 85 for (var k = destOffset, j = 0; k < dest.length, j < src.length; ++k, ++j) {
85 dest[k] += src[j]; 86 dest[k] += src[j];
86 } 87 }
87 } 88 }
88 89
(...skipping 19 matching lines...) Expand all
108 filterParameters[k].gain); 109 filterParameters[k].gain);
109 var y = filterData(filterCoef, data, renderLengthSamples); 110 var y = filterData(filterCoef, data, renderLengthSamples);
110 111
111 // Accumulate this filtered data into the final output at the desired of fset. 112 // Accumulate this filtered data into the final output at the desired of fset.
112 addSignal(result, y, timeToSampleFrame(timeStep * k, sampleRate)); 113 addSignal(result, y, timeToSampleFrame(timeStep * k, sampleRate));
113 } 114 }
114 115
115 return result; 116 return result;
116 } 117 }
117 118
118 function checkFilterResponse(filterType, filterParameters) { 119 function checkFilterResponse(filterType, testParameters) {
119 return function(event) { 120 return function(event) {
121 var filterParameters = testParameters.filterParameters;
122 var maxAllowedError = testParameters.threshold;
120 renderedBuffer = event.renderedBuffer; 123 renderedBuffer = event.renderedBuffer;
121 renderedData = renderedBuffer.getChannelData(0); 124 renderedData = renderedBuffer.getChannelData(0);
122 125
123 reference = generateReference(filterType, filterParameters); 126 reference = generateReference(filterType, filterParameters);
124 127
125 var len = Math.min(renderedData.length, reference.length); 128 var len = Math.min(renderedData.length, reference.length);
126 129
127 var success = true; 130 var success = true;
128 131
129 // Maximum error between rendered data and expected data 132 // Maximum error between rendered data and expected data
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 } 173 }
171 174
172 if (success) { 175 if (success) {
173 testPassed("Test signal was correctly filtered."); 176 testPassed("Test signal was correctly filtered.");
174 } else { 177 } else {
175 testFailed("Test signal was not correctly filtered."); 178 testFailed("Test signal was not correctly filtered.");
176 } 179 }
177 finishJSTest(); 180 finishJSTest();
178 } 181 }
179 } 182 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698