OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |