@@ -60,9 +60,9 @@ impl Dsp for NoiseReduction {
6060 vec ! [
6161 Parameter {
6262 ty: ParameterType :: Float {
63- min: 0.1 ,
64- max: 3.0 ,
65- default : 1.7 ,
63+ min: 0. ,
64+ max: 10. ,
65+ default : 6. ,
6666 getter: |x| x. var_adj,
6767 setter: |value, dsp| dsp. var_adj = value,
6868 } ,
@@ -148,7 +148,7 @@ impl Dsp for NoiseReduction {
148148 copy_right : [ 0. ; BUFLEN ] ,
149149 residual : [ 0. ; BUFLEN / 2 ] ,
150150 var_enable : true ,
151- var_adj : 1.7 ,
151+ var_adj : 6. ,
152152 persist_enable : true ,
153153 persist_lerp : 0.03 ,
154154 noise_gate_enable : true ,
@@ -191,11 +191,18 @@ impl Dsp for NoiseReduction {
191191 in_channels : usize , // assume 2
192192 out_channels : usize ,
193193 ) {
194+ out_data. fill ( 0. ) ;
195+
194196 // extend buffers
195- self . delay_left . extend ( in_data. iter ( ) . step_by ( 2 ) ) ;
196- self . delay_right . extend ( in_data. iter ( ) . skip ( 1 ) . step_by ( 2 ) ) ;
197+ if in_channels == 1 {
198+ self . delay_left . extend_from_slice ( in_data) ;
199+ self . delay_right . extend_from_slice ( in_data) ;
200+ } else {
201+ self . delay_left . extend ( in_data. iter ( ) . step_by ( 2 ) ) ;
202+ self . delay_right . extend ( in_data. iter ( ) . skip ( 1 ) . step_by ( 2 ) ) ;
203+ }
197204
198- self . clock += in_data. len ( ) / 2 ;
205+ self . clock += in_data. len ( ) / in_channels ;
199206
200207 // when we have enough data...
201208 if self . delay_left . is_full ( ) && self . delay_right . is_full ( ) {
@@ -230,9 +237,9 @@ impl Dsp for NoiseReduction {
230237 let mut mean = 0. ;
231238 let mut variance = 0. ;
232239 if self . var_enable {
233- let offset = ( self . out_left [ 0 ] + self . out_right [ 0 ] ) . norm ( ) / 2. ;
240+ let offset = ( self . out_left [ 0 ] . norm ( ) + self . out_right [ 0 ] . norm ( ) ) / 2. ;
234241 for i in 0 ..HBUFLEN {
235- let x = ( self . out_left [ i] + self . out_right [ i] ) . norm ( ) / 2. - offset;
242+ let x = ( self . out_left [ i] . norm ( ) + self . out_right [ i] . norm ( ) ) / 2. - offset;
236243 mean += x;
237244 variance += x * x;
238245 }
@@ -266,8 +273,10 @@ impl Dsp for NoiseReduction {
266273
267274 if self . var_enable {
268275 // reduce with variance
269- let v = self . var_adj ;
270- self . out_left [ i] *= ( v - variance. log2 ( ) . clamp ( 0. , v) ) / v;
276+ // self.out_left[i] *= (v - variance.log2().clamp(0., v)) / v;
277+ let k = ( 0.4 * self . var_adj + 6. ) / 5. ;
278+ let x1: f32 = ( 2. / ( 1. + f32:: powf ( 2. , variance * -k. log2 ( ) ) ) ) - 1. ;
279+ self . out_left [ i] *= x1;
271280 }
272281 }
273282
@@ -310,8 +319,9 @@ impl Dsp for NoiseReduction {
310319 let new = self . copy_left [ BUFLEN - ( out_len * 2 ) + i] ;
311320 let old = self . residual [ i] ;
312321 let it = interp ( old, new, i, out_len) ;
313- out_data[ i * 2 ] = it;
314- out_data[ i * 2 + 1 ] = it;
322+ for ch in 0 ..out_channels {
323+ out_data[ i * out_channels + ch] = it;
324+ }
315325 }
316326
317327 // update residual
0 commit comments