Volterra series convolution (i.e convolution of non-linear systems)

Hi, very general discussion here:

I’m looking into the feasibility of applying Volterra series style convolution to model a non-linear system (distortion) and I noticed there’s not a single JUCE thread on it. I believe it requires several impulse responses / convolutions, so I expect this will be very difficult to optimize for real-time to run on a normal CPU. Does anyone have any experience to share on this topic?

Currently digesting this lecture:


EDIT: To be clear it seems the company in the lecture has in fact achieved real-time Volterra convolution (at around 41 minutes), so I’m very curious how they managed to optimize this!


Well Volterra series can be seen as a generalisation of convolution for non linear systems. In theory, you can model any non linear system with them. In practice it’s almost impossible to use because you need to calculate and process a lot of “kernels” to get an accurate emulation of any heavily non linear system, which generates more than 3 harmonics. That’s the reason you will never ever find any heavily non linear system simulation in a plug-in using only Volterra kernels.

The most well known is Acustica Audio Nebula, and even if its techonology can in theory model a lot of different things, even with time-varying behaviour, it can’t be used at all for stuff like guitar amplifiers, distortion pedals etc. I know also that some plug-ins and products use a simplification of the Volterra series called Hammerstein, with only the diagonal kernels, but it removes most of the interesting original stuff in the model and can also be used only for weakly non linear systems. There are also a couple of articles from Thomas Hélie for example where the Volterra kernels are calculated explicitely to model things like synths ladder filters up to the third harmonics…

But honestly, my advice here would be to forget about this approach and to use more efficient non linear systems modeling techniques instead…


Hi Ivan,
Thank you so much for this detailed explanation!

I did some reading over the weekend to understand the math better and yeah, I would largely agree that it’s just not an efficient approach, unless I was an optimization wizard, or CPUs magically got 100x faster.

I think the best approach for me will be to use traditional digital saturation techniques, and to adjust them until it sounds as close to the analog unit as possible. There are other features in the plugin, so I definitely need to keep efficiency in mind.

This was very helpful, I hope others can learn from what you wrote!

1 Like