OK, it's using the d_fft_fftsg.c file instead, if not compiled with the FFTW3 library then. Got that. I made this little external, and it seems to work (with a fixed FFT size, but I don't really care for now), still I'm including the code here. I'd be grateful if someone can take a look and verify it's OK.
I have copied the d_fft_fftsg.c file to the directory of my external and renamed it to pd_fft.h, which I'm including in my file (I commented out the line that includes the m_private_utils.h file, as I got an error saying that this is a private file). All this external is trying to do is an FFT analysis and resynthesis, as it is done in the ASCII patch below:
``` [inlet~] | ________[tabreceive~ hann] [*~ ] | [rfft~] | | [rifft~] | ________[tabreceive~ hann] [*~ ] | ________[normalize_val (1 / (fft_size * 3 / 2) ( [*~ ] | [outlet~] ```
And here's the code:
``` #include <m_pd.h> #include <stdlib.h> #include "pd_fft.h"
#define FFTSIZE 1024
static t_class *myfft_tilde_class;
typedef struct _myfft_tilde { t_object obj; t_float f; t_outlet *x_out; t_sample *x_hann; t_float x_normalize; } t_myfft_tilde;
static void make_hann(t_myfft_tilde *x) { int i; float twopi = 2. * 3.14159; x->x_hann = (t_float *)getbytes(FFTSIZE*sizeof(t_float)); for (i = 0; i < FFTSIZE; i++) { x->x_hann[i] = (cos(((float)i/(float)FFTSIZE)*twopi) * -0.5) + 0.5; } }
t_int *myfft_tilde_perform(t_int *w) { int i; t_myfft_tilde *x = (t_myfft_tilde *)(w[1]); t_sample *in = (t_sample *)(w[2]); t_sample *out = (t_sample *)(w[3]); int n = (int)(w[4]);
for (i = 0; i < n; i++) in[i] *= x->x_hann[i]; mayer_realfft(n, in); mayer_realifft(n, in); for (i = 0; i < n; i++) out[i] = (in[i] * x->x_hann[i]) * x->x_normalize;
return (w+5); }
void myfft_tilde_dsp(t_myfft_tilde *x, t_signal **sp) { dsp_add(myfft_tilde_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, (t_int)sp[0]->s_n); }
void *myfft_tilde_new(t_symbol *s) { t_myfft_tilde *x = (t_myfft_tilde *)pd_new(myfft_tilde_class);
outlet_new(&x->obj, &s_signal);
make_hann(x);
x->x_normalize = 1.0 / ((1024.0 * 3.0) / 2.0);
return (void *)x; }
void myfft_tilde_free(t_myfft_tilde *x) { outlet_free(x->x_out); free(x->x_hann); }
void myfft_tilde_setup(void) { myfft_tilde_class = class_new(gensym("myfft~"), (t_newmethod)myfft_tilde_new, (t_method)myfft_tilde_free, sizeof(t_myfft_tilde), CLASS_DEFAULT, 0, 0); class_addmethod(myfft_tilde_class, (t_method)myfft_tilde_dsp, gensym("dsp"), 0); CLASS_MAINSIGNALIN(myfft_tilde_class, t_myfft_tilde, f); } ```
On 10/17/23 10:00, IOhannes m zmoelnig wrote:
On 10/17/23 08:31, Alexandros Drymonitis wrote:
The FFTW3 library is used by Pd
it's not.
, and it is #included in the d_fft_fftw.c file. I have compiled Pd myself, and no such error occurred, so, this
Pd *could* use FFTW3, but you have to be very explicit if you want to build Pd with FFTW3 (install fftw3 *and* configure Pd with `--enable-fftw`)
so in virtually all cases it uses the mayer-fft (which is built into Pd, so doesn't require any external dependencies).
file must be somewhere in my system. Any idea how to solve this?
install the fftw3 library (and headers).
gfmadsr IOhannes
Pd-dev mailing list Pd-dev@lists.iem.at https://lists.puredata.info/listinfo/pd-dev