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;
}