1 #include "ltfat.h"
2 #include "ltfat/types.h"
3 #include "ltfat/macros.h"
4 
5 
6 LTFAT_API int
LTFAT_NAME(multiwingabtight_long)7 LTFAT_NAME(multiwingabtight_long)(const LTFAT_TYPE g[],
8                           ltfat_int L, ltfat_int R, ltfat_int a,
9                           ltfat_int M, LTFAT_TYPE gt[])
10 {
11     ltfat_int minL;
12     LTFAT_COMPLEX* gf = NULL;
13     LTFAT_COMPLEX* gtf = NULL;
14 
15     int status = LTFATERR_SUCCESS;
16     CHECKNULL(g); CHECKNULL(gt);
17     CHECK(LTFATERR_BADSIZE, L > 0, "L (passed %td) must be positive.", L);
18     CHECK(LTFATERR_NOTPOSARG, R > 0, "R (passed %td) must be positive.", R);
19     CHECK(LTFATERR_NOTPOSARG, a > 0, "a (passed %td) must be positive.", a);
20     CHECK(LTFATERR_NOTPOSARG, M > 0, "M (passed %td) must be positive.", M);
21     CHECK(LTFATERR_NOTAFRAME, M >= a, "Not a frame. Check if M>=a.");
22 
23     minL = ltfat_lcm(a, M);
24     CHECK(LTFATERR_BADTRALEN, !(L % minL),
25           "L must and divisible by lcm(a,M)=%td.", minL);
26 
27     CHECKMEM( gf = LTFAT_NAME_COMPLEX(malloc)(L * R));
28     CHECKMEM( gtf = LTFAT_NAME_COMPLEX(malloc)(L * R));
29 
30 #ifdef LTFAT_COMPLEXTYPE
31 
32     CHECKSTATUS( LTFAT_NAME(wfac)(g, L, R, a, M, gf));
33     LTFAT_NAME_REAL(gabtight_fac)(gf, L, R, a, M, gtf);
34     CHECKSTATUS( LTFAT_NAME(iwfac)(gtf, L, R, a, M, gt));
35 
36 #else
37 
38     LTFAT_NAME_REAL(wfacreal)(g, L, R, a, M, gf);
39     LTFAT_NAME_REAL(gabtightreal_fac)(gf, L, R, a, M, gtf);
40     LTFAT_NAME_REAL(iwfacreal)(gtf, L, R, a, M, gt);
41 
42 #endif
43 
44 error:
45     LTFAT_SAFEFREEALL(gtf, gf);
46     return status;
47 }
48 
49 LTFAT_API int
LTFAT_NAME(gabtight_long)50 LTFAT_NAME(gabtight_long)(const LTFAT_TYPE* g,
51                           ltfat_int L, ltfat_int a,
52                           ltfat_int M, LTFAT_TYPE* gt)
53 {
54     return LTFAT_NAME(multiwingabtight_long)(g,L,1,a,M,gt);
55 }
56 
57 LTFAT_API int
LTFAT_NAME(gabtight_fir)58 LTFAT_NAME(gabtight_fir)(const LTFAT_TYPE* g, ltfat_int gl,
59                          ltfat_int L, ltfat_int a,
60                          ltfat_int M, ltfat_int gtl, LTFAT_TYPE* gt)
61 {
62     LTFAT_TYPE* tmpLong = NULL;
63 
64     int status = LTFATERR_SUCCESS;
65     CHECKNULL(g); CHECKNULL(gt);
66     CHECK(LTFATERR_BADSIZE, gl > 0, "gl must be positive");
67     CHECK(LTFATERR_BADSIZE, gtl > 0, "gtl must be positive");
68     CHECK(LTFATERR_BADREQSIZE, L >= gl && L >= gtl,
69           "L>=gl && L>= gtl must hold. Passed L=%td, gl=%td, gtl=%td", L, gl, gtl);
70 
71     CHECKMEM( tmpLong = LTFAT_NAME(malloc)(L));
72 
73     LTFAT_NAME(fir2long)(g, gl, L, tmpLong);
74     LTFAT_NAME(gabtight_long)(tmpLong, L, a, M, tmpLong);
75     LTFAT_NAME(long2fir)(tmpLong, L, gtl, gt);
76 
77 error:
78     if (tmpLong) ltfat_free(tmpLong);
79     return status;
80 }
81