Fix STFT example filter normalization
This commit is contained in:
parent
7c8da39159
commit
175030b77c
|
@ -78,9 +78,9 @@ examples.
|
||||||
frequency smoothing that can also make use of MIDI input instead of generating
|
frequency smoothing that can also make use of MIDI input instead of generating
|
||||||
a static signal based on the plugin's parameters.
|
a static signal based on the plugin's parameters.
|
||||||
- [**stft**](plugins/examples/stft) shows off some of NIH-plug's other optional
|
- [**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
|
higher level helper features, such as an adapter to process audio with a
|
||||||
short-term Fourier transform operations, all using the compositional `Buffer`
|
short-term Fourier transform using the overlap-add method, all using the
|
||||||
interface.
|
compositional `Buffer` interfaces.
|
||||||
|
|
||||||
## Licensing
|
## Licensing
|
||||||
|
|
||||||
|
|
|
@ -49,15 +49,11 @@ impl Default for Stft {
|
||||||
let filter_window = util::window::hann(FILTER_WINDOW_SIZE);
|
let filter_window = util::window::hann(FILTER_WINDOW_SIZE);
|
||||||
real_fft_scratch_buffer[0..FILTER_WINDOW_SIZE].copy_from_slice(&filter_window);
|
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
|
// And make sure to normalize this so the levels doesn't change much after convolving
|
||||||
// with this filter
|
let filter_normalization_factor =
|
||||||
let window_function = util::window::hann(WINDOW_SIZE);
|
real_fft_scratch_buffer.iter().sum::<f32>().recip() * 2.0f32.sqrt() * 2.0;
|
||||||
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();
|
|
||||||
for sample in real_fft_scratch_buffer.as_slice_mut() {
|
for sample in real_fft_scratch_buffer.as_slice_mut() {
|
||||||
*sample *= filter_sum_recip;
|
*sample *= filter_normalization_factor;
|
||||||
}
|
}
|
||||||
|
|
||||||
r2c_plan
|
r2c_plan
|
||||||
|
@ -71,7 +67,7 @@ impl Default for Stft {
|
||||||
params: Box::pin(StftParams::default()),
|
params: Box::pin(StftParams::default()),
|
||||||
|
|
||||||
stft: util::StftHelper::new(2, WINDOW_SIZE),
|
stft: util::StftHelper::new(2, WINDOW_SIZE),
|
||||||
window_function,
|
window_function: util::window::hann(WINDOW_SIZE),
|
||||||
|
|
||||||
lp_filter_kernel: complex_fft_scratch_buffer
|
lp_filter_kernel: complex_fft_scratch_buffer
|
||||||
.iter()
|
.iter()
|
||||||
|
|
Loading…
Reference in a new issue