Page 1 of 2

Clean Rate Reducer help

Posted: Sat Oct 25, 2014 1:52 pm
by adamszabo
Hey guys!

I am trying to create a sample rate reducer effect, but I am having a bit if trouble so I thought I'd ask here if anybody could help out.

So basically I would like to make a clean sample rate reducer or also known as decimator. Basically it samples and holds the signal and creates hard edges. Now once the signal is aliased or "square-ized" it aliases even more creating lots of noise and it sounds horrible. Do not confuse this with a bitcrusher, there, noise is expected and wanted, here not so much. I have compared several sources to see how they sounds like and SM is the worst :( . Sylenth1 has some reduced noise, and Reaktor 5 is the cleanest. Unfortunately they use a simple quantize module in reaktor and I cannot see inside the module how did did it.

I have made an image showing the different results from a simple sine wave, and decimation added.

Image

I have tried upsampling the rate reducer, but made no difference. I guess I have to do another method to get rid of the aliasing. Does anyone have any info on how to make it cleaner? I have attached the rate reducer I currently have.

Thank you in advance!

Re: Clean Rate Reducer help

Posted: Sat Oct 25, 2014 9:23 pm
by KG_is_back
From what I can tell, changing when sample rate down you need to lowpass the signal first so no aliasing happens. When changing the sample rate back up,you just need to interpolate the values (usually done by lowpass filter and zero stuffed signal).
The signal at any sample rate IS NOT STAIRS. When signal is reconstructed, a curve is being drawn to connect the sample points and the curve can contain only frequencies below Nyquist. In theory When you downsample and upsample back only difference should be that the new signal should be lowpassed.

I'm not really sure of what effect you are after actually.

Re: Clean Rate Reducer help

Posted: Mon Oct 27, 2014 10:53 am
by adamszabo
Thank you for the answer KG but I think you might have misunderstood my question. I dont want to resample a signal, but instead create an effect which makes it sounds like its downsampled. So If I have a sine wave, I can make it look like this:

Image

Now because of the hard edgesI think you will get aliasing distortion, and that is what I would like to remove, so I get a cleaner signal.

Re: Clean Rate Reducer help

Posted: Mon Oct 27, 2014 12:18 pm
by KG_is_back
The oversampling should deal with the aliasing then... probably higher than 2x... I'd go with 8. Another thing is how to archive subsample precision with the"sample and hold" thing. You know, when you try to downsample 2.5x currently your schematic would produce 2-3-2-3 sample long segments.

EDIT: I've just tried it with the oversampling and it simply removes the stairs completely. basically recreating the original sine wave.

Re: Clean Rate Reducer help

Posted: Mon Oct 27, 2014 5:23 pm
by tulamide
It's the first time that I hear the term decimator. But Wikipedia is surprisingly deep explaining what type of filter has to be used. Unfortunately I have no skills at all in filter design, but people like martin and others have proven many times their talents. So maybe you should ask them for a FS Example of the Wikipedia descriptions?

http://en.wikipedia.org/wiki/Decimation_%28signal_processing%29

Re: Clean Rate Reducer help

Posted: Mon Oct 27, 2014 8:21 pm
by adamszabo
Thank you for the tip, I have seen that link, but unfortunately that math is a bit too abstract for me. But looking at it, I dont think it has so much to do with my problem :(

Re: Clean Rate Reducer help

Posted: Mon Oct 27, 2014 9:38 pm
by KG_is_back
adamszabo wrote:Thank you for the tip, I have seen that link, but unfortunately that math is a bit too abstract for me. But looking at it, I dont think it has so much to do with my problem :(


Wikipedia says basically what I've said. To downsample a signal you have to lowpass it with sharp lowpass filter with cutoff at 1/M where M is the downsampling factor ( for example 2 when 44100->22050). And the downsampled signal can then simply by sampled without aliasing. However, this means you convert a sine wave into another sine wave, just with lower samplerate. The thing you are trying to do is downsample and upsample back for special "stairs"-like effect which emerges, when you use a really cheap upsampler. If you'd use perfect downsampler and upsampler you'd simply get the original wave (only lowpassed by the antialiasing filter). The stairs effect emerges, when you upsample by sample&hold method which is a very cheap way to do it (the stairs are in fact aliasing). If you remove the aliasing, there will be no stairs anymore. So the thing you might be looking for is some kind of "smoothing" which will not be perfect anti-aliasing.

Try lowpass filter before and after the decimator you already have. with the cutoff set to 1/M.

Re: Clean Rate Reducer help

Posted: Mon Oct 27, 2014 10:58 pm
by adamszabo
Ok I have added a filter before and after the decimator. Nothing happened except the last lowpass filtered the whole signal. But I think we are not on the same page. The wikipedia is talking about REAL down and upsampling. However I am not up or downsampling anything. I am just making an effect which makes the wave look like it was downsampled. So the decimator code is simply a ramp that goes from 0-1 and when it reaches 1 it sends out a trigger to hold the sample until the counter reaches 1 again. The speed of this counter can be adjusted. The slower the counter, the longer the samples will be held and the signal will look like a square more and more.

So now that we sample and hold the signal, the overtones that have been created are causing aliasing, and the problem lies in how to remove them. There is no point in putting a filter before the decimator because if you filter a sine wave you will just make it have lower volume since its only 1 frequency.

Re: Clean Rate Reducer help

Posted: Mon Oct 27, 2014 11:06 pm
by martinvicanek
From the top of my head because I'm traveling:

As KG says, you usually use lowpass filters before downsampling (decimation) and for upsampling (reconstruction or interpolation). However, this would simply result in a lowpass filter effect overall. This is not what the spectra in Adam's original post show.

To me all three spectra show aliasing from reconstruction. The difference is that in the first two spectra, aliasing exceeds Nyquist and folds back, whereas in Reaktor 5 it does not. So the trick is to bandlimit the reconstruction to frequencies below Nyquist. I think that this will only be necessary if M is not an integer, though.

You don't want aliasing in the decimation stage, so lowpass with cutoff=Nyquist/M before decimation.

Re: Clean Rate Reducer help

Posted: Mon Oct 27, 2014 11:41 pm
by tulamide
martinvicanek wrote:You don't want aliasing in the decimation stage, so lowpass with cutoff=Nyquist/M before decimation.

I think that's basically it. At 44100 Hz Nyquist equals 22050 Hz. With a decimation factor of M = 2, cutoff = 11025. Now the wiki says: "The anti-aliasing filter that can ensure the condition is met has a cutoff frequency less than 1/M times the Nyquist frequency. (Realizable low-pass filters have a "skirt", where the response diminishes from near one to near zero. So in practice the cutoff frequency is placed far enough below the theoretical cutoff that the filter's skirt is contained below the theoretical cutoff.)"
1/M * Nyquist in our case would be 1/2 * Nyquist = 11025. I don't know how much 'skirt' there is on the available filters on these forums (I don't even know what is meant by that :lol: ), but at least one could test by partially lowering the cutoff starting from Nyquist/M until condition is met.