haikuwebkit/LayoutTests/webaudio/BiquadFilter/tail-time-lowshelf.html

84 lines
2.9 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html>
<head>
<title>Test Biquad Tail-Time</title>
<script src="../../imported/w3c/web-platform-tests/resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../resources/audit-util.js"></script>
<script src="../resources/audit.js"></script>
<script src="../resources/biquad-filters.js"></script>
<script src="test-tail-time.js"></script>
</head>
<body>
<script>
let audit = Audit.createTaskRunner();
let sampleRate = 16384;
let renderSeconds = 1;
let renderFrames = renderSeconds * sampleRate;
let renderQuantumFrames = 128;
// For a lowshelf filter:
// b0 = A*[(A+1)(A1)*cos(w0)+2*as*sqrt(A)]
// b1 = 2*A*[(A+1)-(A-1)*cos(w0)]
// b2 = A*[(A+1)(A1)*cos(w0)-2*as*sqrt(A)]
// a0 = (A+1)+(A-1)*cos(w0)+2*as*sqrt(A)
// a1 = -2*[(A-1)+(A+1)*cos(w0)]
// a2 = (A+1)+(A-1)*cos(w0)-2*as*sqrt(A)
//
// where as = sin(w0)/sqrt(2), w0 = 2*%pi*f0/Fs, and A = 10^(G/40)
//
// The poles of this filter are
//
// -a2/(2*a0) +/- sqrt(a1^2-4*a0*a2)/(2*a0).
//
// Thus, the poles depend on the sign of d = a1^2-4*a0*a2 =
// 16*A*(as^2-sin(w0)^2) = -8*A*sin(w0)^2. Thus, the poles are always
// complex except if w0 = 0, in which case there is a repeated pole at 0.
// Array of tests to run. |descripton| is the task description for
// audit.define. |parameters| is option for |testTailTime|.
let tests = [
{
descripton:
{label: 'lowshelf-complex-roots', description: 'complex roots'},
parameters: {
prefix: 'Lowshelf complex roots',
filterOptions:
{type: 'lowshelf', gain: 40, frequency: sampleRate / 8},
// Node computed tail frame is 75.5 frames, which matches the actual
// tail, so tail output should be exactly zero.
threshold: 0
},
},
{
descripton: {
label: 'lowshelf-repeated-roots',
description: 'repeated real root'
},
parameters: {
prefix: 'Lowshelf repeated roots',
filterOptions:
{type: 'lowshelf', Q: 1 / 20, gain: 40, frequency: 0},
// Node computed tail frame is 2 frames, which matches the actual
// tail, so tail output should be exactly zero.
threshold: 0
},
},
];
// Define an appropriate task for each test.
tests.forEach(entry => {
audit.define(entry.descripton, (task, should) => {
let context = new OfflineAudioContext(1, renderFrames, sampleRate);
testTailTime(should, context, entry.parameters)
.then(() => task.done());
});
});
audit.run();
</script>
</body>
</html>