Ejemplo n.º 1
0
void fft (vector<cmplx> & a, bool invert) 
{
  int n = (int) a.size();
 
  for (int i=1, j=0; i<n; ++i) {
    int bit = n >> 1;
    for (; j>=bit; bit>>=1)
      j -= bit;
    j += bit;
    if (i < j)
      swap (a[i], a[j]);
  }
 
  for (int len=2; len<=n; len<<=1) {
    double ang = 2*PI/len * (invert ? -1 : 1);
    cmplx wlen (cos(ang), sin(ang));
    for (int i=0; i<n; i+=len) {
      cmplx w (1);
      for (int j=0; j<len/2; ++j) {
        cmplx u = a[i+j],  v = a[i+j+len/2] * w;
        a[i+j] = u + v;
        a[i+j+len/2] = u - v;
        w *= wlen;
      }
    }
  }
  if (invert)
    for (int i=0; i<n; ++i)
      a[i] /= n;
}
Ejemplo n.º 2
0
void Algorithms::FastFourierTransform(std::vector<std::complex<long double> > & a, bool invert){
    int n = (int) a.size();
	int lg_n = 0;
	while ((1 << lg_n) < n)  ++lg_n;

	for (int i=0; i<n; ++i)
		if (i < rev(i,lg_n))
			std::swap (a[i], a[rev(i,lg_n)]);

	for (int len=2; len<=n; len<<=1) {
		long double ang = 2*PI/len * (invert ? -1 : 1);
		std::complex<long double> wlen (cos(ang), sin(ang));
		for (int i=0; i<n; i+=len) {
			std::complex<long double> w (1);
			for (int j=0; j<len/2; ++j) {
				std::complex<long double> u = a[i+j],  v = a[i+j+len/2] * w;
				a[i+j] = u + v;
				a[i+j+len/2] = u - v;
				w *= wlen;
			}
		}
	}
	if (invert)
		for (int i=0; i<n; ++i)
			a[i] /= n;
}
Ejemplo n.º 3
0
Archivo: a.cpp Proyecto: filaPro/my
void fft (std::vector<base> &arr, bool invert) {
    int cnt = static_cast<int>(arr.size());

    for (int i = 1, j = 0; i < cnt; ++i) {
        int bit = cnt >> 1;
        for (; j >= bit; bit >>= 1) {
            j -= bit;
        }
        j += bit;
        if (i < j)
            std::swap (arr[i], arr[j]);
    }

    for (int len = 2; len <= cnt; len <<= 1) {
        double ang = 2 * 3.14159265359 / len * (invert ? -1 : 1);
        base wlen (cos(ang), sin(ang));
        for (int i = 0; i < cnt; i += len) {
            base w(1, 0);
            for (int j = 0; j < len / 2; ++j) {
                base u = arr[i + j],  v = arr[i + j + len / 2] * w;
                arr[i + j] = u + v;
                arr[i + j + len / 2] = u - v;
                w *= wlen;
            }
        }
    }
    if (invert)
        for (int i = 0; i < cnt; ++i) {
            arr[i] /= cnt;
        }
}
Ejemplo n.º 4
0
/*
    Cast the operand to the specified type

    function cast(type: Type) : Object
 */
static EjsAny *castRegExp(Ejs *ejs, EjsRegExp *rp, EjsType *type)
{
    wchar   *pattern;
    char    *flags;
    ssize   len, flen;
    int     i, j;

    switch (type->sid) {
    case S_Boolean:
        return ESV(true);

    case S_String:
        flags = makeFlags(rp);
        len = wlen(rp->pattern);
        flen = wlen(flags);
        pattern = mprAlloc((len * 2 + flen + 1) * sizeof(wchar));
        /*
            Convert to a form that is a valid, parsable as regular expression literal
         */
        pattern[0] = '/';
        for (i = 0, j = 1; i < len; i++) {
            if (rp->pattern[i] == '/') {
                pattern[j++] = '\\';
            }
            pattern[j++] = rp->pattern[i];
        }
        pattern[j++] = '/';
        for (i = 0; i < flen; i++) {
            pattern[j++] = flags[i];
        }
        pattern[j] = 0;
        return ejsCreateStringFromAsc(ejs, pattern);

    default:
        ejsThrowTypeError(ejs, "Cannot cast to this type");
        return 0;
    }
    return 0;
}
Ejemplo n.º 5
0
//hightest speed :)
bool CFourier::FFT( std::vector<complex_double> &a, bool inv )
{
  int n = (int) a.size();
  //invert bits in lg_n based number and reorder data in a sequence
  for (int i=1, j=0; i<n; ++i) {
    int bit = n >> 1;
    for (; j>=bit; bit>>=1)
      j -= bit;
    j += bit;
    if (i < j)
      std::swap(a[i], a[j]);
  }

  //work with blocks of len elements
  double *ImPartSourceTable = inv ? ImPartTable_reverse : ImPartTable_direct;
  for (int len = 2, lgn = 0; len <= n; len <<= 1, lgn++) {
    complex_double wlen(RPartTable[lgn], ImPartSourceTable[lgn]);

    //butterfly on each element in block
    for (int i = 0; i < n; i+=len){
      complex_double w(1.0);
      for (int j = 0; j < len/2; ++j){
        complex_double u = a[i+j], v = a[i+j+len/2] * w;
        a[i+j] = u + v;
        a[i+j+len/2] = u - v;
        w *= wlen;
      }
    }
  }

  if (inv){
    for (int i = 0; i < n; ++i)
      a[i] /= n;
  }
  return true;
}
Ejemplo n.º 6
0
static EjsString *regex_getSource(Ejs *ejs, EjsRegExp *rp, int argc, EjsObj **argv)
{
    return ejsCreateString(ejs, rp->pattern, wlen(rp->pattern));
}
Ejemplo n.º 7
0
EjsArray *ejsCaptureStack(Ejs *ejs, int uplevels)
{
    EjsFrame        *fp;
    EjsState        *state;
    EjsArray        *stack;
    wchar           *source;
    EjsObj          *frame;
    char            *filename;
    int             index, lineNumber;

    assert(ejs);

    stack = ejsCreateArray(ejs, 0);
    index = 0;
    for (state = ejs->state; state; state = state->prev) {
        for (fp = state->fp; fp; fp = fp->caller) {
            if (uplevels-- <= 0) {
                frame = ejsCreateEmptyPot(ejs);
                if (ejsGetDebugInfo(ejs, (EjsFunction*) fp, fp->pc, &filename, &lineNumber, &source) >= 0) {
                    ejsSetPropertyByName(ejs, frame, EN("filename"), ejsCreatePathFromAsc(ejs, filename));
                    ejsSetPropertyByName(ejs, frame, EN("lineno"), ejsCreateNumber(ejs, lineNumber));
                    ejsSetPropertyByName(ejs, frame, EN("code"), ejsCreateString(ejs, source, wlen(source)));
                } else {
                    ejsSetPropertyByName(ejs, frame, EN("filename"), EST(undefined));
                }
                ejsSetPropertyByName(ejs, frame, EN("func"), fp->function.name);
                ejsSetProperty(ejs, stack, index++, frame);
            }
        }
    }
    return stack;
}