Electronics > Projects, Designs, and Technical Stuff
Radio Direction Finding
PA3BNX:
Hello Everybody,
Recent programming done.
I did made an OneFix option in the NewMymapping145.exe
(SoundDoppler133aAll.zip)
Soon on the sites of PI4WAG and PA8W
So I can see Two last Arrows and all the fixes (where all the in memory bearings do cross)
or Just One Last Arrow and OneFix (as a Yellow Dot in center with a square around it)
where the most fixes are.
The map is divided in 10 by 10 squares.
Yes I see the TDOA PE5EDW
You also must use 4 antenna's hi just like the doppler.
Everybody is free to generate a file like Packet.txt and put that in the
same map where MyMapping.exe resides.
IF all okay it certainly wil plot on the UIV32 maps.
The packet.txt must contain something like:
(APRS101.PDF)
PA3BNX>APDF01:;BNX.DF912*162814/5157.80N/00534.23E\000/000/224/847 %DF224°/7 1458950 kHz
And it shows on the map.
You can also insert a GPS $GPRMC <cr>s tring with %333/9<cr>mixed
in MyMapping and it plots.
If you have APRSIS32.exe installed you can also plot on APRSIS32 Maps with the TDOA
Just press ctrl-p en you can copy and paste a file like packet.txt in it and it displays in APRSIS32
Also you can manual plot bearings as objects on APRSIS32.exe
SoundDoppler.exe can send through TCPIP the packet.txt automaticly to an APRSIS32 TEXT port
So it wil plot automaticly on APRIS32 maps and all other vieuwers with APRSIS32 if you have Inet connectivity.
Some of the code from DrawOneFix in MyMapping.exe
This shows the Yellow dot and Square box and amounth of fixes in that square box.
All the fixes are in arrFixedPixel already in pixel coordinates of the map.
--- Code: ---
Public Sub DrawOneFix()
''ToDo
''Not ready yet
''03-04-2013
''06-04-2013
''08-04-2013
''09-04-2013
''Only Call this sub after Sub CalcFixes
''Something Like DDF007 R&S
''Divide map in 10 by 10 also 100 squares
''Check Each fix to see if it's on the map
''Then count how many fixes are in each square
''Then draw one dot at the center of the square where the most fixes are
''Const integer
Const t As Integer = 10 ''X and Y division squares
''Integer
Dim arrSquare((t * t) - 1) As Integer ''This array has 100 elements
Dim c As Integer
Dim c1 As Integer
Dim x As Integer
Dim v As Integer
Dim yRow As Integer
Dim xRow As Integer
Dim m As Integer
''Float
Dim Xpixel As Single
Dim Ypixel As Single
Dim xs As Single
Dim ys As Single
''String
Dim myval As String
''Divide map in 10 x 10 squares
''Example squares of map
''Use this one
''00 01 02 03 04 05 06 07 08 09 -xRows
''10 11 12 13 14 15 16 17 18 19
''20 21 22 23 24 25 26 27 28 29
''30 31 32 33 34 35 36 37 38 39
''40 41 42 43 44 45 46 47 48 49
''50 51 52 53 54 55 56 57 58 59
''60 61 62 63 64 65 66 67 68 69
''70 71 72 73 74 75 76 77 78 79
''80 81 82 83 84 85 86 87 88 89
''90 91 92 93 94 95 96 97 98 99
'-yRows
''Count the dots in a squares
''Format arrFixedPixel X and Y fix
xs = CSng(Pict1Width / t)
ys = CSng(Pict1Height / t)
For x = 0 To MaxFixes
If CheckFixOnMap(arrFixedPixel(x, 0), arrFixedPixel(x, 1)) Then ''No fix on map
''Do not round but take integer values
''Find yRow
yRow = CInt((CSng(arrFixedPixel(x, 1)) / ys) + 0.5) ''Value between 0 and 10
yRow = yRow - 1
If yRow < 0 Then yRow = 0 ''Value between 0 and 9
''Find xrow
xRow = CInt((CSng(arrFixedPixel(x, 0)) / xs) + 0.5) ''Value between 0 and 10
xRow = xRow - 1
If xRow < 0 Then xRow = 0 ''Value between 0 and 9
''Create the index here 0 > 99
c = (yRow * t) + xRow
If c <= UBound(arrSquare) Then
''Count here
arrSquare(c) += 1
Else
Debug.Print("Sub DrawOneFix error=" & xRow & "*" & yRow & " = " & c)
End If
End If
Next x
''Find the index count square with most fixes
''What if there is 2 or more the maximums ?
c = 0 ''Must reset c here because it's used
For x = LBound(arrSquare) To UBound(arrSquare)
If arrSquare(x) > c Then
c = x ''Index number where max value is
v = arrSquare(x) ''Max value
End If
Next x
''Nothing found No fixes on map
If c = 0 Then Exit Sub
''Backup Index for drawing amount off fixes in rectangle x
c1 = c
''Search for more then 1 maximum
''Dot is color coral if more then 2 and > 2 color dark red the same maximums.
For x = LBound(arrSquare) To UBound(arrSquare) Step 1
If v > 0 Then
If v = arrSquare(x) Then
m += 1
End If
End If
Next x
''c is the index number of arrSquare
''Extract xRow and yRow from c
myval = c.ToString
If myval.Length < 3 Then
myval = "0" & myval
End If
yRow = CInt(Val((myval.Substring(0, myval.Length - 1))))
xRow = CInt(Val((myval.Substring(myval.Length - 1, 1))))
''Because it goes from 0 to 9
''Make it go from 1 to 10
xRow += 1
yRow += 1
''Take center x and y coordinate of c
''ReCalc xRow and yRow in pixels
Xpixel = CSng((xRow * xs) - (0.5 * xs))
Ypixel = CSng((yRow * ys) - (0.5 * ys))
''Plot the OneFix dot
''Size of circle
v = 6
c = 2 * v
''Object
Dim grp As Graphics
Dim p As Pen
Dim newfont As Font
With My.Forms.Form1
grp = .PictureBox1.CreateGraphics
p = New Pen(Color.Black, 2)
'Debug.Print("Sub DrawOneFix")
'Debug.Print("c=" & arrSquare(c1) & " Field(0>99)=" & c1)
'Debug.Print("m=" & m)
Select Case m
Case 0, 1
grp.FillEllipse(Brushes.Yellow, Xpixel - v, Ypixel - v, c, c)
Case 2
grp.FillEllipse(Brushes.Coral, Xpixel - v, Ypixel - v, c, c)
Case Else
grp.FillEllipse(Brushes.DarkRed, Xpixel - v, Ypixel - v, c, c)
End Select
v = v + 1
c = 2 * v
grp.DrawEllipse(p, Xpixel - v, Ypixel - v, c, c)
''Draw a rectangle around the dot
v = CInt(0.5 * xs)
c = CInt(0.5 * ys)
p = New Pen(Color.Black, 1)
grp.DrawRectangle(p, Xpixel - v, Ypixel - c, xs, ys)
newfont = New Font("sans MS", 8, FontStyle.Bold)
grp.DrawString(arrSquare(c1).ToString & " x", newfont, Brushes.Black, Xpixel - v, Ypixel - c)
End With
p.Dispose()
newfont.Dispose()
grp.Dispose()
End Sub
--- End code ---
Have fun experimenting.
PA3BNX:
Hello EveryBody,
I am working on a new function
MaxTopDetector in SoundDoppler.exe
That should it make possible to
use 4 Yagi's or other directivity antenna's
And detect in mode AM or tapping from AGC from a reciever
and get the direction from it.
With almost exact the same supersimplesounddoppler hardware.
Just replace the monopole Antenna's for 4 small yagi's pointing in 4 directions
Some code in visual basic for this kind of detector
--- Code: ---
Public Function MaxTopDetector() As String
''ToDo
''18-04-2013
''19-04-2013
''22-04-2013
''Amplitude peiler
''Find maximum amplitude in SCF
''Try to extract max adjacent max amplitude width
''Average x1 and x2 and recalc to degrees
''Also try to calculate the Q ?
''Not ready yet
''Const Float
Const threshold As Single = 0.3 ''Percentage
''Integer
Dim x As Integer
Dim x1 As Integer
Dim x2 As Integer
Dim max As Long
Dim min As Long
Dim smax As Long
Dim Max1 As Long
Dim Min1 As Long
''String
Dim arrmax As String
Dim myval As String
''Remember
''UboundArrSwitchCap1 Used size
''UboundArrSwitchCap Real size
''Find Max and Min
For x = 0 To UboundArrSwitchCap1
Select Case arrSwitchCap(x)
Case Is > max
max = arrSwitchCap(x)
Case Is < min
min = arrSwitchCap(x)
End Select
Next x
''Could be a spike but not likely because of SCF
If max > Math.Abs(min) Then
smax = 1
ElseIf Math.Abs(min) > max Then
smax = 2
Else
MaxTopDetector = strcEmpty
Debug.Print "Whoops bad directive antenna's or NoSignal"
Exit Function
End If
Max1 = max - (threshold * max)
Min1 = min - (threshold * min)
''Fill threshold level adjacent values arrays
For x = 0 To UboundArrSwitchCap
Select Case arrSwitchCap(x)
Case max, Is > Max1
arrmax = arrmax & "1"
Case min, Is < Min1
arrmax = arrmax & "2"
Case Else
arrmax = arrmax & "0"
End Select
Next x
''Search for max value adjacent in arrmax
Select Case smax
Case 1 ''Pos
For x = Len(arrmax) To 1 Step -1
myval = String(x, "1")
x1 = InStr(1, arrmax, myval)
If x1 > 0 Then
''ArrSwitchCap filter is zero based
''The arrmax is 1 based
x1 = x1 - 1
x2 = x1 + Len(myval)
Exit For
End If
Next x
Call CalcAdjacentTopMax(arrmax, smax, x1, x2)
Case 2 ''Neg
For x = Len(arrmax) To 1 Step -1
myval = String(x, "2")
x1 = InStr(1, arrmax, myval)
If x1 > 0 Then
''ArrSwitchCap filter is zero based
''The arrMax is 1 based
x1 = x1 - 1
x2 = x1 + Len(myval)
Exit For
End If
Next x
Call CalcAdjacentTopMax(arrmax, smax, x1, x2)
End Select
''Average maximum
x = Round((x1 + x2) * 0.5)
''It can be negative if changed by CalcAdjacentTopMax
''If negative add x
If x < 0 Then
x = UboundArrSwitchCap + x
End If
''Calc degrees
MaxTopDetector = Conv3(Str$(x) * ZeroCrossFactor)
End Function
Public Sub CalcAdjacentTopMax(ByVal arrmax As String, ByVal smax As String, ByRef x1 As Integer, ByRef x2 As Integer)
''ToDo
''21-04-2013
''22-04-2013
''Calc MaxTop if it is around 0 degrees
''Only Called from Sub MaxTopDetector
''Integer
Dim x As Integer
Dim x12 As Integer
Dim x22 As Integer
Dim h As Integer
''String
Dim arrmax1 As String
Dim myval As String
''Nothing ToDo
If Left$(arrmax, 1) <> smax And Right$(arrmax, 1) <> smax Then Exit Sub
''Pre add last elements from string arrMax
h = Len(arrmax) \ 4
arrmax1 = Right$(arrmax, h) & Left$(arrmax, h)
For x = Len(arrmax1) To 1 Step -1
myval = String(x, smax)
x12 = InStr(1, arrmax1, myval)
If x12 > 0 Then
''ArrSwitchCap filter is zero based
''The arrmax is 1 based
x12 = x12 - 1
x22 = x12 + Len(myval)
Exit For
End If
Next x
''Change x1 and x2
If (x2 - x1) < (x22 - x12) Then
x1 = x12 - h
x2 = x22 - h
End If
End Sub
--- End code ---
I hope to release the next version of sounddoppler134All.zip soon on our web sites.
Today 22-04-2013
I did fix some bugs in the above
Subroutines.
Code above also fixed
They seem to work okay now.
Today 23-04-2013
Uploaded a picture of extreme situation with 4 Uni directional antennas
I hope MaxTopDector can handle them all.
I am also improving the SinCos detector
So after some test the new version SoundDoppler134All.zip wil be on our sites.
PA3BNX:
Hello everybody,
The new version is on our sites SoundDoppler134aAll.zip
I have fixed some issues with the SinCosDetector.
It now runs excelent even without the lowpasfilters.
It's even better then the ZerocrossDetector.
I also improved the software squelch routines.
The New SinCosDetector
--- Code: ---
Public Function SinCosDetector() As String
''ToDo
''22-04-2013
''25-04-2013
''Runs excellent
''Integer
Dim x As Integer
Dim Y As Integer
''Float
Dim Degrees As Double
Dim SinSum As Double
Dim CosSum As Double
Dim z As Double
''UboundArrSwitchCap Real Size
''UboundArrSwitchCap1 Used Elements
Y = UboundArrSwitchCap + 1
For x = 0 To UboundArrSwitchCap
z = twopi * (x / Y)
SinSum = SinSum + (arrSwitchCap(x) * Math.Sin(z))
CosSum = CosSum + (arrSwitchCap(x) * Math.Cos(z))
Next x
''Now check kwadrant ambiguity
''Nothing there
If SinSum = 0 And CosSum = 0 Then
SinCosDetector = strcEmpty
Exit Function
End If
If CosSum = 0 Then
z = 1000000 ''Must be large ''No division by zero
Else
z = SinSum / CosSum
End If
''Debug.Print SinSum, CosSum, Round(Degrees)
If SinSum = 0 Then SinSum = 0.0000001
''Now SinSum <> 0 and CosSum <> 0
''Sin = y axis
''Cos = x axis
''Atn(y/x) * rad1
''Atn gives from -90 to + 90 degrees * pi/180 (Rad1)
Degrees = Math.Atn(z) * rad1
''Find the right degrees
If SinSum < 0 And CosSum > 0 Then
''0 to 90 = -90 to 0
''Debug.Print "1 " & Degrees & strcDegrees
Degrees = 90 - Math.Abs(Degrees)
GoTo under
End If
If SinSum > 0 And CosSum > 0 Then
'' 90 to 180 = 0 to 90
''Debug.Print "2 " & Degrees & strcDegrees
Degrees = 90 + Degrees
GoTo under
End If
If SinSum < 0 And CosSum < 0 Then
''270 > 360 90 to 0
''Debug.Print "3 " & Degrees & strcDegrees
Degrees = 270 + Degrees
GoTo under
End If
If SinSum > 0 And CosSum < 0 Then
''180 to 270 = -90 to 0
''Debug.Print "4 " & Degrees & strcDegrees
Degrees = 270 + Degrees
GoTo under
End If
Debug.Print "Sub SinCosError " & Time$
under:
''It may not be larger then 360 or lower then 0 degrees
Select Case Degrees
Case Is >= 360
Degrees = Degrees - 360
Case Is < 0
Degrees = 360 - Degrees
End Select
SinCosDetector = Conv3(Str$(Math.Round(Degrees)))
End Function
--- End code ---
This detector gives good results
It's like a correlator
It also can be used for an Amplitude Direction Finder
like having 4 yagi's pointing to 4 directions NSEW
Just set the reciever to AM detection
Picture contains a SuperSimpleSoundDoppler softswitcher
ala PA8W generator.
Happy FoxHunting Testing etc.
PA3BNX:
Hello Every Body,
I have a new version SoundDoppler135All.zip with
a possibilty of 4 calibration tables and improved squelch detection
and the sincos detector has now also correlation methode.
It runs very good now
Further are we designing and building a new mobile antenny array
With a flat plate antenna
You must have a reciever with mode AM to use it.
Take a look at this patent.
PA3BNX:
Hello Everybody,
Working on the new am plate antenna for my software
I show you some antenna types that can be used for
automatic radio direction finding that can he made
for radio amateur applications
Further a suggestion how to make the plate am direction finder
working with my software.
Navigation
[0] Message Index
[#] Next page
[*] Previous page
Go to full version