1
0
Fork 0

Fix STFT example filter normalization

This commit is contained in:
Robbert van der Helm 2022-03-06 18:54:18 +01:00
parent 7c8da39159
commit 175030b77c
2 changed files with 8 additions and 12 deletions

View file

@ -78,9 +78,9 @@ examples.
frequency smoothing that can also make use of MIDI input instead of generating
a static signal based on the plugin's parameters.
- [**stft**](plugins/examples/stft) shows off some of NIH-plug's other optional
helper features, like an adapter to process audio in buffered blocks meant for
short-term Fourier transform operations, all using the compositional `Buffer`
interface.
higher level helper features, such as an adapter to process audio with a
short-term Fourier transform using the overlap-add method, all using the
compositional `Buffer` interfaces.
## Licensing

View file

@ -49,15 +49,11 @@ impl Default for Stft {
let filter_window = util::window::hann(FILTER_WINDOW_SIZE);
real_fft_scratch_buffer[0..FILTER_WINDOW_SIZE].copy_from_slice(&filter_window);
// Our STFT functions will have a window function applied, so we need to do the same thing
// with this filter
let window_function = util::window::hann(WINDOW_SIZE);
util::window::multiply_with_window(&mut real_fft_scratch_buffer, &window_function);
// And make sure to normalize this so convolution sums to 1
let filter_sum_recip = real_fft_scratch_buffer.iter().sum::<f32>().recip();
// And make sure to normalize this so the levels doesn't change much after convolving
let filter_normalization_factor =
real_fft_scratch_buffer.iter().sum::<f32>().recip() * 2.0f32.sqrt() * 2.0;
for sample in real_fft_scratch_buffer.as_slice_mut() {
*sample *= filter_sum_recip;
*sample *= filter_normalization_factor;
}
r2c_plan
@ -71,7 +67,7 @@ impl Default for Stft {
params: Box::pin(StftParams::default()),
stft: util::StftHelper::new(2, WINDOW_SIZE),
window_function,
window_function: util::window::hann(WINDOW_SIZE),
lp_filter_kernel: complex_fft_scratch_buffer
.iter()