shithub: soundpipe

Download patch

ref: 7595cb4dabfec9a40ad02cfdb926f872c9bc39b4
parent: 0a5f275112d871f18435dbe76294c11d5f99ecf9
author: Paul Batchelor <thisispaulbatchelor@gmail.com>
date: Thu Dec 31 09:00:05 EST 2020

added fftcut

--- a/h/ftbl.h
+++ b/h/ftbl.h
@@ -17,3 +17,4 @@
 void sp_gen_triangle(sp_data *sp, sp_ftbl *ft);
 void sp_gen_composite(sp_data *sp, sp_ftbl *ft, const char *argstring);
 void sp_gen_sinesum(sp_data *sp, sp_ftbl *ft, const char *argstring);
+void sp_ftbl_fftcut(sp_ftbl *ft, int cut);
--- a/modules/ftbl.c
+++ b/modules/ftbl.c
@@ -6,6 +6,7 @@
 #include <sndfile.h>
 #endif
 #include "soundpipe.h"
+#include "kiss_fftr.h"
 
 #ifndef M_PI
 #define M_PI 3.14159265358979323846
@@ -178,4 +179,34 @@
         }
     }
     sp_ftbl_destroy(&args);
+}
+
+void sp_ftbl_fftcut(sp_ftbl *ft, int cut)
+{
+    kiss_fftr_cfg fft, ifft;
+    kiss_fft_cpx *tmp;
+    int i;
+    SPFLOAT scale;
+
+    fft = kiss_fftr_alloc(ft->size, 0, NULL, NULL);
+    ifft = kiss_fftr_alloc(ft->size, 1, NULL, NULL);
+    tmp = malloc(sizeof(kiss_fft_cpx) * ft->size);
+
+    kiss_fftr(fft, ft->tbl, tmp);
+
+    for (i = cut; i < (ft->size / 2); i++) {
+        tmp[i].r = 0;
+        tmp[i].i = 0;
+    }
+
+    kiss_fftri(ifft, tmp, ft->tbl);
+
+    scale = 1.0 / ft->size;
+    for (i = 0; i < ft->size; i++) {
+        ft->tbl[i] *= scale;
+    }
+
+    free(tmp);
+    kiss_fftr_free(fft);
+    kiss_fftr_free(ifft);
 }