bool LogSpectrum::Init()

in ops/LogMels.cc [102:150]


bool LogSpectrum::Init() {
  if (inited_) {
    return true;
  }
  if (!fifo_) {
    if (!(fifo_ =
              av_audio_fifo_alloc(AV_SAMPLE_FMT_FLT, 1, kAudioBufferSize))) {
      LOG(ERROR) << "Could not allocate FIFO";
      return false;
    }
  }

  float maxFreq = samplingRate_ / 2.0f;
  CHECK_LT(startFreq_, endFreq_) << "End frequency is larger than start freq";
  CHECK_LE(endFreq_, maxFreq) << "End frequency is larger than maxFreq";

  float startMel = hz2Mel(startFreq_);
  float endMel = hz2Mel(endFreq_);
  float dx = (endMel - startMel) / (numChannels_ + 1);
  float freqStep = samplingRate_ / 2 / filterLength_;
  for (int filter = 0; filter < numChannels_; ++filter) {
    float start = mel2Hz(filter * dx) / freqStep;
    float mid = mel2Hz((filter + 1) * dx) / freqStep;
    float end = mel2Hz((filter + 2) * dx) / freqStep;
    int from = int(start);
    int to = int(end) + 1;
    float leftWidth = std::max<float>(1.0, mid - start);
    float rightWidth = std::max<float>(1.0, end - mid);
    float sum = 0;
    from = std::max<int>(0, from);
    to = std::min<int>(filterLength_ - 1, to);
    filterRanges_.emplace_back(from, to);
    for (int i = from; i <= to; i++) {
      float value =
          1.f - ((i < mid) ? (mid - i) / leftWidth : (i - mid) / rightWidth);
      if (value > 0) {
        filters_[filter * filterLength_ + i] = value;
        sum += value;
      }
    }
    if (normalized_ && sum > 0) {
      for (int inX = from; inX <= to; inX++) {
        filters_[filter * filterLength_ + inX] /= sum;
      }
    }
  }
  inited_ = true;
  return true;
}