Q: band limited difference curve

DSP, Plug-in and Host development discussion.
User avatar
antto
KVRAF
2499 posts since 4 Sep, 2006 from 127.0.0.1

Post Sun Aug 05, 2018 1:29 am

sadly i abandoned this idea, i tried things but the approximations were either poor or very complex/heavy
i still wish something like that could be done tho

so maybe not "BLDC" alone, but a combination of that plus 2x oversampling.. to hide the ugliness above nyquist
It doesn't matter how it sounds..
..as long as it has BASS and it's LOUD!

irc.freenode.net >>> #kvr

matt42
KVRian
1057 posts since 9 Jan, 2006

Re: Q: band limited difference curve

Post Sun Aug 05, 2018 7:42 am

Maybe I misunderstood the idea, but it seemed the residual function (difference curve) is for a fixed frequency as it covers the full cycle of the waveform? Is that right? Where as the for blep/blamp we only need the residual of the discontinuity.

So, where as for blep you can apply the same residual regardless of the frequency, but with BLDC the difference curve would be frequency dependant. Or perhaps I misunderstood the whole thing :oops:

EDIT:
antto wrote:i still wish something like that could be done tho
I think it is a solved problem: BLEP/BLAMP

User avatar
antto
KVRAF
2499 posts since 4 Sep, 2006 from 127.0.0.1

Re: Q: band limited difference curve

Post Sun Aug 05, 2018 12:15 pm

matt42 wrote:Maybe I misunderstood the idea, but it seemed the residual function (difference curve) is for a fixed frequency as it covers the full cycle of the waveform? Is that right? Where as the for blep/blamp we only need the residual of the discontinuity.

So, where as for blep you can apply the same residual regardless of the frequency, but with BLDC the difference curve would be frequency dependant. Or perhaps I misunderstood the whole thing :oops:
see the first post, the idea was that on one hand you have a naive sawtooth(phase) function, and on the other you have a bandlimited_sawtooth(phase, H) function which simply adds H sinewaves together to construct your sawtooth
then i subtract those two functions and call the result "BLDC" and its approximation thus has a H parameter

maybe i should've given up looking for an approximation and went the "LUT" way instead..
It doesn't matter how it sounds..
..as long as it has BASS and it's LOUD!

irc.freenode.net >>> #kvr

matt42
KVRian
1057 posts since 9 Jan, 2006

Re: Q: band limited difference curve

Post Sun Aug 05, 2018 12:28 pm

antto wrote:see the first post, the idea was that on one hand you have a naive sawtooth(phase) function, and on the other you have a bandlimited_sawtooth(phase, H) function which simply adds H sinewaves together to construct your sawtooth
then i subtract those two functions and call the result "BLDC" and its approximation thus has a H parameter
OK, thanks I think I understand better now. I would say that coming up with a decent function for a single value of H isn't so easy, but coming up with an algo for arbitrary values of H will be really tough. Compare that to polyblep or something where you just need to integrate a triangular function (piecewise integration of straight lines)
antto wrote:maybe i should've given up looking for an approximation and went the "LUT" way instead..
Perhaps, but I guess you arrive at something somewhat equivalent to wavetable synthesis?
Last edited by matt42 on Sun Aug 05, 2018 12:54 pm, edited 1 time in total.

Z1202
KVRian
958 posts since 12 Apr, 2002

Re: Q: band limited difference curve

Post Sun Aug 05, 2018 12:51 pm

The BLEP function is Si(x) (called "Sine integral"). Even though the integral itself can't be taken analytically, from the point of view of computation this function is as "computable" as sin(x) or sinc(x). The thing is that typical modern CPUs can't compute sin(x) and software needs to use a special routine (e.g. from the standard library) to do that. In the same way there are routines to compute Si(x). Or it can be tabulated. The BLEP residual can be then computed by simply subtracting the step function from Si(x). However, to be practically implementable it needs to be windowed to make it time-limited.

The residual of the complete sawtooth OTOH is (as it was already noted here) frequency-dependent, which means the table will be frequency-dependent. Note that it is simply equal to the sum of BLEP residuals spaced at the sawtooth period's distance.

mystran
KVRAF
4983 posts since 12 Feb, 2006 from Helsinki, Finland

Re: Q: band limited difference curve

Post Sun Aug 05, 2018 5:47 pm

Z1202 wrote:The BLEP function is Si(x) (called "Sine integral"). Even though the integral itself can't be taken analytically, from the point of view of computation this function is as "computable" as sin(x) or sinc(x). The thing is that typical modern CPUs can't compute sin(x) and software needs to use a special routine (e.g. from the standard library) to do that. In the same way there are routines to compute Si(x). Or it can be tabulated. The BLEP residual can be then computed by simply subtracting the step function from Si(x). However, to be practically implementable it needs to be windowed to make it time-limited.
The problem with windowing analytically integrated sinc though is that windowing works best when the spectrum looks like a brickwall step with two flat regions. Every additional integration adds a 6dB/oct low-pass slope to a sharp high-pass filter that results in a "spike" in the spectrum around the cutoff point, which degrades the performance of a post-integration windowed design quite a bit for every additional integral... in my experience making the result essentially useless.

That's the main reason I still personally generate all my BLEPs by numerically integrating a windowed sinc. While I also have code for doing the integration analytically, the performance after windowing just isn't there. I suppose applying a window that you can analytically integrate with the rest of it could work, but never tried that.
If you'd like Signaldust to return, please ask Katinka Tuisku to resign.

matt42
KVRian
1057 posts since 9 Jan, 2006

Re: Q: band limited difference curve

Post Mon Aug 06, 2018 3:51 am

Don't know how useful it would be, but keeping a set of difference curve tables could be a means of data compressing regular wave tables.

Chaotikmind
KVRist
65 posts since 26 Sep, 2005 from France

Re: Q: band limited difference curve

Post Wed Aug 08, 2018 1:03 pm

Z1202 wrote:The BLEP function is Si(x) (called "Sine integral"). Even though the integral itself can't be taken analytically, from the point of view of computation this function is as "computable" as sin(x) or sinc(x). The thing is that typical modern CPUs can't compute sin(x) and software needs to use a special routine (e.g. from the standard library) to do that.
Noway FSIN & FSINCOS were added to the 387 series of coprocessors...
it's a long time that is not anymore computed in software.

Z1202
KVRian
958 posts since 12 Apr, 2002

Re: Q: band limited difference curve

Post Fri Aug 10, 2018 3:23 am

Chaotikmind wrote:
Z1202 wrote:The BLEP function is Si(x) (called "Sine integral"). Even though the integral itself can't be taken analytically, from the point of view of computation this function is as "computable" as sin(x) or sinc(x). The thing is that typical modern CPUs can't compute sin(x) and software needs to use a special routine (e.g. from the standard library) to do that.
Noway FSIN & FSINCOS were added to the 387 series of coprocessors...
it's a long time that is not anymore computed in software.
I fear this info may be a little outdated (along with 387 FPU). For one, IIRC, on Win64 one even can't use FPU, because it's not handled correctly by the OS during context switching anymore. Also, I'm not sure whether FPU is well maintained on the hardware level, in the sense of performance, or is it just a compatibility-ensuring inefficient implementation. At any rate it seems that sinf(x) in MSVC x64 is not 387-based anymore.

Z1202
KVRian
958 posts since 12 Apr, 2002

Re: Q: band limited difference curve

Post Fri Aug 10, 2018 3:29 am

mystran wrote:The problem with windowing analytically integrated sinc though is that windowing works best when the spectrum looks like a brickwall step with two flat regions. Every additional integration adds a 6dB/oct low-pass slope to a sharp high-pass filter that results in a "spike" in the spectrum around the cutoff point, which degrades the performance of a post-integration windowed design quite a bit for every additional integral... in my experience making the result essentially useless.
Interesting observation. Didn't notice this in my experiments, but that was a very long time ago, so I'm not sure if I missed the poor qualities of BLAMP spectra, or whether my window choice was good enough to offset the effect you're mentioning.

I mean, if you're integrating a windowed BLEP residual, you're also e.g. increasing the relative amplitude of the "aliasing" in the audible range, since the integration boosts lower frequencies. So the question is, which effect is stronger and that might depend on the window size and shape.

Chaotikmind
KVRist
65 posts since 26 Sep, 2005 from France

Re: Q: band limited difference curve

Post Fri Aug 10, 2018 4:12 am

Z1202 wrote:
Chaotikmind wrote:
Z1202 wrote:The BLEP function is Si(x) (called "Sine integral"). Even though the integral itself can't be taken analytically, from the point of view of computation this function is as "computable" as sin(x) or sinc(x). The thing is that typical modern CPUs can't compute sin(x) and software needs to use a special routine (e.g. from the standard library) to do that.
Noway FSIN & FSINCOS were added to the 387 series of coprocessors...
it's a long time that is not anymore computed in software.
I fear this info may be a little outdated (along with 387 FPU). For one, IIRC, on Win64 one even can't use FPU, because it's not handled correctly by the OS during context switching anymore. Also, I'm not sure whether FPU is well maintained on the hardware level, in the sense of performance, or is it just a compatibility-ensuring inefficient implementation. At any rate it seems that sinf(x) in MSVC x64 is not 387-based anymore.
It is more an OS related issue, anyway you got me curious and i checked it, indeed it is compiled to a shitload of instructions...
Didn't realize it was an issue until right now ...

Edit: the best case scenario seems to be when FMA3 instruction set is used.

mystran
KVRAF
4983 posts since 12 Feb, 2006 from Helsinki, Finland

Re: Q: band limited difference curve

Post Fri Aug 10, 2018 6:21 am

Z1202 wrote:For one, IIRC, on Win64 one even can't use FPU, because it's not handled correctly by the OS during context switching anymore.
Not true. It works perfectly fine, it's just that compilers don't normally use it, except for extended precision. Since the instructions that save/restore SSE state also save/restore the legacy FPU state, it would actually take additional effort for the OS to explicitly NOT support the legacy FPU.
Also, I'm not sure whether FPU is well maintained on the hardware level, in the sense of performance, or is it just a compatibility-ensuring inefficient implementation. At any rate it seems that sinf(x) in MSVC x64 is not 387-based anymore.
I checked Agner's charts and most modern desktop processors take 50-100 cycles or so to do FSIN. Atom takes a whole lot more... and then you add whatever overhead you get from moving your data from the SSE unit to the x87 when rest of your FPU code is on the SSE unit.. and you can't SIMD... so like... realistically for high performance algorithms you almost certainly want to use a software implementation.
If you'd like Signaldust to return, please ask Katinka Tuisku to resign.

Z1202
KVRian
958 posts since 12 Apr, 2002

Re: Q: band limited difference curve

Post Fri Aug 10, 2018 1:14 pm

Z1202 wrote:I mean, if you're integrating a windowed BLEP residual, you're also e.g. increasing the relative amplitude of the "aliasing" in the audible range, since the integration boosts lower frequencies. So the question is, which effect is stronger and that might depend on the window size and shape.
Although, upon further thinking, it seems that the "low-frequency" content is always strictly harmonic, so even if it distorts the low-frequency spectrum, it won't create any inharmonic components. Not sure how large the distortion could get though.

mystran
KVRAF
4983 posts since 12 Feb, 2006 from Helsinki, Finland

Re: Q: band limited difference curve

Post Sat Aug 11, 2018 2:17 am

Z1202 wrote:
Z1202 wrote:I mean, if you're integrating a windowed BLEP residual, you're also e.g. increasing the relative amplitude of the "aliasing" in the audible range, since the integration boosts lower frequencies. So the question is, which effect is stronger and that might depend on the window size and shape.
Although, upon further thinking, it seems that the "low-frequency" content is always strictly harmonic, so even if it distorts the low-frequency spectrum, it won't create any inharmonic components. Not sure how large the distortion could get though.
Since the "BLEP residue" is essentially "pure aliasing" at the base processing sampling rate, the question for numerical integration is whether the oversampling factor of the (windowed) BLEP kernel is sufficiently high that it well approximates the continuous time kernel... ie. whether the remaining aliasing from sampling the BLEP residue at some high oversampling factor is still meaningful. This aliasing will certainly be boosted during integration.

The big problems however tend to be either harmonic amplitude mismatch just slightly above the cutoff point (ie. aliasing doesn't cancel sufficiently well; personally I've never managed to get reasonable results with analytic approaches here) or step-discontinuities at the beginning/end of the window higher-order BLEP due to repeated numerical integration (which can be mitigated by using a window with better continuity at the end-points.. up to a point anyway).
If you'd like Signaldust to return, please ask Katinka Tuisku to resign.

Z1202
KVRian
958 posts since 12 Apr, 2002

Re: Q: band limited difference curve

Post Sat Aug 11, 2018 7:55 am

mystran wrote:Since the "BLEP residue" is essentially "pure aliasing" at the base processing sampling rate, the question for numerical integration is whether the oversampling factor of the (windowed) BLEP kernel is sufficiently high that it well approximates the continuous time kernel... ie. whether the remaining aliasing from sampling the BLEP residue at some high oversampling factor is still meaningful. This aliasing will certainly be boosted during integration.
Oh, I didn't mean that aliasing. I was assuming that integration is done offline with very high precision (I mean, the time-domain resolution) ;)
mystran wrote:The big problems however tend to be either harmonic amplitude mismatch just slightly above the cutoff point (ie. aliasing doesn't cancel sufficiently well; personally I've never managed to get reasonable results with analytic approaches here) or step-discontinuities at the beginning/end of the window higher-order BLEP due to repeated numerical integration (which can be mitigated by using a window with better continuity at the end-points.. up to a point anyway).
Hmmm, to get good response at the cutoff you need a long window (just by the Heisenberg principle). However, I wonder how critical is that. E.g. if the software is running at 88kHz or above (which is reasonable to mitigate the prewarping BLT artifacts and reduce the aliasing from nonlinearities at least a bit), you have quite a lot of headroom below Nyquist.

Return to “DSP and Plug-in Development”