[music-dsp] Re: Waveshaping
aaron at hardwarehookups.com.au
Fri Oct 5 03:44:02 EDT 2007
I am by no means an expert on oversampling, but FWIW I recently
needed to upsample some stuff to between 4x and 16x from 'normal',
and I found that a simple linear interpol upsample followed by a
couple of passes through a bandpass (I wanted to remove DC also)
worked well (and more importantly in my case was easy to write from
first principles in C#).
I didn't need to downsample but I'd imagine the same would work well
in reverse - as someone else already suggested you can do the
bandpass first and then just throw away samples, using the linear
interpolation if you aren't doing a nice easy 'just throw away n-1of
every n samples'-type downsample.
I'm aware that there are far more advanced and accurate techniques,
but again this worked well from first principles without very much effort.
As for the technique you suggested yourself, I'm not sure if you're
applying that equation to create intermediate samples or simply using
that function to effectively create a smoothed waveform as your input
(you're just applying the shaping function in the same step, right?).
Either way, you'll probably find it works, but I've found that that
particular 'filter' function is too severe for working with sound
high in treble (e.g. a hihat sample) at 'normal' sample rates.
Which brings me to my next point. This all depends on the sample rate
you're working with to start with too - if you're working at 96 kHz
or higher I'd say forget about aliasing - since only a discontinuous
or 'extreme' shaping function would introduce aliasing to your
already fairly highly 'oversampled' data (which we will blatantly
assume is nicely bandlimited), and aliasing on the output can be
dealt with by the output stages of whatever it is you're doing.
Again, if you're working at 48 kHz or lower, I think that your
filtering will be a bit too severe for certain sounds, so I'd suggest
something a little less forceful, such as o[x] = f(0.9*i[x] + 0.1*o[x-1]).
One of the smart people on this list might tell you what the low-pass
cutoff and steepness of that transfer function is. :-D
Anything more complex than that and you may as well be working out
the coefficients for a 'proper' filter. Having said that I simply
ripped off some 2p filter psuedo-code from this list's archive. :-)
Hope this is helpful,
Aaron Oxford - aaron+hardwarehookups .com .au
Director, Innovative Computer Solutions (Aust) Pty. Ltd.
49 Maitland Rd, Mayfield, NSW 2304 Australia
Developer, SourceForge project VioLet Composer
More information about the music-dsp