Beispiel #1
0
static inline void mult_shf_I( int c, int s, int x, int y, int &u, int &v)
{
//  u = ((long)x * c - (long)y * s) >> 12;      // Optimizer macro-mulriplier OFF, 24 millisec
//  v = ((long)y * c + (long)x * s) >> 12; 

  u = (mult_shf_s16x16(x, c) - mult_shf_s16x16(y, s));    // Optimizer macro-mulriplier ON, 10.1 millisec
  v = (mult_shf_s16x16(y, c) + mult_shf_s16x16(x, s));    // Hardcoded >>8 bits, use with 8-bits Sinewave ONLY.
}
void fft8_dit_core_p1(int *fr, int *fi) {
    int plus1a, plus2a, plus3a, plus4a, plus1b, plus2b;
    int mins1a, mins2a, mins3a, mins4a, mins1b, mins2b, mM1a, mM2a;

    sum_dif_I(fr[0], fr[1], &plus1a, &mins1a);
    sum_dif_I(fr[2], fr[3], &plus2a, &mins2a);
    sum_dif_I(fr[4], fr[5], &plus3a, &mins3a);
    sum_dif_I(fr[6], fr[7], &plus4a, &mins4a);

    sum_dif_I(plus1a, plus2a, &plus1b, &mins1b);
    sum_dif_I(plus3a, plus4a, &plus2b, &mins2b);

    sum_dif_I(plus1b, plus2b, &fr[0], &fr[4]);
    sum_dif_I(mins3a, mins4a, &mM1a, &mM2a);

    int prib1a, prib2a, prib3a, prib4a, prib1b, prib2b;
    int otnt1a, otnt2a, otnt3a, otnt4a, otnt1b, otnt2b, oT1a, oT2a;

    sum_dif_I(fi[0], fi[1], &prib1a, &otnt1a);
    sum_dif_I(fi[2], fi[3], &prib2a, &otnt2a);
    sum_dif_I(fi[4], fi[5], &prib3a, &otnt3a);
    sum_dif_I(fi[6], fi[7], &prib4a, &otnt4a);

    sum_dif_I(prib1a, prib2a, &prib1b, &otnt1b);
    sum_dif_I(prib3a, prib4a, &prib2b, &otnt2b);

    sum_dif_I(prib1b, prib2b, &fi[0], &fi[4]);
    sum_dif_I(otnt3a, otnt4a, &oT1a, &oT2a);

    mM2a = mult_shf_s16x16(mM2a, 181);
    sum_dif_I(mins1a,   mM2a, &plus1a, &plus2a);

    prib2b =    mult_shf_s16x16(oT1a, 181);
    sum_dif_I(otnt2a, prib2b, &mins3a, &plus3a);

    sum_dif_I(plus1a, mins3a, &fr[7], &fr[1]);
    sum_dif_I(mins1b, otnt2b, &fr[6], &fr[2]);
    sum_dif_I(plus2a, plus3a, &fr[3], &fr[5]);

    oT2a = mult_shf_s16x16(oT2a, 181);
    sum_dif_I( otnt1a, oT2a, &plus1a, &plus2a);

    plus2b =    mult_shf_s16x16(mM1a, 181);
    sum_dif_I(-mins2a, plus2b, &plus3a, &mins3a);

    sum_dif_I(plus1a, mins3a, &fi[7], &fi[1]);
    sum_dif_I(otnt1b,-mins2b, &fi[6], &fi[2]);
    sum_dif_I(plus2a, plus3a, &fi[3], &fi[5]);
}
static inline void mult_shf_I(int c, int s, int x, int y, int *u, int *v) {
	*u = (mult_shf_s16x16(x, c) - mult_shf_s16x16(y, s));
	*v = (mult_shf_s16x16(y, c) + mult_shf_s16x16(x, s));
}