transformBluestein function
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];
}
}