Analyse von Frequenz und Lautstärke mittels USB Mikrofon

  • VB.NET

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

    Analyse von Frequenz und Lautstärke mittels USB Mikrofon

    Hallo zusammen.

    Ich habe ein USB Mikrofon und möchte damit die Frequenz und die Lautstärke in Echtzeit analysieren. Welche Bibliothek wäre dafür wohl am besten geeignet Naudio, Cscore, Directsound, ... oder gibt es vllt andere die dafür noch besser geeignet wären hat jemand von euch vielleicht schon mal so etwas gemacht?


    BG

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    dr. Nick schrieb:

    in Echtzeit
    ist relativ.
    Sowohl Lautstärke als auch Frequenz bedürfen eines Bereiches, innerhalb dessen
    • die Maxima als Lautstärke
    • nach einer FFT die Frequenzen
    vorliegen.
    Je größer der Bereich, um so genauer ist die Aussage, und un-echtzeitiger.
    Die Bass.dll hat dafür ne ganze Menge an Bord und es gibt ne Menge hier im Forum:
    un4seen.com/bass.html
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Für die Echtzeit-Analyse von Audio in VB.NET gibt es verschiedene Bibliotheken, die verwendet werden können. Hier sind einige Optionen:
    1. NAudio: Eine sehr beliebte Open-Source-Bibliothek für die Audio-Verarbeitung in .NET-Umgebungen. NAudio bietet viele Funktionen, einschließlich Aufnahme, Wiedergabe, Konvertierung, Effekte und Analyse.
    2. CSCore: Eine weitere Open-Source-Bibliothek für die Audio-Verarbeitung in .NET-Umgebungen. CSCore ist schneller und leichter als NAudio, bietet aber nicht ganz so viele Funktionen.
    3. DirectSound: Eine Windows-API, die es ermöglicht, direkt auf die Soundkarte zuzugreifen und Audio in Echtzeit zu verarbeiten. DirectSound ist eine ältere API, die möglicherweise nicht mehr von allen Systemen unterstützt wird.

    Welche Bibliothek für Ihre Anforderungen am besten geeignet ist, hängt von verschiedenen Faktoren ab, wie z.B. der gewünschten Analysegenauigkeit, der Komplexität der Verarbeitung, der unterstützten Audioformate und der Portabilität zwischen verschiedenen Betriebssystemen.

    Ich würde Ihnen empfehlen, NAudio oder CSCore auszuprobieren, da beide Bibliotheken gut dokumentiert sind und eine breite Palette von Funktionen bieten, einschließlich der Möglichkeit, Audio in Echtzeit aufzunehmen und zu analysieren.

    NAudio
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports NAudio.Wave
    2. Public Class MainForm
    3. Private waveIn As WaveInEvent
    4. Private waveViewer As WaveViewer
    5. Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. waveViewer = New WaveViewer()
    7. waveViewer.Dock = DockStyle.Fill
    8. Me.Controls.Add(waveViewer)
    9. waveIn = New WaveInEvent()
    10. waveIn.DeviceNumber = 0 ' Mikrofon auswählen (0 für Standard)
    11. waveIn.WaveFormat = New WaveFormat(44100, 1) ' Audioformat festlegen
    12. waveIn.BufferMilliseconds = 50 ' Puffergröße festlegen
    13. waveIn.NumberOfBuffers = 3 ' Anzahl der Puffer festlegen
    14. AddHandler waveIn.DataAvailable, AddressOf waveIn_DataAvailable
    15. waveIn.StartRecording()
    16. End Sub
    17. Private Sub waveIn_DataAvailable(sender As Object, e As WaveInEventArgs)
    18. waveViewer.AddSamples(e.Buffer, e.BytesRecorded)
    19. End Sub
    20. Private Sub MainForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    21. waveIn.StopRecording()
    22. waveIn.Dispose()
    23. End Sub
    24. End Class


    Dieser Code verwendet den WaveInEvent-Typ von NAudio, um Audio von einem Mikrofon aufzunehmen und die Daten in Echtzeit an ein WaveViewer-Steuerelement zu übergeben, das die Audiodaten grafisch darstellt. Der Code wählt das Standard-Mikrofon aus und legt das Audioformat, die Puffergröße und die Anzahl der Puffer fest. Der Code fügt auch einen Handler für das DataAvailable-Ereignis hinzu, um die aufgenommenen Audiodaten zu verarbeiten, und stoppt die Aufnahme beim Schließen des Formulars.

    CSCore
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports CSCore.CoreAudioAPI
    2. Imports CSCore.SoundIn
    3. Public Class MainForm
    4. Private capture As WasapiCapture
    5. Private fft As RealtimeFftProvider
    6. Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. capture = New WasapiCapture()
    8. fft = New RealtimeFftProvider(capture.WaveFormat.Channels, capture.WaveFormat.SampleRate, FftSize.Fft4096)
    9. AddHandler capture.DataAvailable, AddressOf capture_DataAvailable
    10. capture.Start()
    11. End Sub
    12. Private Sub capture_DataAvailable(sender As Object, e As DataAvailableEventArgs)
    13. fft.Add(e.Data, e.Offset, e.ByteCount)
    14. End Sub
    15. Private Sub timer_Tick(sender As Object, e As EventArgs) Handles timer.Tick
    16. Dim fftBuffer As Single() = fft.GetFftData()
    17. ' Hier können Sie den FFT-Buffer verarbeiten und die Frequenz- und Lautstärkedaten extrahieren
    18. ' Beispiel für die Berechnung der durchschnittlichen Lautstärke:
    19. Dim rms As Single = 0
    20. For i As Integer = 0 To fftBuffer.Length - 1
    21. rms += fftBuffer(i) * fftBuffer(i)
    22. Next
    23. rms = CSng(Math.Sqrt(rms / fftBuffer.Length))
    24. ' Beispiel für die Berechnung der dominanten Frequenz:
    25. Dim maxIndex As Integer = 0
    26. Dim maxValue As Single = fftBuffer(0)
    27. For i As Integer = 1 To fftBuffer.Length - 1
    28. If fftBuffer(i) > maxValue Then
    29. maxIndex = i
    30. maxValue = fftBuffer(i)
    31. End If
    32. Next
    33. Dim dominantFrequency As Single = maxIndex * capture.WaveFormat.SampleRate / fftBuffer.Length
    34. ' Verwenden Sie die Ergebnisse für Ihre Anwendung ...
    35. End Sub
    36. Private Sub MainForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    37. capture.[Stop]()
    38. capture.Dispose()
    39. End Sub
    40. End Class


    Dieser Code verwendet den WasapiCapture-Typ von CSCore, um Audio von einem Mikrofon aufzunehmen und die Daten in Echtzeit an einen RealtimeFftProvider zu übergeben, der die FFT-Berechnungen durchführt. Der Code fügt auch einen Handler für das DataAvailable-Ereignis hinzu, um die aufgenommenen Audiodaten zu verarbeiten, und einen Timer, der periodisch die Frequenz- und Lautstärkedaten aus dem FFT-Buffer extrahiert. Der Code verwendet die Math.Sqrt-Funktion, um die durchschnittliche Lautstärke zu berechnen, und die Formel maxIndex * sampleRate / bufferLength, um die dominante Frequenz zu berechnen.

    DirectSound
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.DirectX.DirectSound
    2. Public Class MainForm
    3. Private device As Device
    4. Private captureBuffer As CaptureBuffer
    5. Private notify As New Notify()
    6. Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. device = New Device()
    8. device.SetCooperativeLevel(Me.Handle, CooperativeLevel.Normal)
    9. Dim captureFormat As New WaveFormat()
    10. captureFormat.BitsPerSample = 16
    11. captureFormat.SamplesPerSecond = 44100
    12. captureFormat.Channels = 1
    13. captureFormat.BlockAlign = CShort(captureFormat.Channels * captureFormat.BitsPerSample / 8)
    14. captureFormat.AverageBytesPerSecond = captureFormat.BlockAlign * captureFormat.SamplesPerSecond
    15. Dim captureBufferDesc As New CaptureBufferDescription()
    16. captureBufferDesc.Format = captureFormat
    17. captureBufferDesc.BufferBytes = captureFormat.AverageBytesPerSecond
    18. captureBufferDesc.BufferDuration = TimeSpan.FromSeconds(1)
    19. captureBuffer = New CaptureBuffer(captureBufferDesc, device)
    20. AddHandler notify.SetNotificationPositions, AddressOf notify_SetNotificationPositions
    21. notify.SetNotificationPositions({captureBufferDesc.BufferBytes \ 2})
    22. captureBuffer.Start(True)
    23. End Sub
    24. Private Sub notify_SetNotificationPositions()
    25. Dim pos As Integer = 0
    26. Dim nextPos As Integer = captureBuffer.NotificationPosition + captureBuffer.Description.BufferBytes \ 2
    27. While pos < captureBuffer.Description.BufferBytes
    28. notify.SetNotificationPosition(pos + nextPos)
    29. pos += captureBuffer.Description.BufferBytes \ 2
    30. End While
    31. End Sub
    32. Private Sub captureBuffer_OnCapture(sender As Object, e As CaptureEventArgs)
    33. Dim buffer As Byte() = e.Buffer
    34. waveViewer1.AddSamples(buffer, buffer.Length)
    35. End Sub
    36. Private Sub MainForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    37. captureBuffer.Stop()
    38. captureBuffer.Dispose()
    39. device.Dispose()
    40. End Sub
    41. End Class


    Dieser Code verwendet die DirectSound-API von DirectX, um Audio von einem Mikrofon aufzunehmen und die Daten in Echtzeit an ein WaveViewer-Steuerelement zu übergeben, das die Audiodaten grafisch darstellt. Der Code erstellt ein Device-Objekt und legt das Audioformat und die Puffergröße fest. Der Code erstellt auch ein CaptureBuffer-Objekt und fügt einen Handler für das OnCapture-Ereignis hinzu, um die aufgenommenen Audiodaten zu verarbeiten. Der Code verwendet auch ein Notify-Objekt, um Benachrichtigungen über die Pufferpositionen zu erhalten und das Aufnahmeverhalten zu steuern. Der Code stoppt die Aufnahme beim Schließen des Formulars und gibt alle Ressourcen frei.

    Hi

    Neben den bereits genannten Bibliotheken, gibt es auch noch die Windows Media Foundation (APIs/COM-Interfaces) und entsprechende WinRT COM-Interfaces. Letzteres verwendet im Hintergrund die Windows Media Foundation und diese wiederum in Teilen die WASAPI. Nur der Vollständigkeit halber.

    DirectSound ist, soweit mir bekannt, eine etwas veraltete Schnittstelle und wurde durch die Windows Media Foundation abgelöst.
    Mfg -Franky-