xref: /aosp_15_r20/external/speex/tmv/kiss_fftr_tm.h (revision 28e138c64d234588b5cd2a8a403b584bd3036e4e)
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