<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=us-ascii" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 8.00.6001.23562"></HEAD>
<BODY>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial>Well, that was easier than I thought it would
be.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial>I've now got a function in Excel that predicts the RC factors
for the all-pass filters in any 90-degree PDN. Here is the
function:</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial>PDN90RC(F1, F2, NN, N)</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial>I've made it so that NN is the number of filter stages in each
chain, so half the total. This way, it confines one to an even number of
filter stages. So, for the classic 15 Hz to 15 kHz unit with 12 filter
stages, NN = 6, and the function would be:</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial>PDN90RC(15, 15000, 6, 1) = 0.0301</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial>If one sets up a column of integers from 1 to 12,
and puts the function next to that with those cell values as N, then one gets
the following:</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021></SPAN> </DIV><SPAN
class=565232304-06012021>
<DIV dir=ltr align=left>
<TABLE style="WIDTH: 129pt; BORDER-COLLAPSE: collapse" border=0 cellSpacing=0
cellPadding=0 width=172 x:str>
<COLGROUP>
<COL style="WIDTH: 60pt" width=80>
<COL style="WIDTH: 69pt; mso-width-source: userset; mso-width-alt: 2616"
width=92>
<TBODY>
<TR style="HEIGHT: 15.75pt" height=21>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; WIDTH: 60pt; HEIGHT: 15.75pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
height=21 width=80 align=right x:num><FONT face=Arial>1</FONT></TD>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; WIDTH: 69pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
class=xl22 width=92 align=right x:num="3.0099754398651757E-2"><FONT
face=Arial>3.0100E-02</FONT></TD></TR>
<TR style="HEIGHT: 15.75pt" height=21>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; HEIGHT: 15.75pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
height=21 align=right x:num><FONT face=Arial>2</FONT></TD>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
class=xl22 align=right x:num="8.6072053671113532E-3"><FONT
face=Arial>8.6072E-03</FONT></TD></TR>
<TR style="HEIGHT: 15.75pt" height=21>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; HEIGHT: 15.75pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
height=21 align=right x:num><FONT face=Arial>3</FONT></TD>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
class=xl22 align=right x:num="3.8927476000830221E-3"><FONT
face=Arial>3.8927E-03</FONT></TD></TR>
<TR style="HEIGHT: 15.75pt" height=21>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; HEIGHT: 15.75pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
height=21 align=right x:num><FONT face=Arial>4</FONT></TD>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
class=xl22 align=right x:num="1.9037436952639975E-3"><FONT
face=Arial>1.9037E-03</FONT></TD></TR>
<TR style="HEIGHT: 15.75pt" height=21>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; HEIGHT: 15.75pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
height=21 align=right x:num><FONT face=Arial>5</FONT></TD>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
class=xl22 align=right x:num="9.4806261012010803E-4"><FONT
face=Arial>9.4806E-04</FONT></TD></TR>
<TR style="HEIGHT: 15.75pt" height=21>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; HEIGHT: 15.75pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
height=21 align=right x:num><FONT face=Arial>6</FONT></TD>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
class=xl22 align=right x:num="4.7421695335205682E-4"><FONT
face=Arial>4.7422E-04</FONT></TD></TR>
<TR style="HEIGHT: 15.75pt" height=21>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; HEIGHT: 15.75pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
height=21 align=right x:num><FONT face=Arial>7</FONT></TD>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
class=xl22 align=right x:num="2.3739997513812038E-4"><FONT
face=Arial>2.3740E-04</FONT></TD></TR>
<TR style="HEIGHT: 15.75pt" height=21>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; HEIGHT: 15.75pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
height=21 align=right x:num><FONT face=Arial>8</FONT></TD>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
class=xl22 align=right x:num="1.1874647489957513E-4"><FONT
face=Arial>1.1875E-04</FONT></TD></TR>
<TR style="HEIGHT: 15.75pt" height=21>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; HEIGHT: 15.75pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
height=21 align=right x:num><FONT face=Arial>9</FONT></TD>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
class=xl22 align=right x:num="5.9135635335742968E-5"><FONT
face=Arial>5.9136E-05</FONT></TD></TR>
<TR style="HEIGHT: 15.75pt" height=21>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; HEIGHT: 15.75pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
height=21 align=right x:num><FONT face=Arial>10</FONT></TD>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
class=xl22 align=right x:num="2.8920213818498576E-5"><FONT
face=Arial>2.8920E-05</FONT></TD></TR>
<TR style="HEIGHT: 15pt" height=20>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; HEIGHT: 15pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
height=20 align=right x:num><FONT face=Arial>11</FONT></TD>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
class=xl22 align=right x:num="1.3079633648106397E-5"><FONT
face=Arial>1.3080E-05</FONT></TD></TR>
<TR style="HEIGHT: 15pt" height=20>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; HEIGHT: 15pt; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
height=20 align=right x:num><FONT face=Arial>12</FONT></TD>
<TD
style="BORDER-BOTTOM: #ece9d8; BORDER-LEFT: #ece9d8; BACKGROUND-COLOR: transparent; BORDER-TOP: #ece9d8; BORDER-RIGHT: #ece9d8"
class=xl22 align=right x:num="3.7401997187326388E-6"><FONT
face=Arial>3.7402E-06</FONT></TD></TR></TBODY></TABLE></DIV>
<DIV dir=ltr align=left><FONT color=#0000ff size=2
face=Arial></FONT> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial>I have confirmed that these are exactly the same values
generated by the QuadNet program. The cool thing is that this still works
if you exchange the two end frequencies, so:</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial>PDN90RC(15000, 15, 6, 1) = 0.0301</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face=Arial>Remember that one filter chain takes the odd-numbered RC
values, and the other filter chain takes the even-numbered RC
values.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><FONT color=#0000ff size=2
face=Arial></FONT> </DIV>
<DIV dir=ltr align=left></SPAN><SPAN class=565232304-06012021><FONT
color=#0000ff size=2 face=Arial>Here is the code:</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2
face="Courier New">----------------------------------------------------------------------</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New">Option Base 0<BR>Function PDN90RC(f1, f2, nn,
n)</FONT></SPAN></DIV>
<DIV><FONT face="Courier New"></FONT> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New">Dim k(8) As Double<BR>Dim kp(8) As Double<BR>Dim sn(8)
As Double</FONT></SPAN></DIV>
<DIV><FONT face="Courier New"></FONT> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New">Pi = 3.14159265359<BR>f = (f1 * f2) ^ (0.5)<BR>kp(0) =
f1 / f2</FONT></SPAN></DIV>
<DIV><FONT face="Courier New"></FONT> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New">For j = 1 To 8<BR> k(j) = (1 - kp(j - 1)) / (1 +
kp(j - 1))<BR> kp(j) = (1 - k(j) ^ 2) ^ (0.5)<BR>Next
j</FONT></SPAN></DIV>
<DIV><FONT face="Courier New"></FONT> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New">sn(8) = Sin((2 * n - 1) * (Pi / 2) / (4 * nn))<BR>For
j = 7 To 0 Step -1<BR> sn(j) = (1 + k(j + 1)) * sn(j + 1) / (1 + k(j + 1)
* sn(j + 1) ^ 2)<BR>Next j<BR>cn = (1 - sn(0) ^ 2) ^ (0.5)<BR>pole = kp(0) ^
(-0.5) * cn / sn(0)</FONT></SPAN></DIV>
<DIV><FONT face="Courier New"></FONT> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New">PDN90RC = pole / (2 * Pi * f)</FONT></SPAN></DIV>
<DIV><FONT face="Courier New"></FONT> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New">End Function<BR></FONT></SPAN><SPAN
class=565232304-06012021><FONT color=#0000ff size=2
face="Courier New">---------------------------------------------------------------------</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New"><FONT face=Arial>The thing to note about this code is
that I discovered that 8 successive Landen transformations are enough to
get to k = 0 and k' = 1 from any starting k' value, and therefore, sn(u,k) =
sin(u). No matter the value of k' (which is F1/F2), this result
is always reached within 8 transformation steps. Sometimes, of
course, it is reached in fewer steps, but I just set the number of
transformations to 8. The variables sn(0) and cn are the Jacobi elliptic
sine and cosine, from which the filter poles are calculated
directly.</FONT></FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New"></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New"><FONT face=Arial>This was
fun.</FONT></FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New"></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New"><FONT face=Arial>Cheers,</FONT></FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=565232304-06012021><FONT color=#0000ff
size=2 face="Courier New"><FONT
face=Arial>Doc Sketchy</FONT> </DIV></FONT></SPAN><BR>
<DIV dir=ltr lang=en-us class=OutlookMessageHeader align=left>
<HR tabIndex=-1>
<FONT size=2 face=Tahoma><B>From:</B> Synth-diy
[mailto:synth-diy-bounces@synth-diy.org] <B>On Behalf Of </B>David G
Dixon<BR><B>Sent:</B> Tuesday, January 05, 2021 6:42 PM<BR><B>To:</B>
'synth-diy@synth-diy.org'<BR><B>Subject:</B> [sdiy] 90-degree phase displacement
network calculations<BR></FONT><BR></DIV>
<DIV></DIV><SPAN
style="BACKGROUND-COLOR: #ffecb3; COLOR: #000000; FONT-SIZE: 12px"><SPAN
style="BACKGROUND-COLOR: #ffecb3; COLOR: #000000; FONT-SIZE: 12px"><SPAN
style="PADDING-BOTTOM: 3px; LINE-HEIGHT: 1.6; BACKGROUND-COLOR: #ffecb3; FONT-STYLE: normal; PADDING-LEFT: 3px; PADDING-RIGHT: 3px; COLOR: #000000; FONT-SIZE: 12px; FONT-WEIGHT: normal; PADDING-TOP: 3px">[<STRONG>CAUTION:</STRONG>
Non-UBC Email]</SPAN></SPAN></SPAN>
<DIV><FONT size=2 face=Arial><SPAN class=619271402-06012021>Hello SDIY
Team,</SPAN></FONT></DIV>
<DIV><FONT size=2 face=Arial><SPAN
class=619271402-06012021></SPAN></FONT> </DIV>
<DIV><FONT size=2 face=Arial><SPAN class=619271402-06012021>So, ever since I've
been building Bode frequency shifters, I've been curious about how to actually
design best-case 90-degree phase displacement networks. Here's a brief
history of my experience with this:</SPAN></FONT></DIV>
<DIV><FONT size=2 face=Arial><SPAN
class=619271402-06012021></SPAN></FONT> </DIV>
<DIV><FONT size=2 face=Arial><SPAN class=619271402-06012021>First, I used the
numbers in the Electronotes article, EN-168.</SPAN></FONT></DIV>
<DIV><FONT size=2 face=Arial><SPAN
class=619271402-06012021></SPAN></FONT> </DIV>
<DIV><FONT size=2 face=Arial><SPAN class=619271402-06012021>Then I discovered
the QuadNet program on the internet, which gives more accurate PDNs than the
Electronotes numbers. </SPAN></FONT><FONT size=2 face=Arial><SPAN
class=619271402-06012021>However, the QuadNet program is a pain to use, and
restricts one to certain frequency ranges. For example, you can't have a
low frequency lower than 1 Hz, or a frequency range higher than 4 orders of
magnitude. I want to go lower and broader.</SPAN></FONT></DIV>
<DIV><FONT size=2 face=Arial><SPAN
class=619271402-06012021></SPAN></FONT> </DIV>
<DIV><FONT size=2 face=Arial><SPAN class=619271402-06012021>So, the Electronotes
method is an approximation to the problem reported by Weaver in
1954 (which I tracked down). It's easy to use, but does not give true
Chebyshev approximation accuracy.</SPAN></FONT></DIV>
<DIV><FONT size=2 face=Arial><SPAN
class=619271402-06012021></SPAN></FONT> </DIV>
<DIV><FONT size=2 face=Arial><SPAN class=619271402-06012021>I contacted the guy
who wrote the QuadNet program to see if he could give me the source of the math
he used in the program. He had forgotten, and didn't have any
documentation.</SPAN></FONT></DIV>
<DIV><FONT size=2 face=Arial><SPAN
class=619271402-06012021></SPAN></FONT> </DIV>
<DIV><FONT size=2 face=Arial><SPAN class=619271402-06012021>So, I started
looking up the original references for this problem. After much hunting, I
found Darlington's paper from 1950 in the Bell Labs technical journal. It
explains the problem, but not in a way in which my tiny brain could
make immediate use.</SPAN></FONT></DIV>
<DIV><FONT size=2 face=Arial><SPAN
class=619271402-06012021></SPAN></FONT> </DIV>
<DIV><FONT size=2 face=Arial><SPAN class=619271402-06012021>After a bit
more searching, I found a Masters thesis by a guy named Donald Douglas from
1961, and his references included another 1950 paper by a guy named Orchard
from a journal called Wireless Engineer. I finally found a PDF of this
article on the web lastnight, and I have now been able to exactly
reproduce my designs from QuadNet using the techniques in this paper.
Thankfully, there is a very nice numerical example in the paper which
demonstrates the use of the Landen transformation to calculate Jacobi's elliptic
sine function from circular sines. With this, it is trivially easy to find
the correct RC factors for the chains of first-degree allpass
filters.</SPAN></FONT></DIV>
<DIV><FONT size=2 face=Arial><SPAN
class=619271402-06012021></SPAN></FONT> </DIV>
<DIV><FONT size=2 face=Arial><SPAN class=619271402-06012021>As of now, I can do
it very quickly in an Excel spreadsheet, but I'm going to write a function
subprogram in Visual Basic that will make the RC factors available as
an Excel function -- something like PDN90RC(F1, F2, N, n) where F1 and F2 are
the mininum and maximum frequencies, N is the total number of filter stages, and
n is the filter stage of interest.</SPAN></FONT></DIV>
<DIV><FONT size=2 face=Arial><SPAN
class=619271402-06012021></SPAN></FONT> </DIV>
<DIV><FONT size=2 face=Arial><SPAN class=619271402-06012021>I'll let you all
know when I've got the function subprogram figured out. Maybe I'll write a
little paper about it as well.</SPAN></FONT></DIV>
<DIV><FONT size=2 face=Arial><SPAN class=619271402-06012021></SPAN></FONT><FONT
size=2 face=Arial><SPAN class=619271402-06012021></SPAN></FONT> </DIV>
<DIV><FONT size=2 face=Arial><SPAN
class=619271402-06012021>Cheers,</SPAN></FONT></DIV>
<DIV><FONT size=2 face=Arial><SPAN class=619271402-06012021>Doc
Sketchy</SPAN></FONT></DIV></BODY></HTML>