| 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 |