| OLD | NEW |
| 1 <!doctype> | 1 <!DOCTYPE html> |
| 2 <html> | 2 <html> |
| 3 <head> | 3 <head> |
| 4 <title> |
| 5 audiobuffer-resample.html |
| 6 </title> |
| 4 <script src="../../resources/testharness.js"></script> | 7 <script src="../../resources/testharness.js"></script> |
| 5 <script src="../../resources/testharnessreport.js"></script> | 8 <script src="../../resources/testharnessreport.js"></script> |
| 6 <script src="../resources/audit-util.js"></script> | 9 <script src="../resources/audit-util.js"></script> |
| 7 <script src="../resources/audit.js"></script> | 10 <script src="../resources/audit.js"></script> |
| 8 </head> | 11 </head> |
| 9 | |
| 10 <body> | 12 <body> |
| 11 <script> | 13 <script id="layout-test-code"> |
| 12 let audit = Audit.createTaskRunner(); | 14 let audit = Audit.createTaskRunner(); |
| 13 | 15 |
| 14 // These are global to make debugging a little easier. | 16 // These are global to make debugging a little easier. |
| 15 let context; | 17 let context; |
| 16 let buffer; | 18 let buffer; |
| 17 let source; | 19 let source; |
| 18 let renderedData; | 20 let renderedData; |
| 19 let trueData; | 21 let trueData; |
| 20 let signalEnergy; | 22 let signalEnergy; |
| 21 let noiseEnergy; | 23 let noiseEnergy; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 47 signal[k] = Math.sin(omega * k); | 49 signal[k] = Math.sin(omega * k); |
| 48 | 50 |
| 49 return buf; | 51 return buf; |
| 50 } | 52 } |
| 51 | 53 |
| 52 // Check the output against the expected output. | 54 // Check the output against the expected output. |
| 53 function checkResult(buffer, should) { | 55 function checkResult(buffer, should) { |
| 54 renderedData = buffer.getChannelData(0); | 56 renderedData = buffer.getChannelData(0); |
| 55 let length = renderedData.length; | 57 let length = renderedData.length; |
| 56 // Generate a reference sine wave at the context rate | 58 // Generate a reference sine wave at the context rate |
| 57 let trueReference = createSineBuffer(context, toneFrequency, context.sam
pleRate); | 59 let trueReference = |
| 60 createSineBuffer(context, toneFrequency, context.sampleRate); |
| 58 trueData = trueReference.getChannelData(0); | 61 trueData = trueReference.getChannelData(0); |
| 59 | 62 |
| 60 // To compare the actual output against the reference, we compute the | 63 // To compare the actual output against the reference, we compute the |
| 61 // peak error and the SNR between the two. | 64 // peak error and the SNR between the two. |
| 62 signalEnergy = 0; | 65 signalEnergy = 0; |
| 63 noiseEnergy = 0; | 66 noiseEnergy = 0; |
| 64 maxError = -1; | 67 maxError = -1; |
| 65 | 68 |
| 66 let success = true; | 69 let success = true; |
| 67 | 70 |
| 68 // Compute the peak error and the SNR. | 71 // Compute the peak error and the SNR. |
| 69 for (let k = 0; k < length / 2; ++k) { | 72 for (let k = 0; k < length / 2; ++k) { |
| 70 let diff = renderedData[k] - trueData[k]; | 73 let diff = renderedData[k] - trueData[k]; |
| 71 noiseEnergy += diff * diff; | 74 noiseEnergy += diff * diff; |
| 72 signalEnergy += trueData[k] * trueData[k]; | 75 signalEnergy += trueData[k] * trueData[k]; |
| 73 if (Math.abs(diff) > maxError) | 76 if (Math.abs(diff) > maxError) |
| 74 maxError = Math.abs(diff); | 77 maxError = Math.abs(diff); |
| 75 } | 78 } |
| 76 | 79 |
| 77 let snr; | 80 let snr; |
| 78 | 81 |
| 79 if (noiseEnergy == 0) | 82 if (noiseEnergy == 0) |
| 80 snr = 1000; | 83 snr = 1000; |
| 81 else | 84 else |
| 82 snr = 10 * Math.log10(signalEnergy / noiseEnergy); | 85 snr = 10 * Math.log10(signalEnergy / noiseEnergy); |
| 83 | 86 |
| 84 should(maxError, "Peak error between actual and reference data") | 87 should(maxError, 'Peak error between actual and reference data') |
| 85 .beLessThan(peakThreshold); | 88 .beLessThan(peakThreshold); |
| 86 | 89 |
| 87 should(snr, "SNR") | 90 should(snr, 'SNR').beGreaterThan(snrThreshold); |
| 88 .beGreaterThan(snrThreshold); | |
| 89 } | 91 } |
| 90 | 92 |
| 91 audit.define("Test resampling of an AudioBuffer", | 93 audit.define('Test resampling of an AudioBuffer', function(task, should) { |
| 92 function(task, should) { | 94 context = new OfflineAudioContext( |
| 93 context = new OfflineAudioContext(1, lengthInSeconds * | 95 1, lengthInSeconds * sampleRate, sampleRate); |
| 94 sampleRate, | |
| 95 sampleRate); | |
| 96 | 96 |
| 97 // Create a sine wave in a buffer that's different from the context ra
te | 97 // Create a sine wave in a buffer that's different from the context rate |
| 98 // to test resampling. | 98 // to test resampling. |
| 99 buffer = createSineBuffer(context, toneFrequency, bufferRate); | 99 buffer = createSineBuffer(context, toneFrequency, bufferRate); |
| 100 source = context.createBufferSource(); | 100 source = context.createBufferSource(); |
| 101 source.buffer = buffer; | 101 source.buffer = buffer; |
| 102 source.connect(context.destination); | 102 source.connect(context.destination); |
| 103 source.start(); | 103 source.start(); |
| 104 | 104 |
| 105 context.startRendering() | 105 context.startRendering() |
| 106 .then(function(buffer) { | 106 .then(function(buffer) { |
| 107 checkResult(buffer, should); | 107 checkResult(buffer, should); |
| 108 }) | 108 }) |
| 109 .then(task.done.bind(task)); | 109 .then(task.done.bind(task)); |
| 110 }); | 110 }); |
| 111 | 111 |
| 112 audit.run(); | 112 audit.run(); |
| 113 </script> | 113 </script> |
| 114 </body> | 114 </body> |
| 115 </html> | 115 </html> |
| OLD | NEW |