> How else would you test the accuracy? I like to look at the dB magnitude and phase (in degrees) of the frequency response. So feed 1-1' to analytic instead of a sinusoid. The ideal response is 0 dB for the magnitude at all frequencies, and 90 or -90 degrees for the phase, depending on whether the frequency is positive or negative.
If you do a "cd libraries && git checkout master && git pull" in your faust master-dev clone, you can also compare to fi.pospass(filterOrder). You appear to have four biquads in series for your filter, so filterOrder == 8 would be a reasonable comparison. - Julius On Fri, Jul 5, 2019 at 12:36 AM Dario Sanfilippo <sanfilippo.da...@gmail.com> wrote: > > With that, it's not looking great. I'm cascading two analytic filters feeding > the first one with the chirp and the second one with the imaginary part of > the first filter. Then I'm summing the real part of the first filter and the > imaginary part of the second one. Shouldn't they be shifted by 180 degrees? I > changed the octaves per second to .5 to having an even slower test signal. > > This is the error: > https://www.dropbox.com/s/xtqwvk4ar0daz8c/analytic_plot.png?dl=0. > > How else would you test the accuracy? > > Dario > > > On Fri, 5 Jul 2019 at 03:14, Julius Smith <j...@ccrma.stanford.edu> wrote: >> >> Thanks! A more complete test is to feed it a slow chirp: >> f0 = 20.0; >> fMax = 0.5 * ma.SR; >> octavesPerSecond = 1.0; >> fRatio = 2.0^(octavesPerSecond/ma.SR); >> chirpFreq = 1-1' : *(f0) : + ~ *(fRatio); >> freq = min(fMax, chirpFreq); >> process = os.osccos(freq) : analytic; >> >> On Thu, Jul 4, 2019 at 5:13 PM Dario Sanfilippo >> <sanfilippo.da...@gmail.com> wrote: >> > >> > Hello, everybody. >> > >> > Here's yet another design to obtain analytic signals, taken from Olli's >> > post: >> > https://dsp.stackexchange.com/questions/37411/iir-hilbert-transformer/59157#59157. >> > >> > analytic(x) = real, >> > >> > imaginary >> > >> > with { >> > >> > re_c = (0.47944111608296202665, 0.87624358989504858020, >> > 0.97660296916871658368, 0.99749940412203375040); >> > >> > im_c = (0.16177741706363166219, 0.73306690130335572242, >> > 0.94536301966806279840, 0.99060051416704042460); >> > >> > tf(c, y, x) = c*(x+y')-x''; >> > >> > real = mem(x) : seq(i, 4, tf(ba.take(i+1, re_c)) >> > >> > ~ _); >> > >> > imaginary = x : seq(i, 4, tf(ba.take(i+1, im_c)) >> > >> > ~ _); >> > >> > }; >> > >> > >> > process = os.osccos(1000) : analytic; >> > >> > >> > Attached the outputs plotted as coordinates. It is fairly close to a >> > circle, at least with a 1k cosine. Eventually, I'll try to make a >> > comparison between all the designs. >> > >> > Cheers, >> > Dario >> > >> > >> > >> > On Sun, 23 Jun 2019 at 23:52, Julius Smith <j...@ccrma.stanford.edu> wrote: >> >> >> >> > I interpreted your email as if the new fi.ssbf is always "better" than >> >> > hilbert = _ <: H(a1)', H(a2) with ... >> >> >> >> I did not mean to imply that. You can use whatever bandpass filter >> >> you want, and that choice should of course be adapted to your >> >> anticipated input signal(s). If you know the input is a sinusoid at a >> >> known frequency, for example, then you can get by (perfectly) with a >> >> quarter-cycle delay at that frequency. Many people use this >> >> approximation for narrowband signals (such as in microwave >> >> engineering). >> >> >> >> I would strongly object to the name "hilbert" as defined, however, >> >> because it has two outputs instead of one. >> >> >> >> - Julius >> >> >> >> On Sun, Jun 23, 2019 at 2:34 PM Julius Smith <j...@ccrma.stanford.edu> >> >> wrote: >> >> > >> >> > > Agreed, but I was talking about fi.hilbert. Ideally it should turn >> >> > > cos() into sin(), at least according to its name/documentation, not >> >> > > into sin/2. >> >> > >> >> > I suppose a name change such as "half_hilbert" could be helpful to >> >> > avoid confusing "engineering" and "mathematics" definitions of >> >> > "hilbert". However, I cannot think of a good name. >> >> > Instead, I suggest we move "hilbert" into a comment in the pospass() >> >> > doc (see latest filters.lib). >> >> > >> >> > As you pointed out earlier, no finite-order filter can be The Hilbert >> >> > Transform. Even being sampled in time makes that impossible. >> >> > Therefore, avoiding the name entirely makes good sense. However, note >> >> > that there are few complaints about "Fast Fourier Transform", which is >> >> > not the Fourier Transform, and FFTs are similarly (un)scaled according >> >> > to engineering principles (avoid gain terms until they are required in >> >> > the application). >> >> > >> >> > - Julius >> >> > >> >> > On Sun, Jun 23, 2019 at 8:30 AM Oleg Nesterov <o...@redhat.com> wrote: >> >> > > >> >> > > On 06/22, Julius Smith wrote: >> >> > > > >> >> > > > Maybe clearer now? See latest filter.lib. >> >> > > >> >> > > Thanks, the new doc matches my understanding ;) >> >> > > >> >> > > > I presently vote against a scaling by 2, but I am open to arguments. >> >> > > > Right now, pospass simply passes only positive frequencies, and >> >> > > > hilbert is the imaginary part of pospass. To me this is the >> >> > > > simplest >> >> > > > view. >> >> > > >> >> > > Agreed, but I was talking about fi.hilbert. Ideally it should turn >> >> > > cos() >> >> > > into sin(), at least according to its name/documentation, not into >> >> > > sin/2. >> >> > > >> >> > > > None of these filters is ideal. By considering lowpass, pospass, >> >> > > > hilbert, etc., in Faust, you are considering practical filters, >> >> > > > nothing ideal. >> >> > > >> >> > > Of course. But as for fi.hilbert, I simply can't imagine any practical >> >> > > usage of it... >> >> > > >> >> > > >> >> > > And in fact there was another reason why I was confused. I interpreted >> >> > > your email as if the new fi.ssbf is always "better" than >> >> > > >> >> > > hilbert = _ <: H(a1)', H(a2) with { >> >> > > a1 = 0.6923878, 0.9360654322959, 0.9882295226860 , >> >> > > 0.9987488452737; >> >> > > a2 = 0.4021921162426, 0.8561710882420, >> >> > > 0.9722909545651, 0.9952884791278; >> >> > > H_sect(a) = f ~ _ with { f(y, x) = a^2 * (x + y') - >> >> > > x''; }; >> >> > > H(as) = seq(i, outputs(as), H_sect(ba.take(i+1, as))); >> >> > > }; >> >> > > >> >> > > I showed to Dario, at least for frequency shifting. AFAICS, this is >> >> > > not >> >> > > necessarily true, this depends. Consider the naive implementations, >> >> > > >> >> > > freq_shift_yehar(f) = hilbert : *(os.oscrc(f)) - >> >> > > *(os.oscrs(f)); >> >> > > >> >> > > and >> >> > > >> >> > > freq_shift_ssbf(f) = fi.ssbf(8) : *(os.oscrc(f)) - >> >> > > *(os.oscrs(f)); >> >> > > >> >> > > iiuc the first one will work "better" unless the input frequency is >> >> > > "close" >> >> > > to SR/4. >> >> > > >> >> > > Right? >> >> > > >> >> > > Oleg. >> >> > > >> >> > > >> >> > >> >> > >> >> > -- >> >> > >> >> > Julius O. Smith III <j...@ccrma.stanford.edu> >> >> > Professor of Music and, by courtesy, Electrical Engineering >> >> > CCRMA, Stanford University >> >> > http://ccrma.stanford.edu/~jos/ >> >> >> >> >> >> >> >> -- >> >> >> >> Julius O. Smith III <j...@ccrma.stanford.edu> >> >> Professor of Music and, by courtesy, Electrical Engineering >> >> CCRMA, Stanford University >> >> http://ccrma.stanford.edu/~jos/ >> >> >> >> -- >> >> Julius O. Smith III <j...@ccrma.stanford.edu> >> Professor of Music and, by courtesy, Electrical Engineering >> CCRMA, Stanford University >> http://ccrma.stanford.edu/~jos/ -- Julius O. Smith III <j...@ccrma.stanford.edu> Professor of Music and, by courtesy, Electrical Engineering CCRMA, Stanford University http://ccrma.stanford.edu/~jos/ _______________________________________________ Faudiostream-users mailing list Faudiostream-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/faudiostream-users