Skip to content
33 changes: 13 additions & 20 deletions src/layer/inversespectrogram.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ int InverseSpectrogram::load_param(const ParamDict& pd)

// assert winlen <= n_fft
// generate window
window_data.create(normalized == 2 ? n_fft + 1 : n_fft);
window_data.create(n_fft);
{
float* p = window_data;
for (int i = 0; i < (n_fft - winlen) / 2; i++)
Expand Down Expand Up @@ -60,14 +60,24 @@ int InverseSpectrogram::load_param(const ParamDict& pd)
}

// pre-calculated window norm factor
if (normalized == 1)
{
float inv = 1.f / sqrtf((float)n_fft);
for (int i = 0; i < n_fft; i++)
window_data[i] *= inv;
}
if (normalized == 2)
{
float sqsum = 0.f;
for (int i = 0; i < n_fft; i++)
{
sqsum += window_data[i] * window_data[i];

if (sqsum > 0.f)
{
float inv = 1.f / sqrtf(sqsum);
for (int i = 0; i < n_fft; i++)
window_data[i] *= inv;
}
window_data[n_fft] = sqrt(sqsum);
}
}

Expand Down Expand Up @@ -135,23 +145,6 @@ int InverseSpectrogram::forward(const Mat& bottom_blob, Mat& top_blob, const Opt
}
}

if (normalized == 1)
{
float norm = sqrt(n_fft);
for (int i = 0; i < 2 * n_fft; i++)
{
sp[i] *= norm;
}
}
if (normalized == 2)
{
float norm = window_data[n_fft];
for (int i = 0; i < 2 * n_fft; i++)
{
sp[i] *= norm;
}
}

#pragma omp parallel for num_threads(opt.num_threads)
for (int i = 0; i < n_fft; i++)
{
Expand Down
30 changes: 15 additions & 15 deletions src/layer/spectrogram.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ int Spectrogram::load_param(const ParamDict& pd)

// assert winlen <= n_fft
// generate window
window_data.create(normalized == 2 ? n_fft + 1 : n_fft);
window_data.create(n_fft);
{
float* p = window_data;
for (int i = 0; i < (n_fft - winlen) / 2; i++)
Expand Down Expand Up @@ -62,14 +62,27 @@ int Spectrogram::load_param(const ParamDict& pd)
}

// pre-calculated window norm factor
if (normalized == 1)
{
float scale = 1.f / sqrt(n_fft);
for (int i = 0; i < n_fft; i++)
{
window_data[i] *= scale;
}
}
if (normalized == 2)
{
float sqsum = 0.f;
for (int i = 0; i < n_fft; i++)
{
sqsum += window_data[i] * window_data[i];
}
window_data[n_fft] = 1.f / sqrt(sqsum);
float scale = 1.f / sqrt(sqsum);

for (int i = 0; i < n_fft; i++)
{
window_data[i] *= scale;
}
}
}

Expand Down Expand Up @@ -139,19 +152,6 @@ int Spectrogram::forward(const Mat& bottom_blob, Mat& top_blob, const Option& op
im -= v * sinf(angle); // + imag * cosf(angle);
}

if (normalized == 1)
{
float norm = 1.f / sqrt(n_fft);
re *= norm;
im *= norm;
}
if (normalized == 2)
{
float norm = window_data[n_fft];
re *= norm;
im *= norm;
}

if (power == 0)
{
// complex as real
Expand Down
Loading