Old 04-02-2016, 12:09 AM   #1
SaulT
Human being with feelings
 
Join Date: Oct 2013
Location: Seattle, WA
Posts: 876
Default new oversampling library

This is my third or fourth attempt at an oversampling library. This time around I'm basing it off of Tale's oversampling library, copying his syntax so it's a drop-in replacement. If you've used his, then all you have to do put the file in your JS directory (do you have a Sault folder? lol) is replace "oversampler.jsfx-inc" with "st-oversampler.jsfx-inc" and it's done.

So I graphed out the response of the coefficients that Tale used and while they work and it's computationally cheap, the end result isn't really robust enough to use with distortion. After a bit of time spent with Matlab I've gone from a 6th order to an 18th order, and the results look much better.



The roll-off doesn't start until about 16 kHz, so your top end is preserved, even with high amounts of oversampling (8x and higher).

Big thanks to Tale for the code which this is based upon. At some point I'll give my plugin collection a thorough update, but until then probably the easiest would be to just download the Wuff plugin and check it out in action.

https://stash.reaper.fm/v/26656/wuff.zip

Last edited by SaulT; 04-02-2016 at 12:55 PM. Reason: grumble grumble
SaulT is offline   Reply With Quote
Old 04-02-2016, 03:24 AM   #2
Tale
Human being with feelings
 
Tale's Avatar
 
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,645
Default

Cool, thanks for sharing.

Some nitpicks/minor fixes (untested):
  • "My" FIR filter is 7-tap i.e. 6th order, not 8th order.
  • os_up2(): You can remove x10 (x only goes up to 9).
  • os_up2(): You scale by 4, but shouldn't that be 2 (or rather: 1/(sum_of_coeffs - center_coeff) = 1.9992003198720512)?
  • os_down2(): You do 0.5*y11, but I think this should be 0.5*y9.
  • os_reset2(): Again there is no x10, and you don't really need to reset x9.
  • os_reset2(): You do need to reset all y except y18 and y 17.
Tale is online now   Reply With Quote
Old 04-02-2016, 01:06 PM   #3
SaulT
Human being with feelings
 
Join Date: Oct 2013
Location: Seattle, WA
Posts: 876
Default

That's what I get for doing my coding late at night. Thanks for catching the bugs, Tale, and as always thanks for writing good code.

I get really frustrated sometimes looking at different code and literature on the subject because I have come across some sources that say that 7th tap is 6th order, and a few that call it 8th order. I think 6th order is correct, but damn, it gets confusing.

My assumption has been that interpolation lowers the average signal level, requiring a multiplier by that amount. So, a 2x interpolator requires a multiplier of 2 to keep the signal levels constant. You can work that into the coefficients (so that the sum of the coefficients equals 2) or you can have the multiplier up front and keep those same coefficients for use in both interpolation and decimation.

I'm still learning. Fascinating subject, unfortunately I'm really having to dig through a lot and try to teach myself how it all works. I appreciate your feedback, as always.

Last edited by SaulT; 04-02-2016 at 08:28 PM.
SaulT is offline   Reply With Quote
Old 04-03-2016, 03:04 AM   #4
Tale
Human being with feelings
 
Tale's Avatar
 
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,645
Default

Quote:
Originally Posted by SaulT View Post
I get really frustrated sometimes looking at different code and literature on the subject because I have come across some sources that say that 7th tap is 6th order, and a few that call it 8th order. I think 6th order is correct, but damn, it gets confusing.
I just looked it up here, so I might be wrong. However, there seems to be logic in this, because the smallest FIR filter has 2 taps (with 1 tap it would just be a scaler, not a filter). Now, I think the lowest filter order 1, so I guess that is why a 2-tap FIR is 1st order (and from that a Nth-tap FIR is (N-1) order). I don't know if this really true though...

Quote:
Originally Posted by SaulT View Post
My assumption has been that interpolation lowers the average signal level, requiring a multiplier by that amount. So, a 2x interpolator requires a multiplier of 2 to keep the signal levels constant. You can work that into the coefficients (so that the sum of the coefficients equals 2) or you can have the multiplier up front and keep those same coefficients for use in both interpolation and decimation.
Yeah, that sounds about right, except that the sum of the coefficients usually is slightly over 1, so for ultra precision you need to compensate so the outcome is exactly 1. I don't think you will want to pre-scale your coefficients, because you only need to scale when upsampling an 1x signal, but not when downsampling a signal that was already 2x.

Quote:
Originally Posted by SaulT View Post
I'm still learning. Fascinating subject, unfortunately I'm really having to dig through a lot and try to teach myself how it all works. I appreciate your feedback, as always.
Yeah, me too.

BTW, I also have some coefficients for an 11-tap Kaiser-Bessel FIR which I calculated using C++ (no MATLAB for me). It is marginally better then the 7-tap FIR, but almost certainly not as good as your 18th order filter. In the end I decided that the 7-tap FIR is good enough for JSFX.
Tale is online now   Reply With Quote
Old 01-24-2021, 12:16 PM   #5
DeBased
Human being with feelings
 
DeBased's Avatar
 
Join Date: Jun 2010
Location: UK
Posts: 412
Default

Hey, I just tried @SaulT's OS code while prototyping Airwindows' style non-linear summing, and found that os_down2()'s output was half of Tale's. Simply enclosing the filter calculation in brackets and adding * 2 fixed it.

Thanks for both of your code guys.
__________________
Reaper5, Win10Pro, Ryzen 5950x/64GB, RME UFX/BabyFace Pro, Behringer X-Touch
- my true 'global' (project-tab independent) Send/Receive FX
- my Behringer X-touch mods + XCtrl mode for CSI (coloured scribble strips!)
DeBased is offline   Reply With Quote
Old 01-25-2021, 01:26 AM   #6
Tale
Human being with feelings
 
Tale's Avatar
 
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,645
Default

FWIW: A while ago I changed the internal coefficients, so for each step (up, down, or both) the gain should remain the same.
Tale is online now   Reply With Quote
Old 01-26-2021, 09:07 AM   #7
DeBased
Human being with feelings
 
DeBased's Avatar
 
Join Date: Jun 2010
Location: UK
Posts: 412
Default

Bit confused about the graph. What sample rate does it show?

And why are the deepest cuts at very different places in the spectrum? How does this actually affect high-end you want to preserve in the downsample, and frequency content above Nyquist (that would cause aliasing) you want to strip out?
__________________
Reaper5, Win10Pro, Ryzen 5950x/64GB, RME UFX/BabyFace Pro, Behringer X-Touch
- my true 'global' (project-tab independent) Send/Receive FX
- my Behringer X-touch mods + XCtrl mode for CSI (coloured scribble strips!)
DeBased is offline   Reply With Quote
Old 02-01-2021, 10:16 PM   #8
SaulT
Human being with feelings
 
Join Date: Oct 2013
Location: Seattle, WA
Posts: 876
Default

I'm assuming I plotted this out showing 44.1 kHz at 2x, so 88.2 kHz.

Tale's code was from oversampler.jsfx-inc
my current version of it is from st-oversampler.jsfx-inc


I based my code syntax on Tale's, should be able to check the plugins i've uploaded for examples on how to use it. I've got code for 2x, 4x, and 8x. At one point I created minimum phase versions of them, too. There's some redundant and unused code in there, at one point I was looking at doing hybrid interpolation and some other stuff, it ended up just being easier to add a few more taps.

Tale writes good code, I learned a lot by reading it, I took what he did and extended it.
SaulT is offline   Reply With Quote
Old 02-01-2021, 10:36 PM   #9
SaulT
Human being with feelings
 
Join Date: Oct 2013
Location: Seattle, WA
Posts: 876
Default

Quote:
And why are the deepest cuts at very different places in the spectrum? How does this actually affect high-end you want to preserve in the downsample, and frequency content above Nyquist (that would cause aliasing) you want to strip out?
Oh yeah, actually answer the question.

The graph shows attenuation. The more frequencies above NyQuist are attenuated the less aliasing there will be once it gets downsampled. The point is basically that the more taps you use, the more attenuation you get. Usually the ideal is to capture as much top-end content as possible *below* NyQuist and filter out as much as possible *above* NyQuist.

(I do flip this idea on it's head a little, at one point I put out a "lo-fi" oversampler that I was pretty happy with...)

15 dB of attenuation isn't a lot, but if your process isn't very nonlinear and you aren't generating much in the way of higher order harmonics then maybe it's not a big difference. More attenuation can make a difference as the nonlinearity increases.

It's all a trade-off. Attenuation versus group delay versus oversampling factor versus linear or minimum phase versus blah blah blah.
SaulT is offline   Reply With Quote
Old 02-02-2021, 03:05 AM   #10
DeBased
Human being with feelings
 
DeBased's Avatar
 
Join Date: Jun 2010
Location: UK
Posts: 412
Default

What confuses me about the graph (and correct me if I'm missing something) is that Tale's filter is cutting everything above 44.1k. That would make sense when downsampling from 176.4k -> 88.2 (Nyquist @ 88.2 = 44.1k).

But in the graph, your filter seems to cut everything above 30k, which is way below Nyquist in that scenario.

If we assume the next downsample, 88.2k -> 44.1k, Tale's would cut above 22.05k (good), but yours would cut above 15k, losing top end.

Unless I'm misunderstanding the graph or filter, you normallly want an AA filter to be as steep as possible near Nyquist?

(I appreciate it's a balance of tradeoffs, but the cut should happen close to Nyquist right?)
__________________
Reaper5, Win10Pro, Ryzen 5950x/64GB, RME UFX/BabyFace Pro, Behringer X-Touch
- my true 'global' (project-tab independent) Send/Receive FX
- my Behringer X-touch mods + XCtrl mode for CSI (coloured scribble strips!)

Last edited by DeBased; 02-02-2021 at 03:11 AM.
DeBased is offline   Reply With Quote
Old 02-02-2021, 03:15 PM   #11
SaulT
Human being with feelings
 
Join Date: Oct 2013
Location: Seattle, WA
Posts: 876
Default

You're asking a really good question here. There were a lot of design questions that went into this.

Scenario - I am designing for a 44.1 kHz samplerate. My plugin requires oversampling, and I've decided that 2x is fine. I know that I will need to upsample and downsample. I want to keep this filter as general purpose as possible.

I want to keep latency low, so either I need to go with minimum phase or linear phase with low number of taps. I decide that some applications will not want minimum phase, so I will choose linear phase and will try to keep the number of taps low.

I need to generate coefficients. I realize that Tale's method uses Nyquist filter, aka Lth filter where L=2, aka half-band. Now, I can roll my own coefficients, but using this technique creates a lot of zeroes and that represents computational savings. So we'll do that.

The downside of using the L-th filter coefficient method is that attenuation is only -6 dB at Nyquist. Do you see where Tale's filter and mine cross? That is the pivot point. No matter how many taps I use, that spot will remain the same. I realize that I need to increase the number of taps from Tale's 7.

I didn't really think about latency at this point, but each sample of latency is 0.022 ms of delay so I would want to use the smallest number I can to keep that overall latency low for those that might want to use it in a live application. When designing the 4x version I chose to use the highest number of taps that I could that would still keep the latency below 1 millisecond, btw.

Next question was that of attenuation and frequency response. I think that my decision at this point was to simply pick the number of taps that would start the roll-off process above 15 kHz. Why 15 kHz? Something about most people can't hear anything above 15 kHz, it was a design decision.

So I bumped up the number of taps until roll-off didn't happen until above 15 kHz at a 44.1 kHz samplerate.


7 taps = <0.2 mS of latency, very little attenuation and audible loss of treble at 10 kHz
19 taps = <0.5 mS of latency, significantly more attenuation and no loss of treble below 15 kHz

That's a lot of words to describe the design process here, but I tried to be intentional at each step of the way.
SaulT is offline   Reply With Quote
Old 02-03-2021, 05:19 AM   #12
DeBased
Human being with feelings
 
DeBased's Avatar
 
Join Date: Jun 2010
Location: UK
Posts: 412
Default

thanks for the detailed reply. I'm a programmer myself, I haven't designed filters but I plan to, so this is very useful.

I still don't get it though. AA filters used in resamplers for example are typically very steep right by Nyquist, way way steeper than either of your filters.

Examples (from https://src.infinitewave.ca):

SOX 14.4 (High Quality):



SOX 14.4 (VHQ Linear Phase):



Are you saying that to get low latency & CPU perf, you have to have a massive transition band, that only gives minimal aliasing attenuation? If so I will look into designing a more 'resampler' like filter, at the cost of extra latency/perf.

Or are filters used for oversampling necessarily different in some way?
__________________
Reaper5, Win10Pro, Ryzen 5950x/64GB, RME UFX/BabyFace Pro, Behringer X-Touch
- my true 'global' (project-tab independent) Send/Receive FX
- my Behringer X-touch mods + XCtrl mode for CSI (coloured scribble strips!)
DeBased is offline   Reply With Quote
Old 02-03-2021, 05:33 AM   #13
DeBased
Human being with feelings
 
DeBased's Avatar
 
Join Date: Jun 2010
Location: UK
Posts: 412
Default

.. I'm guessing these filters use a lot of taps = higher latency & CPU, right?
__________________
Reaper5, Win10Pro, Ryzen 5950x/64GB, RME UFX/BabyFace Pro, Behringer X-Touch
- my true 'global' (project-tab independent) Send/Receive FX
- my Behringer X-touch mods + XCtrl mode for CSI (coloured scribble strips!)
DeBased is offline   Reply With Quote
Old 02-03-2021, 07:35 AM   #14
Tale
Human being with feelings
 
Tale's Avatar
 
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,645
Default

Quote:
Originally Posted by DeBased View Post
.. I'm guessing these filters use a lot of taps = higher latency & CPU, right?
Yeah, probably something like 512 taps or more.
Tale is online now   Reply With Quote
Old 02-03-2021, 08:01 AM   #15
DeBased
Human being with feelings
 
DeBased's Avatar
 
Join Date: Jun 2010
Location: UK
Posts: 412
Default

right, I'm in the middle of playing with an online filter designer (https://www.micromodeler.com/dsp/#) and I can see the tradeoffs now.

OK the hard question, are both your filters really that useful then? On paper the aliasing suppression is minimal which seems to defeat the point of oversampling?
__________________
Reaper5, Win10Pro, Ryzen 5950x/64GB, RME UFX/BabyFace Pro, Behringer X-Touch
- my true 'global' (project-tab independent) Send/Receive FX
- my Behringer X-touch mods + XCtrl mode for CSI (coloured scribble strips!)
DeBased is offline   Reply With Quote
Old 02-03-2021, 10:02 AM   #16
Tale
Human being with feelings
 
Tale's Avatar
 
Join Date: Jul 2008
Location: The Netherlands
Posts: 3,645
Default

Well, listen to the attached audio sample (it's rather loud, so beware!). First you hear a sine wave through my tube_amp (with drive at 48 dB) without oversampling, and then with 2x oversampling. The oversampled one still isn't exactly clean, but it's already much better than without oversampling (IMHO/YMMV).
Attached Files
File Type: zip aa.zip (58.4 KB, 65 views)
Tale is online now   Reply With Quote
Old 02-03-2021, 01:38 PM   #17
DeBased
Human being with feelings
 
DeBased's Avatar
 
Join Date: Jun 2010
Location: UK
Posts: 412
Default

yes that's impressive. so I guess it depends on the application and what you're feeding it. but perhaps a general-purpose solution could use a stronger filter?

I had a play with that filter designer. Of course I'm a newb (so let me know if you see issues), but this 117 tap FIR seems pretty good - rolloff starts at 19k, and is down ~66db at Nyquist. A tiny ripple at the top, but doesn't seem significant (to my inexperienced eyes ):




Do you think ~66db attenuation is sufficient for a high quality filter?

Will play more to see if I can get a lower tap no. and still decent performance.
Attached Images
File Type: gif 117 taps.gif (44.6 KB, 482 views)
__________________
Reaper5, Win10Pro, Ryzen 5950x/64GB, RME UFX/BabyFace Pro, Behringer X-Touch
- my true 'global' (project-tab independent) Send/Receive FX
- my Behringer X-touch mods + XCtrl mode for CSI (coloured scribble strips!)

Last edited by DeBased; 02-03-2021 at 01:46 PM.
DeBased is offline   Reply With Quote
Old 02-03-2021, 01:54 PM   #18
DeBased
Human being with feelings
 
DeBased's Avatar
 
Join Date: Jun 2010
Location: UK
Posts: 412
Default

.. obviously performance inside JS is an issue. Reaper should really expose oversampling in JS using optimized/vectorised native code. feature req.
__________________
Reaper5, Win10Pro, Ryzen 5950x/64GB, RME UFX/BabyFace Pro, Behringer X-Touch
- my true 'global' (project-tab independent) Send/Receive FX
- my Behringer X-touch mods + XCtrl mode for CSI (coloured scribble strips!)
DeBased is offline   Reply With Quote
Old 02-03-2021, 02:51 PM   #19
sai'ke
Human being with feelings
 
sai'ke's Avatar
 
Join Date: Aug 2009
Location: NL
Posts: 1,453
Default

When going with FIRs, don't discount simple windowed sincs too quickly. When upsampling, you often need only a very small subset of the coefficients, since a lot of the samples are zero (since you zero stuffed) and for integer multiples of the samplerate, many of the coefficients are also zero. Just use a different small filter for each sample essentially (polyphase filtering).

For downsampling many of the coefficients are zero if the cutoff of the sinc is an integer fraction of the samplerate. Also, the filter is symmetric, so that means that you can save half the multiplies (by adding the two samples together prior to the mul).

I usually generate the jsfx code to do this stuff. The code is trash (it was throw-away code and I don't have time to clean it up right now), but it produces workable jsfx code: https://pastebin.com/m3bce8Q9

Note that to omit the zeros, you have to change
Code:
if np.abs(H[i]) > 0:#1e-7:
to
Code:
if np.abs(H[i]) > 1e-7:
I would also like to have a built in solution, but it's probably not a very high priority.
__________________
[Tracker Plugin: Thread|Github|Reapack] | [Routing Plugin: Thread|Reapack] | [More JSFX: Thread|Descriptions|Reapack]
sai'ke is offline   Reply With Quote
Old 02-03-2021, 03:27 PM   #20
DeBased
Human being with feelings
 
DeBased's Avatar
 
Join Date: Jun 2010
Location: UK
Posts: 412
Default

cool thanks, now reading up on windowed-sinc filters. how wide is the transition band for AA purposes?


BTW, here's a thought - does it make more sense (aliasing reduction vs CPU perf wise) to use 2x oversampling with an expensive high-tap filter, or 4x(+) with the low-tap JS filters here?

obviously it depends if you overshoot the aliasing headroom of the upsampled rate, and also how much processing you do to the upsampled audio (but of course higher upsampling also means proportionally more expensive processing).
__________________
Reaper5, Win10Pro, Ryzen 5950x/64GB, RME UFX/BabyFace Pro, Behringer X-Touch
- my true 'global' (project-tab independent) Send/Receive FX
- my Behringer X-touch mods + XCtrl mode for CSI (coloured scribble strips!)

Last edited by DeBased; 02-03-2021 at 04:46 PM.
DeBased is offline   Reply With Quote
Old 02-03-2021, 04:39 PM   #21
sai'ke
Human being with feelings
 
sai'ke's Avatar
 
Join Date: Aug 2009
Location: NL
Posts: 1,453
Default

Quote:
Originally Posted by DeBased View Post
cool thanks, now reading up on windowed-sinc filters. how wide is the transition band for AA purposes?
Probably not as tight as your optimized ones. Here's a little applet you can play with to experiment a bit: http://arc.id.au/FilterDesign.html

Quote:
Originally Posted by DeBased View Post
BTW, here's a thought - does it make more sense (aliasing reduction vs CPU perf wise) to use 2x oversampling with an expensive high-tap filter, or 4x(+) with a the low-tap JS filters here?
Good question. I'm not sure. Probably depends on the use case a lot. If you do really heavy distortion, you may want higher up-sampling rates. If you do mild distortion on content with a lot of high frequencies, you'd probably want lower upsampling rate but a steeper filter. I'd probably go for the better filter in most cases, but maybe someone with more experience can chime in.

It's probably best to try different designs and typical input signals for whatever you are working on. And deciding beforehand how good is good enough. Because this rabbit hole goes very deep and in the end, you probably want to be making something other than an oversampling filter library.

Just one last addition to muddy the waters, if it's a static waveshaper (not a nonlinearity inside a filter), there's an additional method you can use named Continuous-Time Convolution: http://www.dafx.de/paper-archive/201...aper_41-PN.pdf. It works really well in combination with 2x upsampling. Note though that the group delay of the simple form of that is annoying (group delay is 0.5). Depending on your function the first order may be simple though . It also has some other annoying numerical properties though. But if you're interested in this, there's a thread where we discussed this somewhere on this forum, where the numerical issues were discussed and pragmatically resolved.
__________________
[Tracker Plugin: Thread|Github|Reapack] | [Routing Plugin: Thread|Reapack] | [More JSFX: Thread|Descriptions|Reapack]
sai'ke is offline   Reply With Quote
Old 02-03-2021, 04:44 PM   #22
DeBased
Human being with feelings
 
DeBased's Avatar
 
Join Date: Jun 2010
Location: UK
Posts: 412
Default

wow, thanks again, more to read . like everything, the devil is truly in the details.

you're right, for a generic library a simple high quality filter makes sense, but when squeezing the most performance for a specific effect, I guess it can make sense to go deeper (assuming the AA is a big issue).

it doesn't help that I haven't actually tried any non-linear DSP (I've done some basic stuff like modulated delays, but back then I didn't understand aliasing was a thing and it sounded reasonable).

So with heavier non-linearities/distortion, do you find that the aliasing overshoots 2x OS (assuming say 48k sample rate) and you really need 4x+ for that reason alone?
__________________
Reaper5, Win10Pro, Ryzen 5950x/64GB, RME UFX/BabyFace Pro, Behringer X-Touch
- my true 'global' (project-tab independent) Send/Receive FX
- my Behringer X-touch mods + XCtrl mode for CSI (coloured scribble strips!)
DeBased is offline   Reply With Quote
Old 02-03-2021, 04:52 PM   #23
sai'ke
Human being with feelings
 
sai'ke's Avatar
 
Join Date: Aug 2009
Location: NL
Posts: 1,453
Default

Quote:
Originally Posted by DeBased View Post
So with heavier non-linearities/distortion, do you find that the aliasing overshoots 2x OS (assuming say 48k sample rate) and you really need 4x + for that reason alone?
Yeah, if you hit a saturator or clipper hard, then yes. You can measure it pretty easily. Just open a frequency spectrum analyzer. Make a sine wave go in, and then increase the saturation. You'll see the aliases pop in at some point.

You'll also see that when you move the pitch of the tone, (some) of the aliases will move in opposite direction. Now try it with the anti-aliasing filter on.

The issue with test tones is that they can drive you crazy though. Aliasing from distortion never fully goes away. But at some point, it's just inaudible enough compared to the actual audio you're going to be putting through your plugin. Ultimately, that's a subjective cutoff that you have to set as a developer (or multiple cutoffs if you want to give your users options).

P.S. The main reason I'd usually pick somewhat steep, is because I don't like losing high frequency content. But if you're making a lo-fi or bass plugin, that may not be relevant at all for instance.
__________________
[Tracker Plugin: Thread|Github|Reapack] | [Routing Plugin: Thread|Reapack] | [More JSFX: Thread|Descriptions|Reapack]
sai'ke is offline   Reply With Quote
Old 02-03-2021, 05:36 PM   #24
DeBased
Human being with feelings
 
DeBased's Avatar
 
Join Date: Jun 2010
Location: UK
Posts: 412
Default

cool, will play with all that.

yeah I personally hate OS in plugins that change the high freqs noticeably. Voxengo plugs do that for me, so I rarely use their OS, and then usually only @ 2x (instead I run projects at 96k, which as a first step makes more sense to me than manually oversampling individual plugins, all with their own AA filter implementations, with their own unique artifacts all accumulating, euch). It upsets the purist in me .

(I do beta-test for Voxengo and reported the high-freq dulling a few times, I think they are looking at it now.)

I do use OS in eg. Compassion (high-end compressor) where it does sound just nicer.

The worst thing imo with non-steep AA filters is that the high-freq softening can sound pleasant, and then you may kid yourself that the AA is doing something useful when you just enjoy the mild high-end rolloff on a particular source. too much room for self-deception (there's already so much ).
__________________
Reaper5, Win10Pro, Ryzen 5950x/64GB, RME UFX/BabyFace Pro, Behringer X-Touch
- my true 'global' (project-tab independent) Send/Receive FX
- my Behringer X-touch mods + XCtrl mode for CSI (coloured scribble strips!)

Last edited by DeBased; 02-03-2021 at 05:48 PM.
DeBased is offline   Reply With Quote
Old 02-04-2021, 02:15 AM   #25
sai'ke
Human being with feelings
 
sai'ke's Avatar
 
Join Date: Aug 2009
Location: NL
Posts: 1,453
Default

Quote:
Originally Posted by DeBased View Post
yeah I personally hate OS in plugins that change the high freqs noticeably. Voxengo plugs do that for me, so I rarely use their OS, and then usually only @ 2x (instead I run projects at 96k, which as a first step makes more sense to me than manually oversampling individual plugins, all with their own AA filter implementations, with their own unique artifacts all accumulating, euch). It upsets the purist in me .
Just fyi, if you hate the dulling effect and happen to go with the continuous-time convolution thing, I'd highly recommend using at least 2x oversampling and applying the method in the oversampled domain. The method induces considerable rolloff in the highs. I've tried compensating this before with a shelf afterwards, but it was never even close to what you can achieve with just doing x2 and then that technique.
__________________
[Tracker Plugin: Thread|Github|Reapack] | [Routing Plugin: Thread|Reapack] | [More JSFX: Thread|Descriptions|Reapack]
sai'ke is offline   Reply With Quote
Old 02-07-2021, 10:47 AM   #26
DeBased
Human being with feelings
 
DeBased's Avatar
 
Join Date: Jun 2010
Location: UK
Posts: 412
Default

Quote:
Originally Posted by sai'ke View Post
Just fyi, if you hate the dulling effect and happen to go with the continuous-time convolution thing, I'd highly recommend using at least 2x oversampling and applying the method in the oversampled domain. The method induces considerable rolloff in the highs. I've tried compensating this before with a shelf afterwards, but it was never even close to what you can achieve with just doing x2 and then that technique.
Noted, thanks.
__________________
Reaper5, Win10Pro, Ryzen 5950x/64GB, RME UFX/BabyFace Pro, Behringer X-Touch
- my true 'global' (project-tab independent) Send/Receive FX
- my Behringer X-touch mods + XCtrl mode for CSI (coloured scribble strips!)
DeBased is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 02:02 AM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.