LTFAT_EXTERN void LTFAT_NAME_COMPLEX(idwiltiii_fb)(const LTFAT_COMPLEX *c, const LTFAT_COMPLEX *g, const ltfatInt L, const ltfatInt gl, const ltfatInt W, const ltfatInt M, LTFAT_COMPLEX *f) { const ltfatInt N = L / M; const ltfatInt M2 = 2 * M; const ltfatInt M4 = 4 * M; const LTFAT_REAL scalconst = 1.0 / sqrt(2.0); const LTFAT_COMPLEX eipi4 = cexp(I * PI / 4.0); const LTFAT_COMPLEX emipi4 = cexp(-I * PI / 4.0); LTFAT_COMPLEX *coef2 = ltfat_calloc(2 * M * N * W, sizeof * coef2); LTFAT_COMPLEX *f2 = ltfat_malloc(L * W * sizeof * f2); const LTFAT_COMPLEX *pcoef = c; LTFAT_COMPLEX *pcoef2 = coef2; PREPROC_COMPLEX LTFAT_NAME(idgt_fb)(coef2, g, L, gl, W, M, 2 * M, FREQINV, f2); POSTPROC_COMPLEX LTFAT_SAFEFREEALL(coef2, f2); }
LTFAT_EXTERN void LTFAT_NAME_REAL(idwiltiii_long)(const LTFAT_REAL *c, const LTFAT_REAL *g, const ltfatInt L, const ltfatInt W, const ltfatInt M, LTFAT_REAL *f) { const ltfatInt N = L / M; const ltfatInt M2 = 2 * M; const ltfatInt M4 = 4 * M; const LTFAT_REAL scalconst = 1.0 / sqrt(2.0); const LTFAT_COMPLEX eipi4 = cexp(I * PI / 4.0); const LTFAT_COMPLEX emipi4 = cexp(-I * PI / 4.0); LTFAT_COMPLEX *coef2 = ltfat_calloc(2 * M * N * W, sizeof * coef2); LTFAT_COMPLEX *f2 = ltfat_malloc(L * W * sizeof * f2); LTFAT_COMPLEX *g2 = ltfat_malloc(L * sizeof * g2); for (ltfatInt ii = 0; ii < L; ii++) g2[ii] = g[ii]; const LTFAT_REAL *pcoef = c; LTFAT_COMPLEX *pcoef2 = coef2; PREPROC_COMPLEX LTFAT_NAME(idgt_long)(coef2, g2, L, W, M, 2 * M, FREQINV, f2); POSTPROC_REAL LTFAT_SAFEFREEALL(coef2, f2, g2); }
LTFAT_EXTERN void LTFAT_NAME_REAL(dwiltiii_long)(const LTFAT_REAL *f, const LTFAT_REAL *g, const ltfatInt L, const ltfatInt W, const ltfatInt M, LTFAT_REAL *cout) { const ltfatInt N=L/M; const ltfatInt M2 = 2*M; const ltfatInt M4=4*M; LTFAT_COMPLEX *coef2 = ltfat_malloc(2*M*N*W*sizeof*coef2); LTFAT_COMPLEX *f2 = ltfat_malloc(L*W*sizeof*f2); LTFAT_COMPLEX *g2 = ltfat_malloc(L*sizeof*g2); // Real to complex for(ltfatInt ii=0; ii<L; ii++) g2[ii]=g[ii]; PREPROC LTFAT_NAME_COMPLEX(dgt_long)(f2, g2, L, W, M, 2*M, coef2); LTFAT_REAL *pcoef = cout; LTFAT_COMPLEX *pcoef2 = coef2; POSTPROC_REAL LTFAT_SAFEFREEALL(coef2,f2,g2); }
LTFAT_EXTERN void LTFAT_NAME_COMPLEX(dwiltiii_long)(const LTFAT_COMPLEX *f, const LTFAT_COMPLEX *g, const ltfatInt L, const ltfatInt W, const ltfatInt M, LTFAT_COMPLEX *cout) { const ltfatInt N=L/M; const ltfatInt M2=2*M; const ltfatInt M4=4*M; const LTFAT_REAL scalconst = 1.0/sqrt(2.0); const LTFAT_COMPLEX eipi4 = cexp(I*PI/4.0); const LTFAT_COMPLEX emipi4 = cexp(-I*PI/4.0); LTFAT_COMPLEX *coef2 = ltfat_malloc(2*M*N*W*sizeof*coef2); LTFAT_COMPLEX *f2 = ltfat_malloc(L*W*sizeof*f2); PREPROC LTFAT_NAME_COMPLEX(dgt_long)(f2, g, L, W, M, 2*M, coef2); LTFAT_COMPLEX *pcoef = cout; LTFAT_COMPLEX *pcoef2 = coef2; POSTPROC_COMPLEX LTFAT_SAFEFREEALL(coef2,f2); }
LTFAT_EXTERN void fbreassOptOut_destroy(fbreassOptOut* oo) { for (ltfatInt ii = 0; ii < oo->l; ii++) { if (oo->repos[ii] && oo->reposlmax[ii] > 0) { ltfat_free(oo->repos[ii]); } } LTFAT_SAFEFREEALL(oo->repos, oo->reposl, oo->reposlmax, oo); oo = NULL; }
LTFAT_EXTERN void LTFAT_NAME(gabreassign)(const LTFAT_REAL *s, const LTFAT_REAL *tgrad, const LTFAT_REAL *fgrad, const ltfatInt L, const ltfatInt W, const ltfatInt a, const ltfatInt M, LTFAT_REAL *sr) { ltfatInt ii, posi, posj; const ltfatInt N=L/a; const ltfatInt b=L/M; ltfatInt *timepos = ltfat_malloc(N*sizeof*timepos); ltfatInt *freqpos = ltfat_malloc(M*sizeof*freqpos); fftindex(N,timepos); fftindex(M,freqpos); /* Zero the output array. */ memset(sr,0,M*N*W*sizeof*sr); for (ltfatInt w=0; w<W; w++) { for (ii=0; ii<M; ii++) { for (ltfatInt jj=0; jj<N; jj++) { /* Do a 'round' followed by a 'mod'. 'round' is not * present in all libraries, so use trunc(x+.5) instead */ /*posi=positiverem((ltfatInt)trunc(tgrad[ii+jj*M]/b+freqpos[ii]+.5),M); posj=positiverem((ltfatInt)trunc(fgrad[ii+jj*M]/a+timepos[jj]+.5),N);*/ posi=positiverem(ltfat_round(tgrad[ii+jj*M]/b+freqpos[ii]),M); posj=positiverem(ltfat_round(fgrad[ii+jj*M]/a+timepos[jj]),N); sr[posi+posj*M]+=s[ii+jj*M]; } } } LTFAT_SAFEFREEALL(freqpos,timepos); }