48Bit "Telegram" über Audio Ausgeben

  • C#
  • .NET 6

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    Hi

    So einfach 2 Sinus aneinander pappen wird nicht funktionieren. Der Anfang / Ende des Sinus der beiden Zustände 0/1 müssen Unterbrechungsfrei und passend in einander übergehen. Laut dem Wikipedia Artikel brauchst du ein durchgängiges Sinussignal (Carrier) das dann entsprechend der Zustände manipuliert wird. Das entspricht eher einer Frequenzmodulation (FM). Damit kenne ich mich nicht aus.

    Eine Idee wäre den Carrier über einen Pitch stufenlos und unterbrechungsfrei entsprechend der Zustände anzupassen. Ich fürchte da wirst Du das ganz selbst berechnen müssen oder vllt geht da auch was über DirectSound (Sinus erzeugen / berechnen und Pitch).
    Mfg -Franky-
    Mit deiner verwendeten Bibliothek kenne ich mich nicht aus, aber mit der Bass.dll kannst du was machen, hier ist zu sehen wie man einen Sinuston erzeugt und das sample abspielt.
    bass.radio42.com/help/html/226…f5c-871b-8d528dcc5acf.htm

    Aber auch die Bass Initialisieren, das ist beim Beispielcode nicht zu sehen. (Gibt hier Threads dazu zu finden)
    Da nun aber die Frequenz noch fehlt, suche im Forum von un4seen.com nach Sine Wave, dann hast du Code an dem du dich orientieren kannst zum erstellen der Daten für das Sample.

    Da mich nun auch Corona erwischt hat(Teufelszeug) und ich mich nicht wirklich konzentrieren kann, kann ich dir kein Beispiel machen. Ich habe so oder so vor meinen verschwundenen Tongenerator neu zu schreiben, aber erst wenn ich wieder Fit bin, den werde ich dann hier im Sourcecode-Austausch releasen. Spätestens dann, solltest du den Rest hinbekommen können.
    @BitBrösel Misst... Gute besserung!

    Es scheint ja fast unbezwingbar das Thema... aber ich werde weiter suchen und basteln =)
    Nur kommen nächste Woche die Digitalen Geräte... da fällt es schwer sich nicht gleich auf das neue Projekt zu stürzen ^^

    Rein vom hören, bin ich glaube ich nicht weit weg...
    dropbox.com/s/gm8pfggi07lzuc6/Neue Aufnahme.m4a?dl=0

    Ich Danke dir. Hab mich jetzt einfach mal hingesetzt und konnte zumindest das Beispiel ein wenig erweitern, welches ich verlinkt habe. So kannst du auch die Frequenz bestimmen, der Rest sollte einfache Mathematik sein. Hoffe mein Verstand kommt wieder, für so was simples hab ich mir grad die Rübe zerbrechen müssen, sowas gönn ich nicht mal meinen schlimmsten Feind, trotz eigendlich angenehmen Raumklima am schwitzen wie ein Spanferkel am Spieß.

    VB.NET-Quellcode

    1. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, Nothing)
    2. Dim sampleRate As Integer = 44100
    3. Dim sampleFrequency As Decimal = 1200D
    4. Dim sampleSize As Integer = CInt(sampleRate / sampleFrequency * 4D) 'weil geloopt wird muss die größe passen, sonst kommt ein falscher ton, weil das ende der welle passend zum anfang sein muss
    5. Dim sample As Integer = Bass.BASS_SampleCreate(sampleSize, sampleRate, 1, 1, BASSFlag.BASS_SAMPLE_LOOP Or BASSFlag.BASS_SAMPLE_OVER_POS)
    6. Dim sampleData(sampleSize \ 2 - 1) As Short
    7. For i As Integer = 0 To sampleSize \ 2 - 1
    8. sampleData(i) = CShort(32767.0 * Math.Sin(CDbl(i) * (2 * Math.PI) / (CDbl(sampleRate) / sampleFrequency)))
    9. Next
    10. Bass.BASS_SampleSetData(sample, sampleData)
    11. Dim sampleHandle As Integer = Bass.BASS_SampleGetChannel(sample, False)
    12. Bass.BASS_ChannelPlay(sampleHandle, False)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BitBrösel“ ()

    Hi

    Der Code auf AVB ist VB6-Code. Das müsste man sowieso komplett neu für C# schreiben. Den größten Teil kann man fast direkt übernehmen. VB6 Long und Integer entsprechend für .Net austauschen (Integer und Short). Ton() ist ein Array mit einer Struct mit 2 Shorts (R/L). PrepareHeader und BMOVE sind im Code nicht als Function/Sub zu sehen aber PrepareHeader komplettiert einen WaveHeader und BMOVE kopiert das ganze dann letztendlich in ein ByteArray das man dann abspielen oder auch als WAV-Datei speichern kann.
    Mfg -Franky-

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „-Franky-“ ()

    Hi

    Die For/Next Schleifen selber sollten in C# nicht das Problem sein. Wenn dann schon eher der Befehl Mid(Code, N, 1). Der gibt vom übergebenden String (ByVal Code As String) jeweils 1 Zeichen ab Position N zurück. Müsste String.Substring in .NET sein. Sin ist halt Math.Sin und pi ist 3.14159265359 usw. Achtung: Da gibt es Arrays, die mit Index 1 beginnen (ReDim Ton(1 To nSamples * L)). .NET-Standard beginnt ein Array mit Index 0. Hier muss entsprechend die Dimensionierung, die For/Next Schleifen und evtl auch anderes daran angepasst werden.
    Mfg -Franky-

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „-Franky-“ ()

    @BitBrösel
    Jupp, oder so.

    Das ganze erinnert mich an folgendes:
    Ja das ist noch QBasic unter DOS. Da hab ich mal den QBasic Play-Befehl mit VB6 nach programmiert und ein wenig mit neuen Parametern erweitert. Da kommt ebenfalls der Code von AVB zum Einsatz. Nur in einer abgewandelten Form.
    Mfg -Franky-