@jameslo nja, i think you gave the wrong reason
if you run pd at samplerate 44100 and you upsample by 16, the samplerate of the patch is 705 600. Devide this by fft-split~'s default blocksize 1024 and you get a bin resolution of 705600/1024 ~ 689 hz.
This is like running fft-split~ with a blocksize of 64 at normal samplerate (44100/64 ~ 689). You can try, [pp.fft-split 64 4] will give you the same strange result (I'm not even sure why fft patches start to act weird when you run them with block sizes >256, maybe it actually is related to overlap...)
With block size 4096 you get 705600/4096 ~ 172hz resolution, but you probably want 705600/16384 ~ 43hz witch relates to 44100/1024 ~ 43hz.
there was a short conversation about this on the mailing list:
In general, I think questions about potential bugs or the internal workings of pd are better asked on the mailing list or as an issue on github.
- It looks like you are simply passing the bins that are below the threshold frequency to the left inverse transform, and the rest to the right (with the omitted bins on each side muted), is that correct?
yes, that's correct.
- If so, then why does the transition band sound continuous? i.e. when I output lowpass to the left and highpass to the right, as I sweep up it moves continuously from left to right around the threshold frequency.
that is the result of spectral smearing i guess https://en.wikipedia.org/wiki/Spectral_leakage
the slopes of the lowpass/highpass are not perfectly steep
- I struggled to make a test to see what phase distortions occur near the threshold frequency, and there don't appear to be any. Could that be true? (I'm not confident I tested properly)
there shouldn't be any phase distortion. essentially it's a linear phase FIR filter.
@tungee thanks for the links!
I made this pp.ladder~ filter to get an idea about the concept of "zero delay filters". So I kind of mapped it out as a pd patch to get an overview (not that i fully understand it now...)
However, it makes much more sense to create externals (instead of vanilla abstractions) of this filters. Pure data is really not efficient in processing patches with one sample dsp blocks.
aha, so they take messages when you name them?
no, they take messages in general. "naming" inlet/outlet is considered bad patching style.
if you want to connect signals and messages to an abstraction, you have to use something like [route start stop int float] inside the abstraction - the signal will come out of the "does not match" output of [route].
I prefer the pd method; [inlet~ fwd]. It is documented in the helpfile.
It appears that, when you connect nothing to [inlet~], it already holds its last value and doesn't reset. You can test that, in the sample patch above, by deleting the signal connection into the right-hand side instance of the 0529 abstraction. If it went to 0, then the right channel would be silent. Instead, it holds frequency.
? if I could reproduce this, i would file a bug report on github. because this would be undesirable in many situations. However, i can't reproduce it. I wonder why it works for you?