Hacker News new | ask | show | jobs
by diydsp 1279 days ago
any indication of whether this introduces aliasing? which clipping alg is used?
3 comments

It does. Oversampling is the classic way to reduce that problem, but some newer techniques to mitigate hard clipping aliasing (or any transfer function aliasing) with GitHub repo examples here:

https://jatinchowdhury18.medium.com/practical-considerations...

Hey there, no aliasing in this case. As for the clipping, this is effectively just hard clipping like you'd see from two alternating diodes in series on an analog gain circuit.

Admittedly, I'm early into moving from analog circuits to digital signal processing, so I could be off the mark on my answer. :) Hope it helps, though.

When you clip in continuous time you're pushing additional energy into the harmonics of the baseband signal being clipped. Since spectra in continuous time is infinite, you don't get any aliasing (a better way to say it is that "aliasing" isn't as meaningful in continuous time)

When you clip in discrete time, the spectra is finite (more technically, it's periodic with a period of the sample rate frequency). That means the energy that would go into harmonics past nyquist gets "wrapped" around.

This is the big difference between analog and digital distortion. In analog, it's really quite difficult to create energy at non-harmonic frequencies of the signal. In digital clippers like you have here, it's trivial, and the design problem is figuring out how to deal with it. Most products will use some kind of anti-aliasing strategy (usually oversampling before clipping) to handle it.

Oversampling won't help with the brickwall clipping being attempted here.

This circuit is not a diode emulator, it's a comparator. It's the worst-sounding of all distortions. It sounds even worse in digital because of the aliasing.

And it will always alias, no matter how much you oversample it, because a vertical edge - aka "Heaviside Step Function" - has an infinite harmonic series. If you oversample it enough it won't alias much because the series terms become smaller. But they never disappear.

A better way to do this kind of clipping is with a tanh (logistic/s-curve) approximation. That can give you a variety of valve-like [1] smooth clipping curves. Unfortunately tanh is pretty expensive computationally, so a more practical alternative is a piecewise curve, perhaps with some interpolation.

Although if you only have 8-bit or 16-bit resolution you may as well just use a lookup table.

OP might want to consider learning a little more about signal theory and practical DSP before posting more how-tos.

[1] Not really because real valves are more complicated. But it will do for a first approximation.

I appreciate your feedback and sharing your knowledge! I'll definitely be digging more into some of the things your mentioned to get a better understanding. The topic is a super deep one–though my goal (at least at this point) is to stay high level enough so that anyone could get started in making their own sounds/effects.

The lower the barrier of entry, the more cool things that people can come up with! I'm hoping that more without a math/EE/audio background like myself can get started and explore some more of these deeper topics :)

It will help, though! Commercial products will use 4-16x oversampling internally. Most useful distortions will have infinite harmonic series, but the hard clipper is certainly one of the worst because of the high amount of total harmonic distortion (THD). There's a lot of energy in those upper harmonics.

The classic soft clipper is something like

    tanh(kx) / tanh(k)
which gives you a normalized output. It's not that expensive in the grand scheme of things, and is certainly cheaper than oversampling.

If you want something even more valve-like, a bit of DC bias to the signal before tanh will give you even order harmonic distortion, which sounds warmer (it beefs up the signal and puts energy into the octave harmonics, where as hard clippers usually only shove energy into the odd harmonics which sound harsher).

I'm sorry, but waveshaping absolutely introduces aliasing - and I was a bit disappointed to not see a section in that in the post.
Interesting, I was under the impression that aliasing was something on the presentation layer (e.g. plotting on an oscilloscope). Have some breadcrumbs/links to share that would be a good resource on understanding aliasing in your context? Would be excited to learn more!
Here's a fairly recent paper on techniques to reduce the aliasing: https://www.dafx.de/paper-archive/2016/dafxpapers/20-DAFx-16...
Take a sine wave below your system's Nyquist frequency. Chop off the top. Take the continuous Fourier transform. You will notice that there are now frequency components above the Nyquist limit of your system. Those will now be aliased down to lower frequencies.

One trick for doing nonlinear waveshaping without introducing too much aliasing is to perform the wave shaping at a higher sample rate than the rest of your system and then downsampling with a low pass filter. Thankfully, the high frequency components introduced by nonlinearity tend to decrease in magnitude reasonably quickly.

How would simple hard clipping cause aliasing?
In the analogue realm - or more correctly, in the continuous-time realm, because an analogue sample-and-hold will show the same issues, it doesn't. It just introduces more harmonics at high frequencies.

In the digital (or again more correctly discrete-time, you have a sample rate) realm it totally makes a difference, because many of the harmonics you generate will extend above the Nyquist frequency, half the sample rate, and "reflect" back down.

What I don't get is, isn't that an inevitability of working with a digital signal? That is, if you were to sample a signal that was clipped in continuous time, wouldn't you get the same pattern of samples than if had clipped the signal after sampling?
there's basically an illusion going on... we think we're working with individual points in time.... But because we're sampling, we're working with sinc() functions that have a specific shape to them.

So for example, one might think drawing a basic rectangle in time would create a pulse waveform... but in the digital domain a square wave has ripples in it. Recall that in the spectral domain, a rectangle is approximated by ever-higher and ever-smaller sinusoids to infinity... in sampled signals, though, only frequencies below Nyquist are available. So the sampled version of the waveform will have ripples that the highest frequency components would have completed. The requirement then is to work with a higher Nyquist/sampling frequency than audible so that audible part of the square is correct.

No. Imagine the simplest possible case, a naive sawtooth wave. An easy way to do this in a microprocessor is to count samples, and let's say we have an 8-bit counter that goes from 0 to 255, one count per sample. This then feeds a DAC and we get a sawtooth wave out.

From 0 to 1, 1 to to, 127 to 128, 254 to 255, nothing surprising happens, the output voltage slowly rises. When the counter rolls over from 255 to 0, something surprising *does* happen though, we get a massive and instant negative-going spike.

Because this jump from 255 to 0 is instant, it has to have a lot of harmonics, up into high frequencies. If you plot the spectrum of a sawtooth wave you'll see that there's a sine wave at every harmonic, reducing in amplitude as 1/f - that is, the first one at full level, the second harmonic, twice the frequency, and at half level, 3rd at 1/3, 4th at 1/4 and so on.

Now here's your problem - some of those harmonics, which extend off to infinity, are going to be beyond the Nyquist frequency. As you increase the frequency of the sawtooth relative to the sample rate, you'll start to creep into an area where those harmonics are actually still quite loud compared to the lower ones, and that gives you a problem.

Aliasing occurs because those harmonics "reflect" off the Nyquist frequency. Think about watching a Western, where the wagon wheels appear to spin backwards at certain speeds - they are aliasing. If they were turning slowly they'd move a little before the next frame, but at some point - where one spoke moves exactly into the space left by the previous spoke - they will appear to stand perfectly still! With a bit of thought, you'll see that the fastest the wheel can go puts the spoke exactly in the middle of the gap between spokes in the previous frame, and any faster will make it look like it's going backwards.

This is exactly what's happening with aliasing. The sinewave that's just above half your sampling rate is coming back down towards you, backwards. What goes up must come down.

In a real-life analogue sawtooth oscillator this is of course a huge problem because that big negative-going spike has infinite energy, and we're lucky that it's also infinitely short because anything that requires infinite energy is going to have terrible battery life. In practice, the maximum frequency of the harmonics in the sawtooth are limited by other parameters in the circuit (mostly how quickly the capacitor discharges through the reset transistor). And herein lies our major clue.

In order to generate a sawtooth that doesn't alias, we must calculate that step so it is no longer infinitely fast. There are a bunch of ways we can do this, but a nice simple way is to calculate an amount to "correct" the sample just before and just after the step so that you've got a rough approximation of passing the signal spectrally through your sinc window. This is crude but effective, and can be done with a couple of adds and multiplies making it ideal for real-time computation on even fairly crappy chips.

You can actually generate a sinc wavelet and "paste" that over the step, and when you get that right it sounds perfect. If you've got a fairly chunky DSP or general-purpose CPU with good math support to play with, this will give best results.

It's important to note that if you take a sinewave and clip it, then sample it, you'll still get aliasing because you'll still have a big infinitely fast step somewhere, which is why audio equipment is so big on having steep lowpass filters before and after digital (or, sampled, at least) bits. A great example is in the resolutely analogue Roland Juno 106, where the chorus board has three 24dB/octave Butterworth filters at around 10kHz, realised as cascaded pairs of Sallen-Key filters. The first rips off any signal above about 12kHz so it cannot be passed to the chorus chip, the second two pairs are "reconstruction filters" to remove fizzy-sounding sampled steps which would be apparent as a swooshing sound as the chorus went through the "long" end of its delay.

The reason they need this is that the analogue "Bucket Brigade Delay" chips are a kind of analogue dynamic RAM, where on every clock pulse a capacitor charges up from the input to its left, and on the next discharges into the output on its right. Stick a few hundred of these capacitors together and it will "pass buckets of signal" down the line, delaying it by whatever the clock rate is divided by the number of buckets. It's all analogue, but it's still sampling!

Clipping adds high-frequency components.
Take the fourier transform of a clipped signal - it will have high frequency components.

In general, the more pointy edges you introduce to a waveform, the more high frequency artifacts you get.

This aspect of pontryagin duality (narrow in one domain means wide in the other) is also what underlies the heisenberg uncertainty principle. If you "hard clip" a photon's position (with a slit) you get a lot of frequency domain (momentum) noise, leading to a spread-out beam.

Why isn't there any aliasing? You're flattening off the peaks of the signal which absolutely must generate more harmonics, and at some point those are going to extend far beyond Nyquist.

I don't see you doing anything in particular to bandlimit your waveshaping, but I might well have missed it.

Does it matter? This is for distortion/noise, like in music.

Nobody using clipping as an effect in their music cares if a fuzz/distortion/overdrive effect is less than pristine from an audiophile standpoint.

Audiophiles would throw up if they realized exactly what's going on in a guitar rig.

Yes, it matters a lot. A mild amount of low aliased crunch sounds very different from a mild amount of very aliased distortion, and people pay a bunch of money for software that sounds good.

Audiophiles also drop a lot of money on gear that intentionally distorts the signal. Aliasing is one reason why they buy tube amplifiers instead of tube modelers in their receivers, although I don't doubt the latter exists.

I play electric guitar.. I really doubt what you're saying.

I'd bet I could ask 10 other people who play guitar and none of them even know what aliasing is.

And none would be able to talk intelligently about what it means and what sounds good when thinking about a transistor distorting, an op-amp distorting, diode or LED clipping, a tube causing clipping/distortion, or a digital algorithm clipping. Most just try something and fiddle with the knobs, decide whether it sounds good or not, and move on with trying to figure out what music to create.

I actually find the stuff that gives more options around clipping tends to just be annoying. I prefer the designer to just pick the best sounding one and just go with that. Pretty much every time I've had an effect that offered a clipping switch or rotary dial one sounds the best, it takes a couple minutes to decide, after that I just wish the designer had left only that best one in the product without a switch.

I'd kind of argue intentional aliasing as a purposeful strategy to get a unique sound is probably something that has been overlooked. I guess "bit crushing" counts and that is somewhat common though.

Audiophiles are a whole different thing. I love tubes for playing guitar where everything is very non-audiophile but it's still really hard to wrap my head around it for audio reproduction.

I agree with a lot of what you’re saying here. But there are two opposing points: if you doubt that removing aliasing would matter, then you can’t also hold that aliasing on purpose is an overlooked effect idea!

I have been doing tons of anti-aliasing and saturation DSP lately and agree you mostly should be picking a vibe and sticking to it as a DSP sound designer. However the hell that comes together in the math is irrelevant, as long as the minimal set of controls you provide to the musician are fun to tweak and you’re not delivering an airplane cockpit.

There is a lot of marketing blather about analog this legendary that but at the end of the day, a unique sound that is fun for musicians to “play” or intuitively useful for the tradespeople (mixers, mastering engineers, trackers) to use is all that matters!

This is something that designers know and care about, and translates into "this box/plugin sounds good" vs "this box/plugin sounds bad" when hearing reviews or asking the dude at guitar center what to try out.

For example, if you were comparing AxeFX, Kemper, or Line6 Pod none of this would be on the labeling, but it's deeply tied to how they were designed.

For sure and I'd imagine these have to be designed with pretty high sampling rates internally to make sure they don't introduce too many artifacts and sampling issues.

But beyond musicians being able to hear what they like and don't like I don't think anybody understands what is going on. It's quite possible aliasing is part of "sounds digital" when a musician uses that as a pejorative... newer digital processing sounds less digital through better algorithms and likely things like better handling of aliasing.

Most distortion effects aim to add frequencies that are harmonics of the incoming signal. DSP, with a finite sample rate, can add frequencies that are not harmonics of the incoming signal, unless care is taken to avoid this.