Skip to content

Commit 02eabb0

Browse files
committed
test: add test.rfftf.js
1 parent 95853cb commit 02eabb0

File tree

1 file changed

+166
-0
lines changed

1 file changed

+166
-0
lines changed
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
/**
2+
* @license Apache-2.0
3+
*
4+
* Copyright (c) 2025 The Stdlib Authors.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
'use strict';
20+
21+
// MODULES //
22+
23+
var tape = require( 'tape' );
24+
var Float64Array = require( '@stdlib/array/float64' );
25+
var abs = require( '@stdlib/math/base/special/abs' );
26+
var sin = require( '@stdlib/math/base/special/sin' );
27+
var cos = require( '@stdlib/math/base/special/cos' );
28+
var sqrt = require( '@stdlib/math/base/special/sqrt' );
29+
var floor = require( '@stdlib/math/base/special/floor' );
30+
var max = require( '@stdlib/math/base/special/max' );
31+
var PI = require( '@stdlib/constants/float64/pi' );
32+
var rffti = require( './../lib/rffti.js' );
33+
var rfftf = require( './../lib/rfftf.js' );
34+
var rfftb = require( './../lib/rfftb.js' );
35+
36+
37+
// FIXTURES //
38+
39+
var nd = [ 120, 91, 54, 49, 32, 28, 24, 8, 4, 3, 2 ];
40+
41+
42+
// TESTS //
43+
44+
tape( 'main export is a function', function test( t ) {
45+
t.ok( true, __filename );
46+
t.strictEqual( typeof rfftf, 'function', 'main export is a function' );
47+
t.end();
48+
});
49+
50+
tape( 'rfftf computes the forward transform with accuracy', function test( t ) {
51+
var tolerance = 1.0e-7;
52+
var maxError = 0.0;
53+
var sumReal = 0.0;
54+
var sumImag = 0.0;
55+
var sqrt2 = sqrt( 2.0 );
56+
var scale = 0.0;
57+
var angle = 0.0;
58+
var sum1 = 0.0;
59+
var sum2 = 0.0;
60+
var arg = 0.0;
61+
var err = 0.0;
62+
var ref = null;
63+
var ns2 = 0;
64+
var dt = 0.0;
65+
var xh = null;
66+
var ni = 0;
67+
var w = null;
68+
var x = null;
69+
var y = null;
70+
var n = 0;
71+
var j = 0;
72+
var i = 0;
73+
var k = 0;
74+
75+
for ( ni = 0; ni < nd.length; ni++ ) {
76+
n = nd[ ni ];
77+
w = new Float64Array( (2*n) + 15 );
78+
x = new Float64Array( n );
79+
xh = new Float64Array( n );
80+
y = new Float64Array( n );
81+
82+
for ( j = 0; j < n; j++ ) {
83+
x[ j ] = sin( (j+1) * sqrt2 );
84+
xh[ j ] = x[ j ];
85+
y[ j ] = x[ j ];
86+
}
87+
88+
rffti( n, w );
89+
90+
dt = (2.0 * PI) / n;
91+
ns2 = floor( (n + 1) / 2 );
92+
ref = new Float64Array( n );
93+
94+
sum1 = 0.0;
95+
sum2 = 0.0;
96+
for ( i = 0; i < n-1; i += 2 ) {
97+
sum1 += x[ i ];
98+
sum2 += x[ i+1 ];
99+
}
100+
if ( n % 2 === 1 ) {
101+
sum1 += x[ n-1 ];
102+
}
103+
ref[ 0 ] = sum1 + sum2;
104+
if ( n % 2 === 0 ) {
105+
ref[ n-1 ] = sum1 - sum2;
106+
}
107+
108+
if ( ns2 >= 2 ) {
109+
for ( k = 2; k <= ns2; k++ ) {
110+
sumReal = 0.0;
111+
sumImag = 0.0;
112+
arg = (k-1) * dt;
113+
114+
for ( i = 0; i < n; i++ ) {
115+
angle = arg * i;
116+
sumReal += x[ i ] * cos( angle );
117+
sumImag += x[ i ] * sin( angle );
118+
}
119+
ref[ (2*k)-3 ] = sumReal;
120+
ref[ (2*k)-2 ] = -sumImag;
121+
}
122+
}
123+
124+
rfftf( n, x, 1, w, 1 );
125+
126+
maxError = 0.0;
127+
for ( i = 0; i < n; i++ ) {
128+
err = abs( x[i] - ref[i] );
129+
maxError = max( maxError, err );
130+
}
131+
t.ok( maxError < tolerance, 'n=' + n + ' max error: ' + maxError );
132+
133+
rfftb( n, x, 1, w, 1 );
134+
scale = 1.0 / n;
135+
maxError = 0.0;
136+
for ( i = 0; i < n; i++ ) {
137+
err = abs( (x[i] * scale) - xh[i] );
138+
maxError = max( maxError, err );
139+
}
140+
t.ok( maxError < tolerance, 'n=' + n + ' inverse consistency error: ' + maxError );
141+
}
142+
t.end();
143+
});
144+
145+
tape( 'rfftf handles edge cases', function test( t ) {
146+
var w = null;
147+
var x = null;
148+
var n = 0;
149+
150+
n = 1;
151+
w = new Float64Array( 2*n + 15 );
152+
x = new Float64Array( [ 5.0 ] );
153+
rffti( n, w );
154+
rfftf( n, x, 1, w, 1 );
155+
t.equal( x[0], 5.0, 'n=1 transform equals input' );
156+
157+
n = 2;
158+
w = new Float64Array( 2*n + 15 );
159+
x = new Float64Array( [ 1.0, 2.0 ] );
160+
rffti( n, w );
161+
rfftf( n, x, 1, w, 1 );
162+
t.ok( abs( x[0] - 3.0 ) < 1e-10, 'n=2 DC component' );
163+
t.ok( abs( x[1] - (-1.0) ) < 1e-10, 'n=2 Nyquist component' );
164+
165+
t.end();
166+
});

0 commit comments

Comments
 (0)