1*28e138c6SAndroid Build Coastguard Worker /* Copyright (C) 2007 Hong Zhiqian */
2*28e138c6SAndroid Build Coastguard Worker /**
3*28e138c6SAndroid Build Coastguard Worker @file kiss_fftr_tm.h
4*28e138c6SAndroid Build Coastguard Worker @author Hong Zhiqian
5*28e138c6SAndroid Build Coastguard Worker @brief Various compatibility routines for Speex (TriMedia version)
6*28e138c6SAndroid Build Coastguard Worker */
7*28e138c6SAndroid Build Coastguard Worker /*
8*28e138c6SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without
9*28e138c6SAndroid Build Coastguard Worker modification, are permitted provided that the following conditions
10*28e138c6SAndroid Build Coastguard Worker are met:
11*28e138c6SAndroid Build Coastguard Worker
12*28e138c6SAndroid Build Coastguard Worker - Redistributions of source code must retain the above copyright
13*28e138c6SAndroid Build Coastguard Worker notice, this list of conditions and the following disclaimer.
14*28e138c6SAndroid Build Coastguard Worker
15*28e138c6SAndroid Build Coastguard Worker - Redistributions in binary form must reproduce the above copyright
16*28e138c6SAndroid Build Coastguard Worker notice, this list of conditions and the following disclaimer in the
17*28e138c6SAndroid Build Coastguard Worker documentation and/or other materials provided with the distribution.
18*28e138c6SAndroid Build Coastguard Worker
19*28e138c6SAndroid Build Coastguard Worker - Neither the name of the Xiph.org Foundation nor the names of its
20*28e138c6SAndroid Build Coastguard Worker contributors may be used to endorse or promote products derived from
21*28e138c6SAndroid Build Coastguard Worker this software without specific prior written permission.
22*28e138c6SAndroid Build Coastguard Worker
23*28e138c6SAndroid Build Coastguard Worker THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24*28e138c6SAndroid Build Coastguard Worker ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25*28e138c6SAndroid Build Coastguard Worker LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26*28e138c6SAndroid Build Coastguard Worker A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
27*28e138c6SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28*28e138c6SAndroid Build Coastguard Worker EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29*28e138c6SAndroid Build Coastguard Worker PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30*28e138c6SAndroid Build Coastguard Worker PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31*28e138c6SAndroid Build Coastguard Worker LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32*28e138c6SAndroid Build Coastguard Worker NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33*28e138c6SAndroid Build Coastguard Worker SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34*28e138c6SAndroid Build Coastguard Worker */
35*28e138c6SAndroid Build Coastguard Worker #include "_kiss_fft_guts_tm.h"
36*28e138c6SAndroid Build Coastguard Worker
37*28e138c6SAndroid Build Coastguard Worker #ifdef TM_ASM
38*28e138c6SAndroid Build Coastguard Worker
39*28e138c6SAndroid Build Coastguard Worker #include "profile_tm.h"
40*28e138c6SAndroid Build Coastguard Worker
41*28e138c6SAndroid Build Coastguard Worker #ifdef FIXED_POINT
42*28e138c6SAndroid Build Coastguard Worker
43*28e138c6SAndroid Build Coastguard Worker #define TM_NDIV(res,c,frac) \
44*28e138c6SAndroid Build Coastguard Worker { register int c1, c0; \
45*28e138c6SAndroid Build Coastguard Worker \
46*28e138c6SAndroid Build Coastguard Worker c1 = -asri(16,(c)); \
47*28e138c6SAndroid Build Coastguard Worker c0 = sex16((c)); \
48*28e138c6SAndroid Build Coastguard Worker (res) = pack16lsb(sround(c1 * (32767/(frac))), sround(c0 * (32767/(frac))));\
49*28e138c6SAndroid Build Coastguard Worker }
50*28e138c6SAndroid Build Coastguard Worker
51*28e138c6SAndroid Build Coastguard Worker
52*28e138c6SAndroid Build Coastguard Worker #define OVERRIDE_KISS_FFTR
kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar * restrict timedata,kiss_fft_cpx * restrict freqdata)53*28e138c6SAndroid Build Coastguard Worker void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar * restrict timedata, kiss_fft_cpx * restrict freqdata)
54*28e138c6SAndroid Build Coastguard Worker {
55*28e138c6SAndroid Build Coastguard Worker register int ncfft, ncfft2, k;
56*28e138c6SAndroid Build Coastguard Worker register int * restrict tmpbuf;
57*28e138c6SAndroid Build Coastguard Worker register int * restrict twiddles;
58*28e138c6SAndroid Build Coastguard Worker
59*28e138c6SAndroid Build Coastguard Worker ncfft = st->substate->nfft;
60*28e138c6SAndroid Build Coastguard Worker ncfft2 = ncfft >> 1;
61*28e138c6SAndroid Build Coastguard Worker tmpbuf = (int*)st->tmpbuf;
62*28e138c6SAndroid Build Coastguard Worker twiddles = (int*)st->super_twiddles;
63*28e138c6SAndroid Build Coastguard Worker
64*28e138c6SAndroid Build Coastguard Worker TMDEBUG_ALIGNMEM(timedata);
65*28e138c6SAndroid Build Coastguard Worker TMDEBUG_ALIGNMEM(freqdata);
66*28e138c6SAndroid Build Coastguard Worker TMDEBUG_ALIGNMEM(tmpbuf);
67*28e138c6SAndroid Build Coastguard Worker TMDEBUG_ALIGNMEM(twiddles);
68*28e138c6SAndroid Build Coastguard Worker
69*28e138c6SAndroid Build Coastguard Worker kiss_fft(st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf);
70*28e138c6SAndroid Build Coastguard Worker
71*28e138c6SAndroid Build Coastguard Worker {
72*28e138c6SAndroid Build Coastguard Worker register int tdcr, tdci;
73*28e138c6SAndroid Build Coastguard Worker tdcr = sround(st->tmpbuf[0].r * (32767/2));
74*28e138c6SAndroid Build Coastguard Worker tdci = sround(st->tmpbuf[0].i * (32767/2));
75*28e138c6SAndroid Build Coastguard Worker
76*28e138c6SAndroid Build Coastguard Worker freqdata[0].r = tdcr + tdci;
77*28e138c6SAndroid Build Coastguard Worker freqdata[ncfft].r = tdcr - tdci;
78*28e138c6SAndroid Build Coastguard Worker freqdata[ncfft].i = freqdata[0].i = 0;
79*28e138c6SAndroid Build Coastguard Worker }
80*28e138c6SAndroid Build Coastguard Worker
81*28e138c6SAndroid Build Coastguard Worker for ( k=1 ; k <= ncfft2 ; ++k )
82*28e138c6SAndroid Build Coastguard Worker {
83*28e138c6SAndroid Build Coastguard Worker register int fpk, fpnk, i, tw, f1k, f2k;
84*28e138c6SAndroid Build Coastguard Worker register int fq1, fq2;
85*28e138c6SAndroid Build Coastguard Worker
86*28e138c6SAndroid Build Coastguard Worker i = ncfft-k;
87*28e138c6SAndroid Build Coastguard Worker
88*28e138c6SAndroid Build Coastguard Worker fpk = ld32x(tmpbuf,k);
89*28e138c6SAndroid Build Coastguard Worker tw = ld32x(twiddles,k);
90*28e138c6SAndroid Build Coastguard Worker fpnk = ld32x(tmpbuf,i);
91*28e138c6SAndroid Build Coastguard Worker
92*28e138c6SAndroid Build Coastguard Worker TM_DIV(fpk, fpk, 2);
93*28e138c6SAndroid Build Coastguard Worker TM_NDIV(fpnk,fpnk,2);
94*28e138c6SAndroid Build Coastguard Worker
95*28e138c6SAndroid Build Coastguard Worker TM_ADD( f1k, fpk , fpnk );
96*28e138c6SAndroid Build Coastguard Worker TM_SUB( f2k, fpk , fpnk );
97*28e138c6SAndroid Build Coastguard Worker TM_MUL( tw , f2k, tw );
98*28e138c6SAndroid Build Coastguard Worker TM_ADD( fq1, f1k, tw );
99*28e138c6SAndroid Build Coastguard Worker TM_SHR( fq1, fq1, 1 );
100*28e138c6SAndroid Build Coastguard Worker TM_SUB( fq2, f1k, tw );
101*28e138c6SAndroid Build Coastguard Worker TM_NEGMSB( fq2, fq2 );
102*28e138c6SAndroid Build Coastguard Worker TM_SHR( fq2, fq2, 1 );
103*28e138c6SAndroid Build Coastguard Worker
104*28e138c6SAndroid Build Coastguard Worker
105*28e138c6SAndroid Build Coastguard Worker st32d( k<<2, freqdata, fq1 );
106*28e138c6SAndroid Build Coastguard Worker st32d( i<<2, freqdata, fq2 );
107*28e138c6SAndroid Build Coastguard Worker }
108*28e138c6SAndroid Build Coastguard Worker }
109*28e138c6SAndroid Build Coastguard Worker
110*28e138c6SAndroid Build Coastguard Worker #define OVERRIDE_KISS_FFTRI
kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx * restrict freqdata,kiss_fft_scalar * restrict timedata)111*28e138c6SAndroid Build Coastguard Worker void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx * restrict freqdata,kiss_fft_scalar * restrict timedata)
112*28e138c6SAndroid Build Coastguard Worker {
113*28e138c6SAndroid Build Coastguard Worker register int k, ncfft, ncfft2;
114*28e138c6SAndroid Build Coastguard Worker register int * restrict tmpbuf;
115*28e138c6SAndroid Build Coastguard Worker register int * restrict twiddles;
116*28e138c6SAndroid Build Coastguard Worker
117*28e138c6SAndroid Build Coastguard Worker ncfft = st->substate->nfft;
118*28e138c6SAndroid Build Coastguard Worker ncfft2 = ncfft >> 1;
119*28e138c6SAndroid Build Coastguard Worker tmpbuf = (int*)st->tmpbuf;
120*28e138c6SAndroid Build Coastguard Worker twiddles = (int*)st->super_twiddles;
121*28e138c6SAndroid Build Coastguard Worker
122*28e138c6SAndroid Build Coastguard Worker TMDEBUG_ALIGNMEM(freqdata);
123*28e138c6SAndroid Build Coastguard Worker TMDEBUG_ALIGNMEM(timedata);
124*28e138c6SAndroid Build Coastguard Worker TMDEBUG_ALIGNMEM(tmpbuf);
125*28e138c6SAndroid Build Coastguard Worker TMDEBUG_ALIGNMEM(twiddles);
126*28e138c6SAndroid Build Coastguard Worker
127*28e138c6SAndroid Build Coastguard Worker {
128*28e138c6SAndroid Build Coastguard Worker register int fqr, fqnr;
129*28e138c6SAndroid Build Coastguard Worker
130*28e138c6SAndroid Build Coastguard Worker fqr = freqdata[0].r;
131*28e138c6SAndroid Build Coastguard Worker fqnr = freqdata[ncfft].r;
132*28e138c6SAndroid Build Coastguard Worker
133*28e138c6SAndroid Build Coastguard Worker st->tmpbuf[0].r = fqr + fqnr;
134*28e138c6SAndroid Build Coastguard Worker st->tmpbuf[0].i = fqr - fqnr;
135*28e138c6SAndroid Build Coastguard Worker }
136*28e138c6SAndroid Build Coastguard Worker
137*28e138c6SAndroid Build Coastguard Worker for ( k=1 ; k <= ncfft2 ; ++k )
138*28e138c6SAndroid Build Coastguard Worker {
139*28e138c6SAndroid Build Coastguard Worker register int fk, fnkc, i, tw, fek, fok, tmp;
140*28e138c6SAndroid Build Coastguard Worker register int tbk, tbn;
141*28e138c6SAndroid Build Coastguard Worker
142*28e138c6SAndroid Build Coastguard Worker i = ncfft-k;
143*28e138c6SAndroid Build Coastguard Worker
144*28e138c6SAndroid Build Coastguard Worker fk = ld32x(freqdata,k);
145*28e138c6SAndroid Build Coastguard Worker tw = ld32x(twiddles,k);
146*28e138c6SAndroid Build Coastguard Worker fnkc = pack16lsb(-freqdata[i].i, freqdata[i].r);
147*28e138c6SAndroid Build Coastguard Worker
148*28e138c6SAndroid Build Coastguard Worker TM_ADD (fek, fk, fnkc);
149*28e138c6SAndroid Build Coastguard Worker TM_SUB (tmp, fk, fnkc);
150*28e138c6SAndroid Build Coastguard Worker TM_MUL (fok, tmp, tw );
151*28e138c6SAndroid Build Coastguard Worker TM_ADD (tbk, fek, fok);
152*28e138c6SAndroid Build Coastguard Worker TM_SUB (tbn, fek, fok);
153*28e138c6SAndroid Build Coastguard Worker TM_NEGMSB(tbn, tbn);
154*28e138c6SAndroid Build Coastguard Worker
155*28e138c6SAndroid Build Coastguard Worker st32d(k<<2, tmpbuf, tbk);
156*28e138c6SAndroid Build Coastguard Worker st32d(i<<2, tmpbuf, tbn);
157*28e138c6SAndroid Build Coastguard Worker }
158*28e138c6SAndroid Build Coastguard Worker kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata);
159*28e138c6SAndroid Build Coastguard Worker }
160*28e138c6SAndroid Build Coastguard Worker
161*28e138c6SAndroid Build Coastguard Worker #else
162*28e138c6SAndroid Build Coastguard Worker
163*28e138c6SAndroid Build Coastguard Worker #define OVERRIDE_KISS_FFTR
kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar * restrict timedata,kiss_fft_cpx * restrict freqdata)164*28e138c6SAndroid Build Coastguard Worker void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar * restrict timedata,kiss_fft_cpx * restrict freqdata)
165*28e138c6SAndroid Build Coastguard Worker {
166*28e138c6SAndroid Build Coastguard Worker register kiss_fft_cpx fpnk, fpk, f1k, f2k, twk;
167*28e138c6SAndroid Build Coastguard Worker register int k, ncfft;
168*28e138c6SAndroid Build Coastguard Worker register kiss_fft_cpx * restrict tmpbuf, * restrict tw;
169*28e138c6SAndroid Build Coastguard Worker register float tdcr, tdci;
170*28e138c6SAndroid Build Coastguard Worker
171*28e138c6SAndroid Build Coastguard Worker ncfft = st->substate->nfft;
172*28e138c6SAndroid Build Coastguard Worker tmpbuf= st->tmpbuf;
173*28e138c6SAndroid Build Coastguard Worker tw = st->super_twiddles;
174*28e138c6SAndroid Build Coastguard Worker
175*28e138c6SAndroid Build Coastguard Worker kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, tmpbuf );
176*28e138c6SAndroid Build Coastguard Worker
177*28e138c6SAndroid Build Coastguard Worker tdcr = tmpbuf[0].r;
178*28e138c6SAndroid Build Coastguard Worker tdci = tmpbuf[0].i;
179*28e138c6SAndroid Build Coastguard Worker
180*28e138c6SAndroid Build Coastguard Worker freqdata[0].r = tdcr + tdci;
181*28e138c6SAndroid Build Coastguard Worker freqdata[ncfft].r = tdcr - tdci;
182*28e138c6SAndroid Build Coastguard Worker freqdata[ncfft].i = freqdata[0].i = 0;
183*28e138c6SAndroid Build Coastguard Worker
184*28e138c6SAndroid Build Coastguard Worker for ( k=1;k <= ncfft/2 ; ++k )
185*28e138c6SAndroid Build Coastguard Worker {
186*28e138c6SAndroid Build Coastguard Worker fpk = tmpbuf[k];
187*28e138c6SAndroid Build Coastguard Worker fpnk.r = tmpbuf[ncfft-k].r;
188*28e138c6SAndroid Build Coastguard Worker fpnk.i = -tmpbuf[ncfft-k].i;
189*28e138c6SAndroid Build Coastguard Worker
190*28e138c6SAndroid Build Coastguard Worker C_ADD( f1k, fpk , fpnk );
191*28e138c6SAndroid Build Coastguard Worker C_SUB( f2k, fpk , fpnk );
192*28e138c6SAndroid Build Coastguard Worker C_MUL( twk, f2k , tw[k]);
193*28e138c6SAndroid Build Coastguard Worker
194*28e138c6SAndroid Build Coastguard Worker freqdata[k].r = HALF_OF(f1k.r + twk.r);
195*28e138c6SAndroid Build Coastguard Worker freqdata[k].i = HALF_OF(f1k.i + twk.i);
196*28e138c6SAndroid Build Coastguard Worker freqdata[ncfft-k].r = HALF_OF(f1k.r - twk.r);
197*28e138c6SAndroid Build Coastguard Worker freqdata[ncfft-k].i = HALF_OF(twk.i - f1k.i);
198*28e138c6SAndroid Build Coastguard Worker }
199*28e138c6SAndroid Build Coastguard Worker }
200*28e138c6SAndroid Build Coastguard Worker
201*28e138c6SAndroid Build Coastguard Worker #define OVERRIDE_KISS_FFTRI
kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx * restrict freqdata,kiss_fft_scalar * restrict timedata)202*28e138c6SAndroid Build Coastguard Worker void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx * restrict freqdata,kiss_fft_scalar * restrict timedata)
203*28e138c6SAndroid Build Coastguard Worker {
204*28e138c6SAndroid Build Coastguard Worker register int k, ncfft;
205*28e138c6SAndroid Build Coastguard Worker register kiss_fft_cpx * restrict tmpbuf, * restrict tw;
206*28e138c6SAndroid Build Coastguard Worker
207*28e138c6SAndroid Build Coastguard Worker
208*28e138c6SAndroid Build Coastguard Worker ncfft = st->substate->nfft;
209*28e138c6SAndroid Build Coastguard Worker tmpbuf= st->tmpbuf;
210*28e138c6SAndroid Build Coastguard Worker tw = st->super_twiddles;
211*28e138c6SAndroid Build Coastguard Worker
212*28e138c6SAndroid Build Coastguard Worker tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r;
213*28e138c6SAndroid Build Coastguard Worker tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r;
214*28e138c6SAndroid Build Coastguard Worker
215*28e138c6SAndroid Build Coastguard Worker for (k = 1; k <= ncfft / 2; ++k)
216*28e138c6SAndroid Build Coastguard Worker {
217*28e138c6SAndroid Build Coastguard Worker register kiss_fft_cpx fk, fnkc, fek, fok, tmp;
218*28e138c6SAndroid Build Coastguard Worker fk = freqdata[k];
219*28e138c6SAndroid Build Coastguard Worker fnkc.r = freqdata[ncfft - k].r;
220*28e138c6SAndroid Build Coastguard Worker fnkc.i = -freqdata[ncfft - k].i;
221*28e138c6SAndroid Build Coastguard Worker
222*28e138c6SAndroid Build Coastguard Worker C_ADD (fek, fk, fnkc);
223*28e138c6SAndroid Build Coastguard Worker C_SUB (tmp, fk, fnkc);
224*28e138c6SAndroid Build Coastguard Worker C_MUL (fok,tmp,tw[k]);
225*28e138c6SAndroid Build Coastguard Worker C_ADD (tmpbuf[k],fek, fok);
226*28e138c6SAndroid Build Coastguard Worker C_SUB (tmp, fek, fok);
227*28e138c6SAndroid Build Coastguard Worker tmpbuf[ncfft - k].r = tmp.r;
228*28e138c6SAndroid Build Coastguard Worker tmpbuf[ncfft - k].i = -tmp.i;
229*28e138c6SAndroid Build Coastguard Worker }
230*28e138c6SAndroid Build Coastguard Worker kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata);
231*28e138c6SAndroid Build Coastguard Worker }
232*28e138c6SAndroid Build Coastguard Worker
233*28e138c6SAndroid Build Coastguard Worker #endif
234*28e138c6SAndroid Build Coastguard Worker #endif
235*28e138c6SAndroid Build Coastguard Worker
236