first commit

This commit is contained in:
Uladzimir Karpenka
2026-06-01 15:58:45 +03:00
commit 89c8a0e2b5
313 changed files with 945364 additions and 0 deletions
@@ -0,0 +1,130 @@
/*
libspecbleach - A spectral processing library
Copyright 2022 Luciano Dato <lucianodato@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "gain_estimators.h"
#include "../configurations.h"
#include "../utils/general_utils.h"
#include <float.h>
#include <math.h>
#include <stddef.h>
static void wiener_subtraction(const uint32_t real_spectrum_size,
const uint32_t fft_size, const float* spectrum,
const float* noise_spectrum,
float* gain_spectrum) {
for (uint32_t k = 0U; k < real_spectrum_size; k++) {
if (noise_spectrum[k] > FLT_MIN) {
if (spectrum[k] > noise_spectrum[k]) {
gain_spectrum[k] = (spectrum[k] - (noise_spectrum[k])) / spectrum[k];
} else {
gain_spectrum[k] = 0.F;
}
} else {
gain_spectrum[k] = 1.F;
}
if (k > 0U && k < (fft_size - k)) {
gain_spectrum[fft_size - k] = gain_spectrum[k];
}
}
}
static void spectral_gating(const uint32_t real_spectrum_size,
const uint32_t fft_size, const float* spectrum,
const float* noise_spectrum, float* gain_spectrum) {
for (uint32_t k = 0U; k < real_spectrum_size; k++) {
if (noise_spectrum[k] > FLT_MIN) {
if (spectrum[k] >= noise_spectrum[k]) {
gain_spectrum[k] = 1.F;
} else {
gain_spectrum[k] = 0.F;
}
} else {
gain_spectrum[k] = 1.F;
}
if (k > 0U && k < (fft_size - k)) {
gain_spectrum[fft_size - k] = gain_spectrum[k];
}
}
}
static void generalized_spectral_subtraction(
const uint32_t real_spectrum_size, const uint32_t fft_size,
const float* spectrum, const float* noise_spectrum, float* gain_spectrum,
const float* alpha, const float* beta) {
for (uint32_t k = 0U; k < real_spectrum_size; k++) {
if (spectrum[k] > FLT_MIN) {
if (powf((noise_spectrum[k] / spectrum[k]), GSS_EXPONENT) <
(1.F / (alpha[k] + beta[k]))) {
gain_spectrum[k] =
fmaxf(powf(1.F - (alpha[k] * powf((noise_spectrum[k] / spectrum[k]),
GSS_EXPONENT)),
1.F / GSS_EXPONENT),
0.F);
} else {
gain_spectrum[k] = fmaxf(
powf(
beta[k] * powf((noise_spectrum[k] / spectrum[k]), GSS_EXPONENT),
1.F / GSS_EXPONENT),
0.F);
}
} else {
gain_spectrum[k] = 1.F;
}
if (k > 0U && k < (fft_size - k)) {
gain_spectrum[fft_size - k] = gain_spectrum[k];
}
}
}
static void scale_noise_profile(uint32_t real_spectrum_size,
float* noise_spectrum, const float* alpha) {
for (uint32_t k = 0U; k < real_spectrum_size; k++) {
noise_spectrum[k] *= alpha[k];
}
}
void estimate_gains(uint32_t real_spectrum_size, uint32_t fft_size,
const float* spectrum, float* noise_spectrum,
float* gain_spectrum, const float* alpha, const float* beta,
GainEstimationType type) {
switch (type) {
case GATES:
scale_noise_profile(real_spectrum_size, noise_spectrum, alpha);
spectral_gating(real_spectrum_size, fft_size, spectrum, noise_spectrum,
gain_spectrum);
break;
case WIENER:
scale_noise_profile(real_spectrum_size, noise_spectrum, alpha);
wiener_subtraction(real_spectrum_size, fft_size, spectrum, noise_spectrum,
gain_spectrum);
break;
case GENERALIZED_SPECTRALSUBTRACION:
generalized_spectral_subtraction(real_spectrum_size, fft_size, spectrum,
noise_spectrum, gain_spectrum, alpha,
beta);
break;
default:
break;
}
}
@@ -0,0 +1,38 @@
/*
libspecbleach - A spectral processing library
Copyright 2022 Luciano Dato <lucianodato@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef GAIN_ESTIMATORS_H
#define GAIN_ESTIMATORS_H
#include <stdbool.h>
#include <stdint.h>
typedef enum GainEstimationType {
WIENER = 0,
GATES = 1,
GENERALIZED_SPECTRALSUBTRACION = 2,
} GainEstimationType;
void estimate_gains(uint32_t real_spectrum_size, uint32_t fft_size,
const float* spectrum, float* noise_spectrum,
float* gain_spectrum, const float* alpha, const float* beta,
GainEstimationType type);
#endif
@@ -0,0 +1,3 @@
shared_sources += files(
'gain_estimators.c',
)