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