How to patch y[n] = x[n]/samplerate + y[n-1] with x the input and y the output in Pure Data?
-
y[n] = x[n]/samplerate + y[n-1]
-
@Nobody Ah.
I started writing that you will need a [block~ 1] to get individual sample values......etc.......
But as usual it is all here....... https://forum.pdpatchrepo.info/topic/677/biquad-implementation-one-sample-delay already with explanations.....
David. -
@Nobody Take a look at the help patch for [rpole~]
-
Perhaps rzero_rev~ (with a=0) is the easiest way to realize a one sample delay?
-
Thanks for all the answers! I can indeed now get a very small (one sample?) delay, but the patch no longer works (at least on my computer) as soon as I use block~ 1 or apply a feedback loop for y to get y[n] = x[n]/samplerate + y[n-1]
-
@Nobody Oh, you're right, rpole~ uses the previous input, but you wanted the previous output. My bad. Maybe you could prototype with [fexpr~] and then search for something more efficient (if it matters) once you know it's working?
Edit: crap, just saw @seb-harmonik.ar's post, my bad again. rpole~ doesn't use the previous input, it uses the previous output.
-
@Nobody I thought it might be impossible to loop the output with [block~ 1] as it has moved to the next frame already when you need the output.
Maybe [block~ 2] with the y(n-1) delayed by one sample by a [send] + [receive] within the sub-patch?
Or maybe [vline~] can be used within [block~1] as it can schedule even between samples?
y(n) into [vline~] to jump its output to be used as y(n-1) in the next block?
But the [vline~] help file states that its timing is unreliable when a patch is reblocked, so it would need testing.
David. -
Found out just now that the feedback of y by using [send] + [receive] to get y[n] = x[n]/samplerate + y[n-1] results in a drift of y that ultimately drowns the signal.
-
(x)
|
[*~ inverse of samplerate]
|
[rpole~ 1] -
Thank you! Yes that should work, but strangely I'm not getting the results that I think I should get...
-
@Nobody what results do you think you should get? seems like you should get a kind of lowpassed triangle wave on the right side with that configuration.
-
I'm trying to make a mathematical integrator module (not a slew limiter), and indeed feeding a square wave should result in a triangle wave at the output. But sadly for some reason it's not working...
-
Now we are getting somewhere:
-
Is such a feedback loop as below forbidden in Pure Data? Can't get it to work...
-
Yes, it's forbidden. You can't loop signal objects like that. You have to use a [send~] / [receive~] pair to make the loop.
-
Thanks! Yes the loop is working now.
-
Is there a simple way to give a single pulse to startup the patch instead of the workaround in the red circle?
-
@Nobody said:
Is there a simple way to give a single pulse to startup the patch instead of the workaround in the red circle?
The best way I know is to create a two element array -- first value 1, second value 0 -- then tabplay~ to get the impulse.
[array define dirac] [loadbang] | [t b b] | | | [; dirac resize 2; dirac 0 1 0( <<-- message, not object | [tabplay~ dirac]
(From memory, maybe I got the array messages wrong)
hjh
-
Why isn't the patch below inverting the input signal?
-
@Nobody said:
Why isn't the patch below inverting the input signal?
If the -1 message isn't being transmitted, then *~ might not be multiplying by -1...?
Otherwise... what is it doing instead of inverting?
hjh
-
Thanks. I now have the following and it is working now.