[PAID] Seeking DSP Engineer for Custom IIR Allpass Oversampling (C++/JUCE/MATLAB)
-
- KVRer
- 2 posts since 27 Nov, 2025
I am looking for an experienced DSP engineer to collaborate on the oversampling engine for a personal EQ plugin project of mine (JUCE/C++).
The task: Implement a IIR Allpass Polyphase Oversampling engine for the current EQ.
Project info:
Architecture: Cascaded IIR Allpass Polyphase structure (minimum-phase behaviour, no pre-ringing).
Factors: Support for 2x, 4x, 8x, and 16x (via cascading).
Quality: I need custom coefficient design (not just standard library values | MATLAB/SciPy verified). Aim around >140dB stopband attenuation and <0.001dB passband ripple.
Verification: Coefficients must be verified via MATLAB/SciPy scripts (which should be provided/documented).
Integration: Must be delivered as clean, modern C++20 compatible with a JUCE project. Potentially (to evaluate) SIMD optimization (SSE/AVX/NEON) as well.
Context: The plugin is inspired by discrete Class-A mastering equalizers: we are hence avoiding linear-phase FIR oversampling to preserve the natural transient response (no pre-ringing).
If you have experience designing high-order polyphase IIR filters and/or can deliver such an implementation, please DM me, thank you
The task: Implement a IIR Allpass Polyphase Oversampling engine for the current EQ.
Project info:
Architecture: Cascaded IIR Allpass Polyphase structure (minimum-phase behaviour, no pre-ringing).
Factors: Support for 2x, 4x, 8x, and 16x (via cascading).
Quality: I need custom coefficient design (not just standard library values | MATLAB/SciPy verified). Aim around >140dB stopband attenuation and <0.001dB passband ripple.
Verification: Coefficients must be verified via MATLAB/SciPy scripts (which should be provided/documented).
Integration: Must be delivered as clean, modern C++20 compatible with a JUCE project. Potentially (to evaluate) SIMD optimization (SSE/AVX/NEON) as well.
Context: The plugin is inspired by discrete Class-A mastering equalizers: we are hence avoiding linear-phase FIR oversampling to preserve the natural transient response (no pre-ringing).
If you have experience designing high-order polyphase IIR filters and/or can deliver such an implementation, please DM me, thank you
- KVRAF
- 16873 posts since 8 Mar, 2005 from Utrecht, Holland
- KVRAF
- 8511 posts since 12 Feb, 2006 from Helsinki, Finland
If I recall correctly there's a pretty straight-forward algorithm for computing these in some appnote(?) somewhere on the web, though I can't for the life of me remember what it might be called exactly.
Personally busy with other stuff, but just want to make two observations:
1. you can also convert FIRs into minimum-phase; whether it's a better design choice "depends" but it's not like FIRs need to necessarily be linear-phase only
2. it is actually minimum-phase designs that will smear transients, because what we hear as "transient" is the relative phase of different frequencies (which minimum-phase filters mess with even at fairly "low" frequencies) and not the pre-ringing that happens very close to Nyquist rate which is supposed to be inaudible anyway (and if it's not, then you got bigger problems)
Now, the minimum-phase smearing might not be audible if you just do a single pass of oversampling, but if I recall correct (having tested this a few years back) it's somewhere around 10-20 passes with a typical filter where it start to be somewhat obvious (well "obvious" might be pushing it, but point is you can pick it in ABX fairly reliably if you know what to listen to) as long as you've got decent studio monitors or headphones (and probably a lot faster in a mastering studio)... where as this is just not an issue with linear-phase at all as long as your ripple and transition specs are tight enough not to spoil an ABX.
ps. For things like EQs where the filter rings at audible frequencies, linear-phase pre-ringing is absolutely a thing to consider.. and "smearing" the phase with minimum-phase can even sound nicer too, but when it comes to transparent oversampling, linear-phase wins the context every time if latency isn't a concern.
Personally busy with other stuff, but just want to make two observations:
1. you can also convert FIRs into minimum-phase; whether it's a better design choice "depends" but it's not like FIRs need to necessarily be linear-phase only
2. it is actually minimum-phase designs that will smear transients, because what we hear as "transient" is the relative phase of different frequencies (which minimum-phase filters mess with even at fairly "low" frequencies) and not the pre-ringing that happens very close to Nyquist rate which is supposed to be inaudible anyway (and if it's not, then you got bigger problems)
Now, the minimum-phase smearing might not be audible if you just do a single pass of oversampling, but if I recall correct (having tested this a few years back) it's somewhere around 10-20 passes with a typical filter where it start to be somewhat obvious (well "obvious" might be pushing it, but point is you can pick it in ABX fairly reliably if you know what to listen to) as long as you've got decent studio monitors or headphones (and probably a lot faster in a mastering studio)... where as this is just not an issue with linear-phase at all as long as your ripple and transition specs are tight enough not to spoil an ABX.
ps. For things like EQs where the filter rings at audible frequencies, linear-phase pre-ringing is absolutely a thing to consider.. and "smearing" the phase with minimum-phase can even sound nicer too, but when it comes to transparent oversampling, linear-phase wins the context every time if latency isn't a concern.
-
Tone2 Synthesizers Tone2 Synthesizers https://www.kvraudio.com/forum/memberlist.php?mode=viewprofile&u=680600
- KVRian
- 591 posts since 18 Oct, 2023
I agree with mystan here.
FIR filters are quite efficient when cutoff is close to Nyquist. You can use the minimum phase version. This avoids pre-ringing and reduces latency.
This will result in audible artefacts. Too many cascaded IIR allpass filters get audible. Clicky sounds will transform to a laser-style "zapp" sound. Not sure if this is intended.Architecture: Cascaded IIR Allpass Polyphase structure...
Aim around >140dB stopband attenuation and <0.001dB passband ripple.
FIR filters are quite efficient when cutoff is close to Nyquist. You can use the minimum phase version. This avoids pre-ringing and reduces latency.
https://www.tone2.com
Our award-winning synthesizers offer true high-end sound quality.
Our award-winning synthesizers offer true high-end sound quality.
- KVRist
- 192 posts since 31 Oct, 2017
I have to ask, why aren't you using JUCE's inbuilt oversampling classes? I've used them in several commercial products. They're pretty reasonable.rick22 wrote: Thu Nov 27, 2025 4:15 pm I am looking for an experienced DSP engineer to collaborate on the oversampling engine for a personal EQ plugin project of mine (JUCE/C++).
The task: Implement a IIR Allpass Polyphase Oversampling engine for the current ...
- KVRian
- 1013 posts since 6 Aug, 2005 from England
I've just been looking at the Juce one, the cutoff is perfect. It is battle-tested, and the polyphase IIR isn't all that bad with 16x oversampling either, and very minimal latency and phase mess. You probably should just use Juce's.
*edit* although from simple looking at an impulse, the best settings a FIR is factor 2 which is 4 times oversampling. The other factors seem wrong to me, I'd be very surprised if they are incorrect though, I suppose.
*edit* although from simple looking at an impulse, the best settings a FIR is factor 2 which is 4 times oversampling. The other factors seem wrong to me, I'd be very surprised if they are incorrect though, I suppose.
Code: Select all
juceOversampler = std::make_unique <juce::dsp::Oversampling<float>>(2,2, juce::dsp::Oversampling<float>::filterHalfBandFIREquiripple, true, false);Dave Hoskins. http://www.quikquak.com
- KVRer
- 12 posts since 7 Mar, 2024
+1 on the JUCE built-in oversampling classes. Although, without relaxing the requirements you specified, the phase artefacts will probably be noticeable, and the transients likely won't be preserved.
