Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Audio MorseZeichen in Schrift Morsezeichen übersetzen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Nils



Anmeldungsdatum: 24.03.2006
Beiträge: 187

BeitragVerfasst am: 27.11.2019, 19:18    Titel: Audio MorseZeichen in Schrift Morsezeichen übersetzen Antworten mit Zitat

Hi!

Ich lerne gerade morsen. Also ich versuch's mal.
Dazu gibt es Audiodateien(.mp3), die die Morsezeichen [langer Ton. kurzer Ton, Pause] einem Vorspielen. [Da wird dann dazwischen auch gesprochen. Üblicherweise werden Gruppen zu fünf Buchstaben 'gegeben'. Zw. 2 Buchstaben je eine Pause.]
Ich suche eine Möglichkeit dieses Audiodatei-Morsezeichen in kurz-lang-pause Schriftdarstellung zu konvertieren.

Bsp.: Ein "q" besteht aus den 4 Tönen [pause,] lang, lang, kurz, lang[, pause]. Die sollen übersetzt werden in [p]-peinlich[p] und in einer Datei abgelegt werden.
qb hiesse so: [p]-peinlich -...[p]

Geht so etwas mit QB?
Wie macht man das?
Gibt es das schon Beispielcodes?

Hat da jemand im Forum eine Idee?

ps. link zu einer solchen Audiodatei: https://dj1kn.darc.de/morsenlernen001.htm

pps Woher kommt jetzt der blaue Smiley? dann eben so.
b: l l k l
qb: l k k k
_________________
Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 947
Wohnort: Ruhrpott

BeitragVerfasst am: 27.11.2019, 20:34    Titel: Antworten mit Zitat

Hmm, das wäre ein schönes Thema für ein kleines Weihnachtsprojekt. lächeln

So ganz spontan fällt mir dazu folgender Lösungansatz ein: Zuerst wird die Audiodatei zwecks besserer Analysierbarkeit von mp3 nach wav konvertiert. Anschließend wird die Datei in Abschnitte von (beispielsweise) 1 ms zerlegt und jeder Abschnitt auf "Ton" (= 1) oder "kein Ton" (= 0) untersucht. Dabei ergibt sich eine Folge von Nullen und Einsen, die schon recht genau den Punkten und Strichen entspricht.

Das Programm müsste dann nur noch auf statistischem Weg herausfinden, was "Punkt", "Strich", "Pause zwischen Tönen" und "Pause zwischen Zeichen" ist und die Tonfolgen den passenden Zeichen zuordnen. Eigentlich ganz simpel, zumindest bei konstanter Geschwindigkeit und wenig Störgeräuschen. grinsen

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Nils



Anmeldungsdatum: 24.03.2006
Beiträge: 187

BeitragVerfasst am: 27.11.2019, 21:05    Titel: Antworten mit Zitat

qgrindstone:

Oh, Mann, das klingt ja echt unüberwindlich.
hardwaremäßig hab ich so etwas gefunden > https://www.youtube.com/watch?v=G0AWScXzz6A

Aber auch das scheint echt schwer!

cu
_________________
Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 947
Wohnort: Ruhrpott

BeitragVerfasst am: 28.11.2019, 16:58    Titel: Antworten mit Zitat

Nils hat Folgendes geschrieben:
Oh, Mann, das klingt ja echt unüberwindlich.
Ganz und gar nicht (und das ist jetzt nicht ironisch gemeint). Mit QB -insofern hast du schon recht- ist das allerdings nicht zu machen, aber es gibt ja noch FB. zwinkern

Für die ersten beiden Arbeitsschritte (herunterladen und konvertieren) habe ich schon eine fertige Lösung (nur mal als kleines Appetithäppchen):
Code:
Function herunterladen(url As String, datei As String, pfad As String, tout As Double = 10.0) As Integer
   Dim As libvlc_instance_t Ptr vlcInstance
   Dim As libvlc_media_player_t Ptr mp
   Dim As libvlc_media_t Ptr media
   Dim As String vmem_options, myMediaFile
   Dim As Single dlpos
   Dim As Double timeout
   Dim As Integer flag, ff
                   
   vmem_options = "#transcode{acodec=fl32}:std{mux=wav,access=file,dst=""" + _
                   pfad + "temp.wav""}"
                           
   Dim As Any Ptr vlc_args(0 To ...) = { @"--quiet", _
                                         @"--sout",  _
                                         StrPtr(vmem_options) } 
                                                    
   
   vlcInstance = libvlc_new (UBound(vlc_args) + 1, @vlc_args(0))       
   media = libvlc_media_new_location(vlcInstance, url)
   mp = libvlc_media_player_new_from_media(media)
   libvlc_media_player_play(mp)
   libvlc_media_release(media)
   Print
   timeout = Timer + tout
   dlpos = 0
   Locate CsrLin-1,1,0
   Print  Int(dlpos * 100);"%     (abbrechen mit ESC)  "';toutzaehler
   
   Do
      If dlpos <> libvlc_media_player_get_position(mp) Then
         dlpos = libvlc_media_player_get_position(mp)
         timeout = Timer + 1
         Locate CsrLin-1,1,0
         Print  Int(dlpos * 100);"%     (abbrechen mit ESC)  "';toutzaehler
      EndIf
      If InKey = Chr(27) Then
         libvlc_media_player_stop(mp)
         libvlc_media_player_release(mp)
         libvlc_release(vlcInstance)
         Return 1
      EndIf
      Sleep 1
   Loop While timeout > Timer
   
   If dlpos < .5 Then 'kein download
      ff = FreeFile
      Open pfad + "url.txt" For Append As #ff
      Print #ff, url
      Close ff
   EndIf
   
   Locate CsrLin-1,6
   Print "                         "
   Sleep 500
               
   libvlc_media_player_stop(mp)
   libvlc_media_player_release(mp)
   libvlc_release(vlcInstance)
               
   If FileLen(pfad + "temp.wav") Then
      If Name (pfad + "temp.wav", pfad + datei + ".wav") Then
         datei = erlzeichen(datei)
         If Name (pfad + "temp.wav", pfad + datei + ".wav") Then
            Print pfad + datei + ".wav";" >>> Umbenennen fehlgeschlagen"';toutzaehler
            Sleep 1000
            Return 2
         EndIf
      EndIf
   Else
      Return 3
   EndIf
   
   FileCopy(pfad + datei + ".wav", erpfad + "NEU\" + datei + ".wav")
   Return 0
   
End Function
Die eigentliche Arbeit erledigt dabei libvlc, die eierlegende Wollmilchsau unter den Open Source - Mediaplayern.

Die obige Function ist Teil eines Programms, mit dem ich unter anderem einmal in der Woche neu erschienene Folgen von Der kleine Erziehungsratgeber herunterlade, für meine persönliche Sammlung. lächeln

Der erste Analyseschritt "Ton" oder "kein Ton" in 1-ms-Schritten ist auch nicht besonders schwierig. Jede wav - Datei hat einen Header, aus dem sich u.a. der Wert "Samples pro Sekunde je Kanal" ablesen lässt (ja, auch dafür habe ich eine fertige Funktion grinsen ). Dieser Wert durch 1000 geteilt mal Anzahl der Kanäle ergibt die Anzahl der Samples pro Millisekunde, und die Größe und Art der Samples ist von der vorherigen Konversion her bekannt (hier 32bit float = Variablentyp "Single"). Es werden nun jeweils so viele Samples von der Datei gelesen wie sie 1 ms Dauer entsprechen und die Absolutwerte der Samples aufaddiert. Diese Summe wird anschließend mit einem (experimentell zu ermittelnden) Schwellwert verglichen und entschieden, ob es gerade piepst oder nicht.

Die resultierenden Werte werden als "0" oder "1" in eine Datei geschrieben und weiter analysiert. Wie genau, darüber muß ich auch erst noch ein wenig grübeln.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1770
Wohnort: [JN58JR] DeltaLabs.de

BeitragVerfasst am: 29.11.2019, 14:52    Titel: Antworten mit Zitat

Ganz so kompliziert muss man es eigentlich nicht machen.

"Zeit" Spielt bei der Analyse nur eine untergeordnete Rolle, da auch das "Gebertempo" variieren kann.

Am Besten wandelst du, wie schon angesprochen, die Datei in WAV um.

Anschließend findest du heraus, wieviele Byte's die WAV pro Sampel benötigt. Dann kannst du einfach die Datei, Byte für Byte bzw. Sampel für Sampel einlesen. Mit einer einfachen For-Next schleife brauchst du dann nur noch die "Sampelabstände" zwischen einem "Ton" und "keine Ton" sowie zwischen einem "Ton" und dem "nächsten Ton" in ein Array speichern.

Im Anschluß kennst du dann sowohl die Zeitlichen Abstände zwischen den Einzelnen Signalen sowie die Signallängen.

Am einfachsten gehst du dann das ganze Array durch und ermittelst die Längen der einzelnen Tonabstände, um sowohl das "did" als auch das "da" durch die "sampellänge" zu definieren.

Zum schluß noch die abstände zwischen den einzelnen tönen um buchstabe und satzende zu erkennen.

Jetzt kannst du mit den Längenangaben / zeitabstände bzw. sämpelabstände die signale in buchstaben umsetzen und ausgeben.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ DeltaLab's ][ ToOFlo ][ BGB-Movie ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 947
Wohnort: Ruhrpott

BeitragVerfasst am: 29.11.2019, 16:17    Titel: Antworten mit Zitat

ThePuppetMaster hat Folgendes geschrieben:
Dann kannst du einfach die Datei, Byte für Byte bzw. Sampel für Sampel einlesen. Mit einer einfachen For-Next schleife brauchst du dann nur noch die "Sampelabstände" zwischen einem "Ton" und "keine Ton" sowie zwischen einem "Ton" und dem "nächsten Ton" in ein Array speichern.
Das funktioniert so nicht, weil die Werte der Samples den Wellenverlauf des Audiosignals abbilden und das einzelne Sample nichts über den Signalpegel aussagt. Um den Signalpegel zu ermitteln, muss der Mittelwert über eine größere Anzahl von Samples gebildet werden, d.h. Summe der Absolutwerte aller Samples durch Anzahl der Samples. Das Teilen durch die Anzahl der Samples können wir uns hier sparen, da diese für ein 1-ms-Intervall immer gleich ist und als Faktor in den Schwellwert einfliesst.

Die Auswertung hatte ich mir so gedacht, daß ein Zähler die aufeinanderfolgenden "Ton"- bzw. "kein Ton" - Intervalle mitzählt und bei jedem Wechsel die Anzahl in ein -da bin ich ganz bei dir- Array schreibt, und zwar "Ton" als positiven und "kein Ton" als negativen Wert. Diese Werte sind dann quasi direkte Zeitangaben.

Das Array wird über zwei Zeiger (einer zum Schreiben für die hereinkommenden Werte und einer zum Auslesen für die Auswertung) als FIFO-Register organisiert, so daß dessen Größe überschaubar bleibt.

Über das genaue Vorgehen bei der Auswertung muß ich noch ein wenig grübeln... grinsen

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1770
Wohnort: [JN58JR] DeltaLabs.de

BeitragVerfasst am: 29.11.2019, 17:29    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Das funktioniert so nicht, weil die Werte der Samples den Wellenverlauf des Audiosignals abbilden und das einzelne Sample nichts über den Signalpegel aussagt. Um den Signalpegel zu ermitteln, muss der Mittelwert über eine größere Anzahl von Samples gebildet werden, d.h. Summe der Absolutwerte aller Samples durch Anzahl der Samples. Das Teilen durch die Anzahl der Samples können wir uns hier sparen, da diese für ein 1-ms-Intervall immer gleich ist und als Faktor in den Schwellwert einfliesst.


Normalerweise würde ich dir recht geben. ABER ... da es hier um morsezeichen geht, welche durch einen definierten ton gesampelt werden, braucht es glücklicherweise kein FFT und auch keine anderweitige komplexe analyse ... DENN ... der bezug ist folgender: Schwingungsabstand vs. Signalabstand.

Es ist unerheblich, welcher Wert das Byte definiert, da die schwingung der frequenz kleiner ist als die der Signalinformation, und dadurch gefiltert bzw. auch gezählt werden kann.

Code:

c = 0
for x as bla
    c += 1
    if value > 10 then 'schwellwert für frequenzsignal
        if c > 100 then 'schwellwert für tonsignal
            '... usw.
            c = 0
        end if
    end if
next


sobald allerdings die frequenz variieren sollte, oder andere hochamplituriierte störgeräuscht mit in der wav enthalten sind, funktioniert mein beispiel nicht. Aber, einfache klassische morsedec. funzt hiermit hervorragend. zwinkern


EDIT:

Klicken zum vergrößern


MfG
TPM
_________________
[ WebFBC ][ OPS ][ DeltaLab's ][ ToOFlo ][ BGB-Movie ]


Zuletzt bearbeitet von ThePuppetMaster am 30.11.2019, 17:38, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4266
Wohnort: ~/

BeitragVerfasst am: 30.11.2019, 15:12    Titel: Antworten mit Zitat

Wer bindet denn da schon wieder so große Bilder ein, dass ich beim Lesen seitwärts scrollen muss? grinsen

Edit: Danke, sehr viel angenehmer. lächeln
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz