AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Zeitkritisch Thread

Ein Thema von juelin · begonnen am 9. Jun 2024 · letzter Beitrag vom 10. Jun 2024
Antwort Antwort
juelin

Registriert seit: 9. Mai 2006
Ort: Mannheim
139 Beiträge
 
Delphi XE5 Professional
 
#1

Zeitkritisch Thread

  Alt 9. Jun 2024, 18:01
Liebe Delphi Gemeinde,
ich bin seit den 2000er Jahren bis heute treuer Anhänger von Delphi (mit Delphi 3 angefangen).
Zur Zeit arbeite ich mit Delphi 11.2 auf Windows 10.
Da ich Funkamateur bin (DG5UAP) will ich ein Programm schreiben, welches von den Wettersatelliten (NOAA) die Wetterbilder (FAX) empfängt
und anzeigt.
Ich bin auch schon ganz schön weit gekommen.
Dazu benutze ich das Audiosignal von der Soundkarte mit dem Tool BASS.dll.
Das FAX liegt auf 2400 Hz im Volumen (0%=Schwarz, 100%=Weiß) mit 64 Graustufen in der Geschwindigkeit von 120 Baud.
Und nun stosse ich an die Grenzen von Delphi.
BASS.dll übergibt standardmässig alle 100ms die Audiodaten. Das ergibt aber nur 10 Baud.
Man kann natürlich den Zeitintervall in BASS.dll einstellen, ich bräuchte einen Zeitintervall von 8ms = 125 Baud.
Ob BASS.dll das mit macht weiss ich nicht.
Des wieteren müssen die anfallenden Daten ja verarbeitet werden und das bracht auch Zeit.
Zur Zeit komme ich da auf 200ms pro Datenstream.
Für BASS.dll rufe ich die Daten mit BASS_RecordStart(0,2,0,@RecordingCallback,nil); ab.
In der Routine RecordingCallback(Handle: HRecord; buffer: Pointer; length: DWord; user: Pointer): boolean; stdcall; bekomme ich die Daten geliefert.
Da das alles zu langsam ist habe ich mir folgendes ausgedacht (weiss nicht ob das die beste Lösung ist).
Ich mache einen Thread, dem ich die Daten von BASS.dll in einer Pipeline übergebe.
Dann spielt es keine Rolle wie lange der Thread braucht (der hinkt dann natürlich immer nach).
Ich brauche aber auch Rückmeldungen vom Thread für maine Main-Unit, damit ich globale Variablen laden kann.
In der Routine RecordingCallback brauche ich dann nur die Daten in die Pipeline stellen und den Trhread aufrufen. Das sollte in 8ms zu machen sein.
Sowas habe ich noch nie gemacht und ich brauche Eure Hilfe.
1. Wie erzeuge ich aus Delphi einen Thread.
2. Wie gestallte ich eine Pipeline.
3. Wie gebe ich aus dem Thread Rückmeldunegn an die Main-Unit.
Wenn es geht gebt mit bitte Demosouce mit.
Anbei noch ein paar Bilder von dem was ich schon habe.
Bild1 = Empfang des Audiosignals mit Frequenzspectroskop (man sieht den 2400 Hz Peak gut).
Bild2 = Auswerung der empfangenen Signale mit Graphik des Volumen im 64 Stufen Raster.
Multispectralbild NOAA 19. So was sollte am Ende rauskommen.
Vielen Dank für Eure Hilfe.
Gruß
Jürgen
Miniaturansicht angehängter Grafiken
bild1.jpg   bild2.jpg   multispectralbild-31.05.24.jpg  
Jürgen Linder

Geändert von juelin ( 9. Jun 2024 um 18:06 Uhr)
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
194 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Zeitkritisch Thread

  Alt 9. Jun 2024, 19:41
Hallo Jürgen,

über Threads und Piplines mit Delphi gibts viel Info im Netz.
Ich vermute aber, dass Du einen Fehler in Deinem Denkansatz hast.
Das Audiosignal ist eigentlich kontinuierlich, wird aber halt Blockweise verarbeitet, daher muss die Takung der Datenlieferung durch BASS nicht mit der Baudrate korreliert sein. Sondern Du musst die Daten zusammensetzen und dann alle 400 Samples (bei 48 kSamples/s) eine Probe nehmen.
Wenn der S/N passt, dann kannst Du einfache einen Block (eine Wellenlänge lang, bei 48KHz, 20 Samples) nehmen und dann davon die Spitzenamplitude (oder Mittel 200 Samples o.ä.).
Wichtig wäre a) eine Referenz für 100% b) ein genauer Startpunkt, so dass du in der Mitte jeder Information die Probe entnimmst.
Sollte der S/N nicht ausreichen, dann entweder einen analogen Bandfilter vor der Auswertung drüber laufen lassen, oder halt eine FFT machen (da aber halt nur 256 Bytes) und dann die Amplitdue auswerten.
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.940 Beiträge
 
Delphi 12 Athens
 
#3

AW: Zeitkritisch Thread

  Alt 10. Jun 2024, 08:02
Des wieteren müssen die anfallenden Daten ja verarbeitet werden und das bracht auch Zeit.
Zur Zeit komme ich da auf 200ms pro Datenstream.
Ich bin da nicht im Thema, aber wenn ich so eine Aufgabe sehe, dann meine ich, dass man erstmal schnellstmöglich alle Daten sammeln sollte,
und diese nicht direkt beim Empfang verarbeiten.
Erst dann, wenn das Satellit weg ist, dann kann man alles in Ruhe verarbeiten.

Oder sehe ich das falsch, if gibt doch glaube ich nur 3 NOAA Satelliten, welche nicht permanent empfangbar sind,
sondern nur kurze Zeit, oder etwa doch?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz