Hi all,
Was das Programm macht:
Es stellt, in Abhängigkeit der Frequenz die Signalqualität dar. Diese ist an der Hauptfrequenz eines Senders am stärksten, links und rechts davon schwächer. Es gibt einen Wasserfall-Effekt, sodass alte Werte immer weiter nach unten wandern. Da ich noch keine Antenne und Elektronik habe, um UKW zu empfangen und zu verwerten, habe ich mir fürs Erste Messwerte ausgedacht. Sie stammen aus einer Excel-Tabelle und hören auf die Funktion
1.)
In einem
Was passiert denn nun, wenn ich noch mehr Frequenzen haben möchte? Am besten per Button-Klick? Es geht mir darum, dass eine elektronische Schaltung ja noch viel, viel mehr Frequenzen bemerkt... Diese müssen auch als Wasserfall sichtbar sein, auch wenn man diese Frequenz aktuell gar nicht hört.
2.) Könntet ihr bitte einmal drüberschauen, ob ich etwas besser machen kann?
und die Klasse (der auskommentierte Block ist vom Probieren, kann auskommentiert bleiben)
Falls ihr euch wegen
Was das Programm macht:
Es stellt, in Abhängigkeit der Frequenz die Signalqualität dar. Diese ist an der Hauptfrequenz eines Senders am stärksten, links und rechts davon schwächer. Es gibt einen Wasserfall-Effekt, sodass alte Werte immer weiter nach unten wandern. Da ich noch keine Antenne und Elektronik habe, um UKW zu empfangen und zu verwerten, habe ich mir fürs Erste Messwerte ausgedacht. Sie stammen aus einer Excel-Tabelle und hören auf die Funktion
$$ \frac{13\cdot x^{4}}{14000000000000}-\frac{1073\cdot x^{3}}{84000000000}+\frac{803\cdot x^{2}}{14000000}-\frac{8023\cdot x}{84000} $$
, falls es jemand wissen will. Die 7080 Werte werden eingelesen. Ich habe die Messwerte absichtlich mit random.next
etwas versaut, um Unterschiede besser sehen zu können. Die Signale links und rechts werden mit größerem Abstand zur Hauptfrequenz schwächer. Das sieht man sehr schön. Hier sind aktuell 5 Farben zu sehen. 1.)
In einem
Timer_Tick
werden die Laufindexe der jeweiligen Klassen erhöht. Wir reden derzeit von 5 Klassen. Danach PictureBox1.Invalidate()
, aber asynchron. Das Thema hatten wir ja schon. Daher braucht es auch 5 Mal Klassex.Paint()
in der Private Sub PictureBox1_Paint
!Was passiert denn nun, wenn ich noch mehr Frequenzen haben möchte? Am besten per Button-Klick? Es geht mir darum, dass eine elektronische Schaltung ja noch viel, viel mehr Frequenzen bemerkt... Diese müssen auch als Wasserfall sichtbar sein, auch wenn man diese Frequenz aktuell gar nicht hört.
2.) Könntet ihr bitte einmal drüberschauen, ob ich etwas besser machen kann?
VB.NET-Quellcode
- 'Option Strict On wurde in den Projekteigenschaften aktiviert.
- 'Assembly-Sprache ist Deutsch (Deutschland).
- Imports System.Drawing.Drawing2D
- Public Class Form1
- Private Excel1 As New Microsoft.Office.Interop.Excel.Application
- Public S1 As New Signalvisualisierung(900)
- Public S2 As New Signalvisualisierung(895)
- Public S3 As New Signalvisualisierung(905)
- Public S4 As New Signalvisualisierung(890)
- Public S5 As New Signalvisualisierung(910)
- Private Werte_gelesen As Boolean = False
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- PictureBox1.BackColor = Color.FromArgb(0, 0, 50) 'Dunkelblau. ES IST WICHTIG, dass dieser Wert jetzt eine Vereinbarung ist, da später ein Wert draufaddiert wird!
- End Sub
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- If S1.dBm.Count = 0 OrElse S2.dBm.Count = 0 OrElse S3.dBm.Count = 0 Then Return
- Timer1.Start()
- End Sub
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- Timer1.Stop()
- End Sub
- Private Sub Button_load_Excel_Click(sender As Object, e As EventArgs) Handles Button_load_Excel.Click
- Dim rand As New System.Random()
- Dim akt_Wert As Double = -100.0
- Dim txt As String
- If System.IO.File.Exists("C:\Users\Bartosz\source\repos\VB.NET\Signalstärke visualisieren\Messwerte.xlsx") Then
- Excel1.Workbooks.Open("C:\Users\Bartosz\source\repos\VB.NET\Signalstärke visualisieren\Messwerte.xlsx")
- For i As Integer = 2 To 7082 Step 1
- txt = Excel1.Range("B" & i.ToString).Value().ToString
- Dim Parse_Result = Double.TryParse(txt, akt_Wert)
- If Parse_Result Then
- akt_Wert += CDbl(rand.Next(0, 3))
- S1.dBm.Add(akt_Wert)
- S2.dBm.Add(akt_Wert - 2.0) 'Links und rechts von der Mitte wird das Signal schwächer (wie in echt).
- S3.dBm.Add(akt_Wert - 2.0)
- S4.dBm.Add(akt_Wert - 4.0)
- S5.dBm.Add(akt_Wert - 4.0)
- Else
- Debug.WriteLine("Fehler bei der Umwandlung")
- End If
- Next
- End If
- Excel1.Application.Quit()
- Werte_gelesen = True
- End Sub
- Private Async Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
- S1.i += 1
- If S1.i > (S1.dBm.Count - 1) Then S1.i = 0
- S1.index_fuer_yPosition += 1
- If S1.index_fuer_yPosition > (S1.yPosition.Count - 1) Then S1.index_fuer_yPosition = 0
- S2.i += 1
- If S2.i > (S2.dBm.Count - 1) Then S2.i = 0
- S2.index_fuer_yPosition += 1
- If S2.index_fuer_yPosition > (S2.yPosition.Count - 1) Then S2.index_fuer_yPosition = 0
- S3.i += 1
- If S3.i > (S3.dBm.Count - 1) Then S3.i = 0
- S3.index_fuer_yPosition += 1
- If S3.index_fuer_yPosition > (S3.yPosition.Count - 1) Then S3.index_fuer_yPosition = 0
- S4.i += 1
- If S4.i > (S4.dBm.Count - 1) Then S4.i = 0
- S4.index_fuer_yPosition += 1
- If S4.index_fuer_yPosition > (S4.yPosition.Count - 1) Then S4.index_fuer_yPosition = 0
- S5.i += 1
- If S5.i > (S5.dBm.Count - 1) Then S5.i = 0
- S5.index_fuer_yPosition += 1
- If S5.index_fuer_yPosition > (S5.yPosition.Count - 1) Then S5.index_fuer_yPosition = 0
- Await Task.Run(Sub() PictureBox1.Invalidate())
- End Sub
- Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
- If Werte_gelesen Then
- S1.Paint(e.Graphics)
- S2.Paint(e.Graphics)
- S3.Paint(e.Graphics)
- S4.Paint(e.Graphics)
- S5.Paint(e.Graphics)
- End If
- End Sub
- End Class
und die Klasse (der auskommentierte Block ist vom Probieren, kann auskommentiert bleiben)
Falls ihr euch wegen
HelligkeitA * 1.243
wundert, das kommt deswegen, weil die mathematische, lineare Funktion die Dezibelwerte in Helligkeitswerte umwandeln soll. Nun ist es aber so, dass der PictureBox-Hintergrund dunkelblau sein soll (RGB(0,0,50)) und das Signal nicht dunkler sein soll, als der Hintergrund ist (und somit mindestens 50 sein muss). Daher darf die Funktion maximal 205 ausspucken. Die Rot- und Grün-Werte dürfen aber gerne bis 255 nauf gehen.VB.NET-Quellcode
- Public Class Signalvisualisierung
- Public dBm As New List(Of Double)
- Public i As Integer = 0
- Public Frequenz_in_Hz As Integer
- Public yPosition As New List(Of Integer)
- Public index_fuer_yPosition As Integer = 0
- Public Sub New(ByVal Fr As Integer)
- Me.Frequenz_in_Hz = Fr
- For J As Integer = 0 To 1000 Step 10
- yPosition.Add(J)
- Next
- End Sub
- Public Sub Paint(ByVal g As Graphics)
- g.SmoothingMode = SmoothingMode.AntiAlias
- g.CompositingQuality = CompositingQuality.HighQuality
- g.PixelOffsetMode = PixelOffsetMode.HighQuality
- g.InterpolationMode = InterpolationMode.HighQualityBilinear
- 'Dim rect_Streifen As New System.Drawing.Rectangle(Frequenz_in_Hz, yPosition(index_fuer_yPosition), 5, 10) 'zentral ← →
- ''mathematische Funktion g(x) = 2.5625 * x + 205 weil bei -80dBm die 50 sein soll und bei 0dBm die 205 (+50).
- ''Selbst bei schwächstem Signal erhalte ich kein Schwarz ;)
- 'Dim Helligkeit As Byte = CByte(Math.Round(2.5625 * dBm(i) + 205.0, 0))
- ' 'Form1.TextBox_Hell.Text = Helligkeit.ToString() & ", " & i.ToString() 'Kontrolle
- ' 'Form1.TextBox_Hell.Update()
- ' Dim R As Integer = CInt(Math.Round(Helligkeit * 1.243, 0))
- 'If R > 255 Then R = 255
- 'Dim Gr As Integer = CInt(Math.Round(Helligkeit * 0.4, 0))
- 'If Gr > 255 Then Gr = 255
- 'Dim B As Integer = 50 + Helligkeit
- 'If B > 255 Then B = 255
- '' 255 85 255
- 'Dim neue_Farbe As Color = Color.FromArgb(R, Gr, B)
- 'Using MyBrush = New SolidBrush(neue_Farbe)
- 'g.FillRectangle(MyBrush, rect_Streifen)
- 'End Using
- 'Je größer A wird, desto tiefer wird in die Vergangenheit geschaut. Weiter oben in PictureBox!
- 'Je öfter Invalidate() aufgerufen wird, desto weiter kommt die Schleife.
- For A As Integer = 0 To (yPosition.Count - 1) Step 1
- If (A) >= 0 AndAlso (A) < (yPosition.Count - 1) AndAlso (i - A) >= 0 Then
- Dim rect_StreifenA As New System.Drawing.Rectangle(Frequenz_in_Hz, yPosition(A), 5, 10)
- Dim HelligkeitA As Byte = CByte(Math.Round(2.5625 * dBm(i - A) + 205.0, 0))
- 'Form1.TextBox_Hell.Text = HelligkeitA.ToString() & ", " & i.ToString() 'Kontrolle
- 'Form1.TextBox_Hell.Update()
- Dim Red As Integer = CInt(Math.Round(HelligkeitA * 1.243, 0))
- If Red > 255 Then Red = 255
- Dim Gre As Integer = CInt(Math.Round(HelligkeitA * 0.4, 0))
- If Gre > 255 Then Gre = 255
- Dim Bl As Integer = 50 + HelligkeitA
- If Bl > 255 Then Bl = 255
- Dim neue_FarbeA As Color = Color.FromArgb(Red, Gre, Bl)
- Using MyBrush = New SolidBrush(neue_FarbeA)
- g.FillRectangle(MyBrush, rect_StreifenA)
- End Using
- End If
- Next
- End Sub
- End Class