From 1d5f74bca29c6bb28bef6035aa09a1e35884b40a Mon Sep 17 00:00:00 2001 From: Sam Nystrom Date: Sat, 16 Mar 2024 22:54:54 -0400 Subject: test: begin writing tests --- assembly/index.ts | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) (limited to 'assembly/index.ts') diff --git a/assembly/index.ts b/assembly/index.ts index e94b0a8..8218a08 100644 --- a/assembly/index.ts +++ b/assembly/index.ts @@ -320,11 +320,12 @@ export function unzip(x: StaticArray): StaticArray { } function ditfft2(x: StaticArray, n: i32, s: i32, out: StaticArray): void { - if (n == 1) { + //trace('x,n,s,X:', 4, x.length, n, s, out.length); + /*if (n == 1) { out[0] = x[0]; out[1] = x[1]; return; - } else if (n == 2) { + } /*else if (n == 2) {*/ for (let k = 0; k < out.length - out.length % 2; k += 2) { for (let n = 0; n < x.length - x.length % 2; n += 2) { const y = -2 * Mathf.PI * k / x.length * n; @@ -334,11 +335,11 @@ function ditfft2(x: StaticArray, n: i32, s: i32, out: StaticArray): vo out[k+1] += x[n] * v + x[n+1] * u; } } - return; - } - ditfft2(x.slice>(0, n), n/2, 2*s, out.slice>(0, n)); - ditfft2(x.slice>(s * 2), n/2, 2*s, out.slice>(n)); - const outptr = changetype(out); + /*return; + }*/ + // ditfft2(x, n/2, 2*s, out.slice>(0, n)); + // ditfft2(x.slice>(s * 2), n/2, 2*s, out.slice>(n)); + /*const outptr = changetype(out); const twiddle = vf32(-2 * Mathf.PI / n); let vk = f32x4(0,1,2,3); for (let k = 0; k < n/2 - n/2 % 2; k += 4) { @@ -349,22 +350,30 @@ function ditfft2(x: StaticArray, n: i32, s: i32, out: StaticArray): vo v128.store(outptr + k*2 * 4, v128.add(p, q)); v128.store(outptr + (k*2 + n/2) * 4, v128.sub(p, q)); vk = v128.add(vk, vf32(1)); - } - for (let k = n/2 - n/2 % 2; k < n/2; k++) { + }*/ + //for (let k = n/2 - n/2 % 2; k < n/2; k++) { + /*for (let k = 0; k < n/2; k++) { + trace('n,s,k', 3, n, s, k); const pr = unchecked(out[k*2]); const pi = unchecked(out[k*2+1]); - const y = -2 * Mathf.PI * k / n; - const qr = Mathf.cos(y) * out[k*2+n/2] - const qi = Mathf.sin(y) * out[k*2+n/2+1]; + const tw = -2 * Mathf.PI / n * k; + const u = Mathf.cos(tw); + const v = Mathf.sin(tw); + const x = out[(k+n/2)*2]; + const y = out[(k+n/2)*2+1]; + const qr = x * u - y * v; + const qi = x * v + y * u; unchecked(out[k*2] = pr + qr); unchecked(out[k*2+1] = pi + qi); - unchecked(out[k*2+n/2] = pr - qr); - unchecked(out[k*2+n/2+1] = pi - qi); - } + unchecked(out[(k+n/2)*2] = pr - qr); + unchecked(out[(k+n/2)*2+1] = pi - qi); + }*/ } export function fft(x: StaticArray): StaticArray { - const out = new StaticArray(x.length); - ditfft2(x, x.length/2, 1, out); + const len = x.length - x.length % 2; + const out = new StaticArray(len); + if (len == 0) return out; + ditfft2(x.slice>(0, len), len/2, 1, out); return out; -} \ No newline at end of file +} -- cgit v1.2.3