aboutsummaryrefslogtreecommitdiff
path: root/fftw.bqn
diff options
context:
space:
mode:
Diffstat (limited to 'fftw.bqn')
-rw-r--r--fftw.bqn23
1 files changed, 23 insertions, 0 deletions
diff --git a/fftw.bqn b/fftw.bqn
new file mode 100644
index 0000000..40c900c
--- /dev/null
+++ b/fftw.bqn
@@ -0,0 +1,23 @@
+# FFTW-based replacement for fft.bqn
+
+plan ← "*:i32"
+
+Fn ← "/usr/lib/libfftw3.so.3"⊸•FFI
+createPlan ← Fn plan‿"fftw_plan_dft"‿"i32"‿"*i32"‿"*f64"‿"&f64"‿"i32"‿"i32"
+destroyPlan ← Fn ""‿"fftw_destroy_plan"‿plan
+executePlan ← Fn ""‿"fftw_execute"‿plan
+
+{
+ 𝕨𝕊⁼𝕩: (-𝕨1⊘≢¯1)𝕊𝕩 ;
+
+ "FFT argument must be a list or have two list cells" ! (3⌊=)◶⟨0,1,2=≠,0⟩𝕩
+ Enc ← ⍉⌽
+ 𝕩 ↩ (2↑≍)⍟(2>=) 𝕩
+ dir ← -⟜¬ 𝕨≡¯1
+ sh ← 1↓≢𝕩
+ in ← ⥊ Enc 𝕩
+ plan‿out ← CreatePlan ⟨≠sh,sh,in,0¨in,dir,2⋆6⟩
+ ExecutePlan ⟨plan⟩
+ DestroyPlan ⟨plan⟩
+ ÷⟜(×´sh˙)⍟(1=dir) Enc⁼ (sh∾2) ⥊ out
+}