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 |