A study of the Bi-quard IIR filter has the filter.
Bateman says K1 and K2 adjust levels, so that they do not overlaod the integer arithmatic. he uses a nd b
op/ip = (k1*( ao + a1 *z + a2 * z*z )
+ - - -+ - - - +--- k2 ---op a0 a1 a2 ip -- k1 --S--+-[z]--+--[z]--+ | b1 b2 + - - - - + - - - +
above z is nomally z^-1 , or a samples delay
S is a summer
z = exp( j 2PI f / Fsample)
exp( jx ) = cos( x ) + jsin( x ) exp(-jx ) = cos( x ) - jsin( x )
2cos(x) = exp(jx)+exp(-jx) j2sin(x) = exp(jx)-exp(-jx)
op/ip = H[Z] = (Z*Z*a0 + Z*a1 + a2)*k2 / ( Z*Z - Z*b1 - b2)
Z = exp( j2PI f/FS ) = cos( 2PI f/FS ) + jsin( 2PI f/FS )
This can be thought of as the top line is an FIR filter with zeros at a very limited number of solutions. You need many more [Z]
op/ip = [ FIR ]*[ IIR ]
op/ip = [ FIR ]/ ( [ FIR] )
The IIR has two Poles at exp( j2PI f/FS ) and exp( -j2PI f/FS) so you only have real terms.
The Goertzel algorithm allows poles just inside the UNIT circle. See:- https://en.wikipedia.org/wiki/Goertzel_algorithm
40 Years ago, I read this:- https://www.ti.com/lit/an/spra168/spra168.pdf
The Goertzel algorithm is very simple and is tuned
b1 = 2cos( 2PI f/Fs )
b2 = -1
It can be used to resonate at the desired frequency. So I have one for the tone used for MARK and one for the SPACE tone.
For V.21 there are four frequencies, 970Hz, 1170Hz, 1650Hz and 1850Hz.
I want to filter out the 970Hz when analysing V.21(high) 1650Hz and 1850Hz. I could use bandpass filters or band stop filters or a notch filter. Its not easy.
The Bi Quad cannot tune the zeros using this. You cannot use this for the a terms.
op/ip = [ FIR ]*[ IIR ]
op/ip = [ FIR ]/ ( [ FIR] )
The IIR filter can be turned to resonate at f/FS, but the FIR zero cannot be tuned.
So can we do this:
The [ FIR ] only provides limited Zeros at f*n/FS where n is the number of [z], The [ IIR ] provides the Poles due to sequence of [z] provided by the feedback.
Can we use a "Gyrator" idea to convert the IIR's poles into zeros?
op/ip = [ FIR ]*[ IIR ]
op/ip = [ FIR ]/ ( [ IIR ] ) -- use an IIR filter to generate the feedback.
op/ip = [ FIR ]/ ( [ FIR ] / [ IIR ] )
= zeros / ( zeros / poles )
= zeros * poles * zeros
= zeros * "zeros" * "poles"
so the tuneables poles of the Goetzel algorithm become Zeros!
Can we change the poles of the IIR filter in the feed back to zeros?
+ - - -+ - - - + -- k2 -+- - - - - - - - -op a0 a1 a2 | ip -- k1 --S--+-[z]--+--[z]--+ S---[z]--+--[z]--+ - - + | | b1 b2 | | +- - - - + - - - + | | | + - - - - - - - - - - - - - - - - - - - - - - - - +
Could I use a resonator to generate an anti-phase signal to cancel out the 970Hz carrier?
Is there a virtual earth type arrangement where a signal is cancelled by an antiphase signal
ip - - [ A ] - - S - - [ B ] an unwanted signal at S is cancelled by a suitable generator B which is controlled by a Goertzel resonator?
It is similar to and Echo Cancellor that generates an anti-signal using adaptive filters.
So now we seems to have a Latice filter. aprox like this.
ip - - - S - - -[Z] - [Z] - +
\ / X / S - - -[Z] - [Z] - +
This is similar to my favourite sine wave generator as it is so simple.
x=x+y*n y=y-x*n
More Analysis is needed, and a better diagram.
It is worth trying it out.
This is similar idea to a Gyrator that models an inductor using op-amps and capacitors.
I = C dV/dt
V = L dI/dt
To model an inductor use a circuit that swaps I and V
See:- https://en.wikipedia.org/wiki/Gyrator