3 Phasen (Kanäle) Signalgenerator mit Soundkarte

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Hariboo83.

    3 Phasen (Kanäle) Signalgenerator mit Soundkarte

    Hallo,

    ich habe folgendes Problem:

    Ich möchte eine 5.1 Soundkarte mit VB so ansteuern, dass ich eine bestimmte Frequenz, Zeit, Amplitude und Phasenverschiebung einstellen und ausgeben kann und dass auf drei Kanälen.
    Das bedeutet dass ich z.B. angebe

    Angabe der Dauer wie lange das Sinus Signal ausgegeben wird: 300sek;
    Linker Kanal: Frequenz 50Hz; Amplitude 100; Phase 0°
    Rechter Kanal: Frequenz 50Hz; Amplitude 100; Phase 120°
    dritter Kanal: Frequenz 50Hz; Amplitude 100; Phase 240°
    Dann wird ein SounddataArray zur Laufzeit erstellt und abgespielt.

    Hintergrund ist, dass ich ein drei-Phasen Netz-Generator bauen möchte. Da dieser über den PC gesteuert werden soll, habe ich mir gedacht, dass ich als Sinusgenerator die im PC verbaute
    Sundkarte verwenden könnte.

    Ich habe das für Stereo hier: vbarchiv.net/forum/id10_i72369…wird-nicht-geloescht.html gefunden und getestet. Das läuft problemlos und ich habe es auch im Einsatz.
    Hier kann ich alles angeben, wie lange das Signal ausgegeben wird, die Frequenz getrennt für den linken und rechten Kanal, die Amplitude getrennt für den linken und rechten Kanal, und die Phasenverschiebung vom linken zum rechten Kanal.
    Super wäre es, wenn man den Code um einen dritten Kanal erweitern könnte.

    Ich wäre um Anregungen wie ich das Problem angehen könnte sehr dankbar.
    Ich habe mit der Bass.dll mal einen TestTone-Generator gemacht, allerdings nur Stereo und Sinus-Förmig. Du kannst allerdings 3 Samples(1-Kanal (BASS_SampleCreate)) erstellen, mit hilfe einer mixermatrix kannst du dann die einzelnen Samples in den gewünschten Kanal eines Mixerstreams leiten.

    VB.NET-Quellcode

    1. Imports Un4seen.Bass
    2. Public Class FormMain
    3. Private Samplerate As Integer = 192000
    4. Private Stream As Integer = 0
    5. Private Sound As Integer = 0
    6. Private Amplitude As Single = 0.5F
    7. Private Angle As Double = 0.0F
    8. Private Frequency As Integer = 100
    9. Private Volume As Single = 0.1F
    10. Private Channels As Integer = 2
    11. Private Sub FormMain_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
    12. Bass.BASS_Init(-1, Samplerate, BASSInit.BASS_DEVICE_SPEAKERS, Nothing)
    13. End Sub
    14. Private Sub FormMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    15. Bass.BASS_ChannelStop(Stream)
    16. Bass.BASS_StreamFree(Stream)
    17. Bass.BASS_SampleFree(Sound)
    18. Bass.FreeMe()
    19. End Sub
    20. Private Sub PlayTestTone()
    21. If Not Bass.BASS_ChannelIsActive(Stream) = BASSActive.BASS_ACTIVE_STOPPED Then
    22. Bass.BASS_ChannelStop(Stream)
    23. End If
    24. Bass.BASS_StreamFree(Stream)
    25. Dim sampleCount As Integer = Samplerate * Channels * 2
    26. Sound = Bass.BASS_SampleCreate(sampleCount, Samplerate, Channels, 1, BASSFlag.BASS_SAMPLE_OVER_VOL Or BASSFlag.BASS_SAMPLE_LOOP)
    27. Dim data() As Short = New Short(sampleCount - 1) {}
    28. Dim increment As Double = 2D * Math.PI * Frequency / Samplerate
    29. Dim value As Short = 0
    30. For sample As Integer = 0 To sampleCount - Channels Step Channels
    31. value = CShort(Short.MaxValue * Math.Sin(Angle) * Amplitude)
    32. For channel As Integer = 0 To Channels - 1
    33. data(sample + channel) = value
    34. Next
    35. Angle += increment
    36. Next
    37. Bass.BASS_SampleSetData(Sound, data)
    38. Stream = Bass.BASS_SampleGetChannel(Sound, False)
    39. Bass.BASS_ChannelSetAttribute(Stream, BASSAttribute.BASS_ATTRIB_VOL, 0.0F)
    40. Bass.BASS_ChannelPlay(Stream, True)
    41. Bass.BASS_ChannelSlideAttribute(Stream, BASSAttribute.BASS_ATTRIB_VOL, Volume, 150)
    42. End Sub
    43. Private Sub CheckBoxSoundActive_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBoxSoundActive.CheckedChanged
    44. If CheckBoxSoundActive.Checked Then
    45. PlayTestTone()
    46. Else
    47. Bass.BASS_ChannelStop(Stream)
    48. End If
    49. End Sub
    50. Private Sub TrackBarFrequency_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBarFrequency.Scroll
    51. Frequency = TrackBarFrequency.Value
    52. LabelFrequency.Text = Frequency & "Hz"
    53. PlayTestTone()
    54. End Sub
    55. Private Sub TrackBarVolume_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBarVolume.Scroll
    56. Volume = TrackBarVolume.Value / 100.0F
    57. LabelVolume.Text = "Vol " & TrackBarVolume.Value & "%"
    58. Bass.BASS_ChannelSlideAttribute(Stream, BASSAttribute.BASS_ATTRIB_VOL, Volume, 50)
    59. PlayTestTone()
    60. End Sub
    61. Private Sub TrackBarAmplitude_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBarAmplitude.Scroll
    62. LabelAmplitude.Text = "Amp " & TrackBarAmplitude.Value & "%"
    63. Amplitude = TrackBarAmplitude.Value / 100.0F
    64. PlayTestTone()
    65. End Sub
    66. End Class

    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NoIde“ ()

    Hariboo83 schrieb:

    Super wäre es, wenn man den Code um einen dritten Kanal erweitern könnte.

    Die von dir verlinkte Methode verwendet den System.Media.Soundplayer.
    Der will WAF-Format und das ist nur zweikanalig.

    Wenn du Dolby Digital verwenden willst, brauchst du ein entsprechendes Format (z.B. AC3) und einen Player, der das unterstützt.
    Keine Ahnung, wer so was unterstützt.

    Ich könnte mir vorstellen, dass man bei deinen Anforderungen mit Microsoft.DirectX.DirectSound weiter kommt.

    Edit:

    NoIde schrieb:

    Du kannst allerdings 3 1-Kanal Streams erstellen, mit der Bass.dll
    Das wusste ich auch noch nicht.
    Man lernt nie aus.


    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich sage ja immer das die Bass ein tolles Werkzeug ist, auch wenn einige hier anderer Meinung sind. Habe damit schon so einige tolle Sachen gemacht. Wobei ich habe noch mal editiert, einfach 3 Samples(BASS_SampleCreate) mit 1 kanal erstellen und diese in einen 3 kanal Stream mit einer MixerMatrix reinmixen.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NoIde“ ()

    Hariboo83 schrieb:

    drei-Phasen Netz-Generator

    Wie ist denn die Ausgangsleistung des Umrichters spezifiziert? Normalerwiese würde man soetwas mit drei Halbbrücken oder einer Multi-Level-Topologie (auf Seite der Leistungselektronik) umsetzen. In jedem Fall wäre da ein pulsweitenmoduliertes Signal angebrachter. Macht es nicht vielleicht eher Sinn, einen Mikrocontoller über ein VB-Userinterface zu steuern?
    Hallo Leute

    WOW ich bin sehr begeistert was alles für Ideen zusammenkommen, das bringt mich auf jeden Fall schon mal weiter und es bringt mir neue Ansätze!

    NoIde schrieb:

    Ich habe mit der Bass.dll mal einen TestTone-Generator gemacht

    Von der hab ich auch schon gehört, hab aber wohl die Macht dieser dll unterschätzt, die Funktionen dieser dll muss ich mir dann doch noch mal genauer anschauen, Danke!

    petaod schrieb:

    Der will WAF-Format und das ist nur zweikanalig.

    Danke für den Hinweis, ich habe natürlich im Zusammenhang mit dem Riff Format auch weiter überlegt und habe mir den Code und das Riff Format noch mal genauer angeschaut.
    Es ist mit dem Riff Format möglich mehrkanalige Streams zu erstellen, das hab ich hier: www2.ak.tu-berlin.de/~fhein/Al…io-formate/wav/index.html gefunden.
    D.h. eigentlich könnte ich bei meinen ursprünglichen Code myChannels = 3 setzen und um das dritte Signal (wie links und rechts) erweitern, dann hätte ich einen Riff Stream mit drei separaten Kanälen,
    die links, rechts und mitte ausgegeben werden? Die Frage ist jetzt halt, geht das mit dem Spoundplayer wirklich nicht?

    fufu schrieb:

    Macht es nicht vielleicht eher Sinn, einen Mikrocontoller über ein VB-Userinterface zu steuern?

    Ich bin mit meinen Überlegungen noch nicht sehr weit, die Ausgangsleistung muss nicht sehr hoch sein, was ich aber eigentlich nicht will ist, dass ich einen zusätzlichen Mikrocontoller habe.
    Ich will im Prinzip alles in ein Gehäuse einbauen, USB-Soundkarte, USB-Digital/Analog-I/Os ein USB Kabel zum PC, eine Software die gepflegt werden muss, so ist mal der Plan.