transformBluestein function

void transformBluestein(
  1. List<double> real,
  2. List<double> imag
)

Implementation

void transformBluestein(List<double> real, List<double> imag) {
  var n = real.length;
  if (n != imag.length) throw new RangeError("实部虚部长度不匹配");
  var m = 1;
  while (m < n * 2 + 1) m *= 2;

  var cosTable = List<double>.filled(n, 0);
  var sinTable = List<double>.filled(n, 0);
  for (var i = 0; i < n; i++) {
    var j = (i * i) % (n * 2);
    cosTable[i] = math.cos((math.pi * j) / n);
    sinTable[i] = math.sin((math.pi * j) / n);
  }

  var areal = newArrayOfZeros(m);
  var aimag = newArrayOfZeros(m);
  for (var i = 0; i < n; i++) {
    areal[i] = real[i] * cosTable[i] + imag[i] * sinTable[i];
    aimag[i] = -real[i] * sinTable[i] + imag[i] * cosTable[i];
  }
  var breal = newArrayOfZeros(m);
  var bimag = newArrayOfZeros(m);
  breal[0] = cosTable[0];
  bimag[0] = sinTable[0];
  for (var i = 1; i < n; i++) {
    breal[i] = breal[m - i] = cosTable[i];
    bimag[i] = bimag[m - i] = sinTable[i];
  }

  var creal = List<double>.filled(m, 0);
  var cimag = List<double>.filled(m, 0);
  convolveComplex(areal, aimag, breal, bimag, creal, cimag);

  for (var i = 0; i < n; i++) {
    real[i] = creal[i] * cosTable[i] + cimag[i] * sinTable[i];
    imag[i] = -creal[i] * sinTable[i] + cimag[i] * cosTable[i];
  }
}