dataIntegralFreqOne function

List<double> dataIntegralFreqOne(
  1. List<double> data,
  2. double fs,
  3. double lowerFreq,
  4. double upperFreq,
)

Implementation

List<double> dataIntegralFreqOne(
    List<double> data, double fs, double lowerFreq, double upperFreq) {
  var len = data.length;

  var fx = realFFT(data);

  // Stopwatch stopwatch = Stopwatch()..start();

  var df = fs / len;

  var dw = 2 * math.pi * df;

  var w = List<double>.filled(len, 0);
  for (var i = 0; i < len; i++) {
    if (i <= len / 2 - 1) {
      w[i] = i == 0 ? 0 : w[i - 1] + dw;
    } else {
      w[i] = i == len / 2 ? (-len * dw) / 2 : w[i - 1] + dw;
    }
  }

  var fy1 = List<Complex>.filled(len, Complex());
  for (var i = 0; i < len; i++) {
    if (i == 0) {
      fy1[i] = Complex.ri(0, 0);
    } else {
      fy1[i] = fx[i].div(Complex.ri(0, w[i]));
    }
  }

  var iL = (lowerFreq / df).floor();
  var iH = (upperFreq / df).ceil();

  var fy2 = List<Complex>.filled(len, Complex());
  for (var i = 0; i < len; i++) {
    if (i >= iL && i <= iH) {
      fy2[i] = Complex.ri(fy1[i].real, fy1[i].imaginary);
    } else if (i >= len - iH && i <= math.min(len - 1, len - iL)) {
      fy2[i] = fy1[i];
    } else {
      fy2[i] = Complex.ri(0, 0);
    }
  }
  // print('dataIntegralFreqOne() executed in ${stopwatch.elapsed}');
  var outData = inverseFft(fy2);
  return outData;
}