Autor Beitrag
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Do 04.07.13 11:57 
Hey Leute,

ich habe vor kurzem angefangen mit NAudio zu arbeiten. Da ich nicht viel Ahnung von Audiotechnik habe und keine Antwort gefunden habe stelle ich hier meine Frage:

Ich benutze WaveIn, um den Ausgabeton der Soundkarte abzugreifen. Jetzt möchte ich das ganze in Echtzeit mit einem SpectrumAnalyser visualisieren.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
WaveIn audioStream = new WaveIn();
    MemoryStream memStream = new MemoryStream();
    
    public EqualizerWindow()
    {
      InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
      audioStream = new WaveIn();
      audioStream.DataAvailable += stream_DataAvailable;
      audioStream.StartRecording();
      
    }

    private void stream_DataAvailable(object sender, WaveInEventArgs e)
    {
      // Hier sollen die Daten an den SpectrumAnalyser geschoben werden
    }

Mein Problem ist nur, dass der SpectrumAnalyser ein Array von Complex, also komplexen Zahlen braucht. Ich habe aber nirgends etwas gefunden was ich verwenden kann, bzw. verstehe.
Wie schaffe ich es, das Byte-Array in den WaveInEventArgs in ein Complex-Array umzuwandeln?

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Fr 05.07.13 08:30 
user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:
Mein Problem ist nur, dass der SpectrumAnalyser ein Array von Complex, also komplexen Zahlen braucht. Ich habe aber nirgends etwas gefunden was ich verwenden kann, bzw. verstehe.
Wie schaffe ich es, das Byte-Array in den WaveInEventArgs in ein Complex-Array umzuwandeln?


Ohne tiefere Kenntnis von NAudio: Der Übergang vom Zeit- in den Frequenzbereich realisiert man in der Regel über Fourier-Transformation, speziell FFT. Evtl. stellt NAudio ja eine FFT-Funktion, falls nicht ist das Ding aber auf jeden Fall anderweitig erhältlich.

Gruß
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mo 08.07.13 12:24 
Ja das mit FFT habe ich mir schon angesehen. Aber das Problem ist, dass NAudio zwar die Funktion bietet, aber diese Funktion wiederum ein Array von komplexen Zahlen fordert.
Mein problem ist es, aus dem Wave Stream komplexe Zahlen zu erstellen...

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Mo 08.07.13 16:53 
Wenn du ein reelles Signal hast, kannst du alle Werte direkt in den Realteil der komplexen Zahlen schreiben.

Dieses Signal wird dann Transformiert und wird nicht mehr reell sein. Du kannst allerdings dann nicht einfach den Imaginärteil wegschmeißen, der ist schon wichtig. Bei genaueren Fragen, einfach fragen!

Gruß
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mo 08.07.13 18:12 
Wie baut sich dieser Realteil den auf? Wenn ich das ganze richtig verstanden habe, geben mir die Bytes im Puffer die Lautstärke an und die Anzahl der Bytes / Samplerate ergiebt die Frequenz? ich blick da nicht ganz durch wegen Frequenzüberlagerung von mehreren Tönen. Aus den .wav Specs werd ich au nicht richtig Schlau. Kannst du mir erklären wie ich aus den Bytes im Puffer komplexe Zahlen erstellen kann, bzw was die Bytes beinhalten?

Sorry bin n totaler Anfänger in Audiotechnik

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Mo 08.07.13 18:37 
user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:
Wie baut sich dieser Realteil den auf? Wenn ich das ganze richtig verstanden habe, geben mir die Bytes im Puffer die Lautstärke an und die Anzahl der Bytes / Samplerate ergiebt die Frequenz?


Die Bytes im Puffer geben dir eine Repräsentation der Auslenkung deines Lautsprechers bzw. der Spannung, die an dem Lautsprecher anliegt. Üblicherweise sind das 16- oder 24-bit Zahlen, das müsste man dem Waveformat entnehmen können. (Die Eigenschaft bitsPerSample sieht da gut aus. )

Wie genau brauchst du's denn? Eine 16bit-Zahl würde die Amplitude dann von 0 bis 2^16-1 angeben. Wobei 0 dann der -1 und 2^16-1 dann der 1 entspräche.

user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:
ich blick da nicht ganz durch wegen Frequenzüberlagerung von mehreren Tönen.


Es scheint eine verbreitete Fehlannahme zu sein, dass Rohaudiodateien Frequenzüberlagerungen von mehreren Tönen wären. In Wirklichkeit wird einfach nur eine Auslenkung gemessen und gespeichert, also wirklich direkt die Wellenform der Aufnahme. Wenn du dich für Frequenzen interessierst, musst du dein Signal, wie gesagt, in den Frequenzbereich transformieren.

user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:
Kannst du mir erklären wie ich aus den Bytes im Puffer komplexe Zahlen erstellen kann[...]?


Die Komplexe Zahl in NAudio sieht so aus. Damit solltest du etwas anfangen können ;)

Gruß
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 08.07.13 21:12 
Hallo C#,

schau dir mal dieses Projekt an: FFT-Guitar-Tuner. Das müßte deinem Vorhaben ähneln.
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mi 17.07.13 00:07 
Ich bin nun so weit, dass mein SpectrumAnalyiser funktioniert, bzw. mal was anzeigt. Wenn ich die Musik aber ausschalte, zeigt der mir der Analyser aber trozdem noch das Spektrum an. Ich bin dem nachgegangen und habe festgestellt, dass mein WaveIn, welches direkt von der Soundkarte liest, trotz allem noch das Data_Available Event auslöst. Als Puffer emfange ich immer 800 Bytes, von denen ca. die Hälfte Werte zwischen 1 und 3 haben, doch ein Teil hat auch Werte bis zu 255, der Rest hat 0.
Wieso löst das Event aus wenn ich keinen Ton ausgebe? An den Lautsprechern (bzw. Kopfhörer) kommt KEIN Ton.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler