With BufferLength = 300 the generated C++ code and the CPU costs become huge… 
so it seems the underlying algorithm is not suited to Faust kind of coding ?

Stéphane


> Le 7 mai 2020 à 23:35, Bart Brouns <b...@magnetophon.nl> a écrit :
> 
> 
> Hi Nicolas,
> 
> 
> Great to hear it's GPL! Thank you!
> 
> Do you mean the soundcard buffer setting?
> I have that set to 3*4096.
> 
> The jackqt program says:
> "The buffer size is now 512/sec"
> on the CLI though.
> 
> 
> Either way, the bargraph shows up empty, and I tried an oscillator at all 
> audio frequencies.
> I'd be grateful for any help!
> 
> 
> 
> Have you heard of Specially Normalized AutoCorrelation ?
> http://miracle.otago.ac.nz/tartini/papers/Philip_McLeod_PhD.pdf
> 
> It's supposed to be an improvement on AutoCorrelation, and I've been using 
> http://www.katjaas.nl/helmholtz/helmholtz.html with great results.
> 
> I'd love to see it implemented in faust, but I can't make heads nor tails of 
> the explanation.
> Maybe something for the future?
> 
> 
> Cheers,
> Bart.
> 
> 
> 
> Nicolas Gravillon <gravil...@gmail.com> writes:
> 
>> Hi Bart,
>> 
>> Glad you like it. I guess this is something quite expected as it gives 
>> access to so many applications. Let’s distribute it under the terms of GNU 
>> General Public License, as published by the FSF, v2 or any later version.
>> 
>> I will give it some more time to test the accuracy. Consider this code as a 
>> POC and try to increase the BufferLength to something over 300 if possible. 
>> It depends on ur lowest frequency and SR actually.
>> 
>> Nicolas
>> 
>> 
>> 
>>> On 7 May 2020, at 15:48, Bart Brouns <b...@magnetophon.nl> wrote:
>>> 
>>> 
>>> Hi all,
>>> 
>>> This is very exciting to me, since I've been looking for a way to integrate 
>>> the pitchtracker of https://magnetophon.github.io/VoiceOfFaust/ into the 
>>> binary, instead of using an external pd patch.
>>> So many thanks to Nicolas for writing it!
>>> Is it open source? What license?
>>> 
>>> 
>>> Julius's solution didn't work for me, but this at least compiles and runs:
>>> i = +(1) ~_ :min(1e9):max(0);
>>> 
>>> Unfortunately it doesn't track the pitch here.
>>> I connected an oscillator but the bargraph stays at 0.
>>> 
>>> 
>>> Also, I don't understand any of the algorithm, but shouldn't "i" get reset 
>>> at some point, so it doesn't run into the min clause?
>>> That would happen after 1e9/48000/60/60 = almost 6 hours at 48k SR, right?
>>> 
>>> 
>>> Cheers,
>>> Bart
>>> 
>>> 
>>> 
>>> Julius Smith <julius.sm...@gmail.com> writes:
>>> 
>>>> Hi Nicolas,
>>>> 
>>>> It looks like you are asking for unbounded correlation lags. Try limiting
>>>> it with something like   i = min(1e8,+(1)) ~_ ;
>>>> 
>>>> - Julius
>>>> 
>>>> On Tue, May 5, 2020 at 11:56 PM Nicolas Gravillon <gravil...@gmail.com>
>>>> wrote:
>>>> 
>>>>> Hi everyone,
>>>>> 
>>>>> First of all, thank you all for your amazing achievement with Faust. I am
>>>>> delighted to use it and amazed by all this work. Regarding my problem, I
>>>>> try for some time now to implement a pitch tracker implementing
>>>>> autocorrelation, for a more reliable metering than the zero crossing
>>>>> method. I ended with the following version, strongly inspired from Tiziano
>>>>> Bole work :
>>>>> 
>>>>> import("stdfaust.lib");
>>>>> 
>>>>> BufferLength=4;
>>>>> 
>>>>> pitch(x) = ma.SR / max(M, 1) - ma.SR * (M == 0)
>>>>> with {
>>>>> AC(x, k) = sum(j, BufferLength, (x@(j))*(x@(j+k))) /  (BufferLength) ;
>>>>> // Correlating two signals, on the buffer length, ideally over 600 samples
>>>>> with actual SR
>>>>> i = +(1) ~_ ;
>>>>> U = AC(x,i)  >  AC(x,0)/2;             // Detection of a  good
>>>>> correlation, AC(x,0) being the highest possible value, so its half becomes
>>>>> the detection threshold
>>>>> V = AC(x,i)  <= AC(x,i+1);
>>>>> W = AC(x,i+1) > AC(x,i+2);
>>>>> Y = U: *(V) : *(W);
>>>>> 
>>>>> N = (+(1) : *(1 - Y)) ~ _;
>>>>> M = (N' + 1) : ba.sAndH(Y);
>>>>> };
>>>>> 
>>>>> process = pitch : hbargraph(“Frequency", 50, 2000);
>>>>> 
>>>>> The problem seems to be located in the Autocorrelation function :   AC(x,
>>>>> k) = sum(j, BufferLength, (x@(j))*(x@(j+k))) / (BufferLength) since the
>>>>> error says “can’t compute the min and max values of […] used in delay
>>>>> expression […] (probably a recursive signal).
>>>>> 
>>>>> Any chance to get it working? I do not see actually how to fix boundaries
>>>>> for the delay lines, or get rid of the recursive guess from the compiler.
>>>>> 
>>>>> Thanks for reading this,
>>>>> 
>>>>> Nicolas
>>>>> _______________________________________________
>>>>> Faudiostream-users mailing list
>>>>> Faudiostream-users@lists.sourceforge.net
>>>>> https://lists.sourceforge.net/lists/listinfo/faudiostream-users
>>>>> 
>>> 
> 
> 
> 
> _______________________________________________
> Faudiostream-users mailing list
> Faudiostream-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/faudiostream-users



_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to