summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2024-04-24 10:15:55 +1000
committerDamien Zammit <damien@zamaudio.com>2024-04-24 10:31:37 +1000
commitc42f1ee07eba5bcef3cc94da641af53990c166cc (patch)
tree66b3e9ace0685fe62ff826f52e1f04a19dc6b473
parentd84f69b9ad5a3d2c3d6265a64df0c72b34aaf165 (diff)
ZamNoise: Use EM algorithm variation with smaller FFT
-rw-r--r--plugins/ZamNoise/Denoise.cpp23
-rw-r--r--plugins/ZamNoise/Denoise.hpp6
2 files changed, 15 insertions, 14 deletions
diff --git a/plugins/ZamNoise/Denoise.cpp b/plugins/ZamNoise/Denoise.cpp
index 8d413f9..080b7dc 100644
--- a/plugins/ZamNoise/Denoise.cpp
+++ b/plugins/ZamNoise/Denoise.cpp
@@ -21,7 +21,7 @@
#include "Denoise.hpp"
#include "bessel.inc"
-void Denoise::compute_bark_z(int FFT_SIZE, int rate)
+void Denoise::compute_bark_z(int rate)
{
int k;
@@ -32,7 +32,7 @@ void Denoise::compute_bark_z(int FFT_SIZE, int rate)
}
}
-void Denoise::compute_johnston_gain(int FFT_SIZE, double tonality_factor)
+void Denoise::compute_johnston_gain(double tonality_factor)
{
int k;
@@ -242,7 +242,7 @@ void Denoise::fft_remove_noise(const float* ins, float* outs, uint32_t frames, f
SFM = 10.0*( kinv*sum_log_p - log10(sum_p*kinv) );
tonality_factor = MIN(SFM/-60.0, 1);
}
-
+/*
for (k = 1; k <= FFT_SIZE/2 ; ++k) {
int j ;
@@ -262,12 +262,12 @@ void Denoise::fft_remove_noise(const float* ins, float* outs, uint32_t frames, f
masked[k] += MAX((Y2[j]-noise2[j]),0.0)*gain ;
}
}
-
+*/
for (k = 1; k <= FFT_SIZE/2 ; ++k) {
if(noise2[k] > DBL_MIN) {
double gain, Fk, Gk;
-/*
+
double Rpost = MAX(Y2[k]/noise2[k]-1.0, 0.0);
double alpha = dn_gamma;
double Rprio;
@@ -280,7 +280,8 @@ void Denoise::fft_remove_noise(const float* ins, float* outs, uint32_t frames, f
gain = gain_em(Rprio, Rpost, alpha);
gain_prev[k] = gain;
Y2_prev[k] = Y2[k];
-*/
+
+/*
double Rpost = MAX(Y2[k]/noise2[k]-1.0, 0.0) ;
double alpha = dn_gamma ;
double Rprio ;
@@ -299,7 +300,7 @@ void Denoise::fft_remove_noise(const float* ins, float* outs, uint32_t frames, f
}
gain_prev[k] = gain ;
-
+*/
Fk = amount*(1.0-gain);
if(Fk < 0.0) Fk = 0.0;
@@ -329,7 +330,7 @@ void Denoise::fft_remove_noise(const float* ins, float* outs, uint32_t frames, f
Denoise::Denoise(float srate) {
int k;
- FFT_SIZE = 16384;
+ FFT_SIZE = 4096;
dn_gamma = 0.95;
n_noise_samples = FFT_SIZE;
rate = (int) srate;
@@ -383,7 +384,7 @@ Denoise::~Denoise() {
void Denoise::get_noise_sample(float* noisebuffer, fftw_real *left_noise_min, fftw_real *left_noise_max, fftw_real *left_noise_avg)
{
- int i, k;
+ int k;
for(k = 0 ; k < FFT_SIZE ; k++) {
window_coef[k] = 1.0;
@@ -419,8 +420,8 @@ void Denoise::get_noise_sample(float* noisebuffer, fftw_real *left_noise_min, ff
left_noise_avg[k] /= (double)n_noise_samples;
}
- compute_bark_z(FFT_SIZE, rate);
- compute_johnston_gain(FFT_SIZE, tonality_factor);
+ compute_bark_z(rate);
+ compute_johnston_gain(tonality_factor);
/*
if(freq_filter) {
if(estimate_power_floor) {
diff --git a/plugins/ZamNoise/Denoise.hpp b/plugins/ZamNoise/Denoise.hpp
index 348cd90..c887031 100644
--- a/plugins/ZamNoise/Denoise.hpp
+++ b/plugins/ZamNoise/Denoise.hpp
@@ -27,7 +27,7 @@
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define FFTW(func) fftwf_ ## func
-#define DENOISE_MAX_FFT 32768
+#define DENOISE_MAX_FFT 8192
#define DENOISE_WINDOW_BLACKMAN 0
#define DENOISE_WINDOW_BLACKMAN_HYBRID 1
#define DENOISE_WINDOW_HANNING_OVERLAP_ADD 2
@@ -40,8 +40,8 @@ public:
Denoise(float srate);
~Denoise();
void process(const float* ins, float* outs, float* noisebuffer, uint32_t frames, int noisetoggle);
- void compute_bark_z(int FFT_SIZE, int rate);
- void compute_johnston_gain(int FFT_SIZE, double tonality_factor);
+ void compute_bark_z(int rate);
+ void compute_johnston_gain(double tonality_factor);
int get_window_delta();
void compute_sum_window_wgts();
double gain_weiner(double Yk2, double Dk2);