Skip to content

Commit f70d8d5

Browse files
committed
fix things not account for in/out channels
1 parent ee895f4 commit f70d8d5

File tree

3 files changed

+55
-31
lines changed

3 files changed

+55
-31
lines changed

src/fantasy.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -162,13 +162,17 @@ impl Dsp for Fantasy {
162162
) {
163163
out_data.fill(0.);
164164

165-
self.delay.extend(
166-
in_data
167-
.iter()
168-
.step_by(2)
169-
.zip(in_data.iter().skip(1).step_by(2))
170-
.map(|(l, r)| (l + r) / 2.),
171-
);
165+
if in_channels == 1 {
166+
self.delay.extend_from_slice(in_data);
167+
} else {
168+
self.delay.extend(
169+
in_data
170+
.iter()
171+
.step_by(2)
172+
.zip(in_data.iter().skip(1).step_by(2))
173+
.map(|(l, r)| (l + r) / 2.)
174+
);
175+
}
172176

173177
if self.delay.is_full() {
174178
copy_contiguous(&self.delay, &mut self.copy);
@@ -225,8 +229,9 @@ impl Dsp for Fantasy {
225229
let new = self.copy[BUFLEN - (out_len * 2) + i];
226230
let old = self.residual[i];
227231
let it = interp(old, new, i, out_len);
228-
out_data[i * 2] = it;
229-
out_data[i * 2 + 1] = it;
232+
for ch in 0..out_channels {
233+
out_data[i * out_channels + ch] = it;
234+
}
230235
}
231236

232237
// update residual

src/noise_reduction.rs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/vocoder.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,17 @@ impl Dsp for Vocoder {
131131
) {
132132
out_data.fill(0.);
133133

134-
self.delay_signal.extend(
135-
in_data
136-
.iter()
137-
.step_by(2)
138-
.zip(in_data.iter().skip(1).step_by(2))
139-
.map(|(l, r)| (l + r) / 2.),
140-
);
134+
if in_channels == 1 {
135+
self.delay_signal.extend_from_slice(in_data);
136+
} else {
137+
self.delay_signal.extend(
138+
in_data
139+
.iter()
140+
.step_by(2)
141+
.zip(in_data.iter().skip(1).step_by(2))
142+
.map(|(l, r)| (l + r) / 2.)
143+
);
144+
}
141145

142146
if self.sidechain_enabled {
143147
with_sidechain(|rst| {
@@ -185,10 +189,15 @@ impl Dsp for Vocoder {
185189
for i in 0..HBUFLEN {
186190
let sig_i = i as i32 + self.signal_offset;
187191
let car_i = i as i32 + self.carrier_offset;
188-
if sig_i < 0 || sig_i >= HBUFLEN as i32 || car_i < 0 || car_i >= HBUFLEN as i32 {
192+
if sig_i < 0
193+
|| sig_i >= HBUFLEN as i32
194+
|| car_i < 0
195+
|| car_i >= HBUFLEN as i32
196+
{
189197
self.out_signal[i] = Complex::zero();
190198
} else {
191-
self.out_signal[i] = self.scratch[sig_i as usize] * self.out_carrier[car_i as usize].norm();
199+
self.out_signal[i] = self.scratch[sig_i as usize]
200+
* self.out_carrier[car_i as usize].norm();
192201
}
193202
}
194203
self.out_signal[0].im = 0.;

0 commit comments

Comments
 (0)