C# - Fourier Reihen(Sinus,Square,Triangle, Sawtooth)

  • C#
  • .NET 4.5

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von mausekeks.

    C# - Fourier Reihen(Sinus,Square,Triangle, Sawtooth)

    Hallo liebe Community,

    ich arbeite momentan an einem Projekt welches ein Signal generiert(simuliert) und welches in verschiedenen Formen angezeigt werden soll.

    Die ersten zwei (Sinus, Square) funktionieren bereits ganz gut:

    "Sinus"

    C#-Quellcode

    1. // AxisX = t
    2. return (Math.Sin(2f * Math.PI * AxisX * Frequency / SampleRate)) * Amplitude;



    "Square"

    C#-Quellcode

    1. // AxisX = t
    2. return (Math.Sign(Math.Sin(2 * Math.PI * AxisX * Frequency / SampleRate))) * Amplitude;




    So nun habe ich das Problem das ich es nicht hinbekomme das Signal unter Berücksichtigung von Frequenz und Samplerate in Sawtooth oder Triangle zu generieren(simulieren).

    Die Grundformeln mit welchen ich arbeite:


    Sawtooth:

    C#-Quellcode

    1. // 2 * ( t/a - floor( t/a + 1/2 ) )


    Triangle:

    C#-Quellcode

    1. // 2 * abs( t - 2 * floor( t / 2 ) - 1 ) - 1



    kann mir bitte jemand helfen das zu verstehen?


    LG Mausekeks
    Brain is Loading: 35%
    Ich versteh grad die Frage nicht. Fehlt Dir jetzt der Hinweis, dass Du mit Math.Floor(DeineZahl) an den ganzzahligen Teil einer Zahl kommst? Willst Du das ohne Math.Floor ausrechnen? Verstehst Du die Formeln inhaltlich nicht? Willst Du willsen, wie das ganze als Graph aussehen soll?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @mausekeks Kannst Du mal ein Bildchen malen, wie das Signal aussehen soll?
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hab eines Angehängt,
    ich hoffe ihr versteht was ich meine.

    Die Sinus- und Square-funktion funktioniert richtig.

    Die beiden Formeln dafür enthalten 4 Variablen:
    • AxisX - das ist die Zeit (t)
    • Amplitude
    • Frequency - Frequenz in HZ (z.B. 200)
    • Samplerate - Abtastrate (z.b. 44100)
    Die beiden anderen Formeln (Triangle, Sawtooth) enthalten eben nur AxisX(t) und Amplitude
    wie passe ich diese an meine gegebenheiten an?

    Ich hoffe das war jetzt verständlich :)

    LG
    Brain is Loading: 35%
    @mausekeks Willst Du eine WAVE-Datei generieren?
    Du musst Dich von Deinen virtuellen Einheiten trennen und zu Daten-Einheiten wechseln.
    Amplitude in AD-Einheiten, z.B. 0 ... 255,
    Wellenlänge und Samplerate in Index, musst Du aus Deinen virtuellen Einheiten ausrechnen, so dass die Samplerate { := 1 } ist (nächster Indey => nächstes Sample).
    Dann hast Du nur noch eine Schleife über die Wellenlänge mit der Schrittweite 1 und kannst Deine Werte berechnen wie immer Du willst.

    C#-Quellcode

    1. // Sägezahn:
    2. for (int i = 0; i < Wellenlänge; i++)
    3. {
    4. array[i] = (T)(i * skalierungsfaktor);
    5. }
    6. // Dreieck
    7. for (int i = 0; i < Wellenlänge / 2; i++)
    8. {
    9. array[i] = (T)(i * skalierungsfaktor);
    10. array[Wellenlänge - i - 1] = (T)(i * skalierungsfaktor);
    11. }
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany,

    nein ich möchte keine Wave datei erzeugen, ich möchte gar keine Datei erzeugen.

    Der Sinn ist es einfach ein Signal zu Simulieren und das in den verschiedenen Fourierreihen.

    ich hab mal einen Screenshot angehängt der zeigt wie das Bis jetzt aussieht.

    Später wird das dann FFT gerechnet und das Spectrum wieder angezeigt.

    Was meinst du mit virtuellen einheiten?

    Meinst du weil ich
    • Freuqenz in HZ
    geschrieben hab?

    LG
    Bilder
    • screenshot oszilloskop.PNG

      176,5 kB, 1.558×727, 41 mal angesehen
    Brain is Loading: 35%

    mausekeks schrieb:

    virtuellen einheiten
    Alle Einheiten, deren Koordinaten bei Dir von 0 bis 2 Pi gehen.
    Das sind Einheiten für Theoretiker, vielleicht noch für Elektroniker, aber nicht für Programmierer.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hallo Mausekeks,

    ich verweise mal auf folgende Beiträge bei AVB
    activevb.de/forenarchive/forum…2/thread-10889/beitrag-0/
    activevb.de/forenarchive/forum…2/thread-10867/beitrag-0/
    activevb.de/forenarchive/forum…4/thread-11036/beitrag-0/
    Sägezahn und Rechteck etc.
    activevb.de/forenarchive/forum…/thread-117085/beitrag-0/
    Zur Erzeugung von Rechteck, Sägezahn oder Dreieck kann ich VB6-Code liefern.
    Zur FFT hab ich auch einiges auf Lager.

    Beste Grüße

    vb3-Guru
    Soooo,

    ich habe nun noch etwas weiter rumprobiert und habe jetzt auch meine lösung gefunden mit der es bei mir funktioniert

    "Sinus"

    C#-Quellcode

    1. // sin( 2 * pi * t )
    2. float t = (float)(Frequency / SampleRate * AxisX);
    3. return (Math.Sin(2f * Math.PI * t)) * Amplitude + Offset;



    "Triangle"

    // 2 * abs( t - 2 * floor( t / 2 ) - 1 ) - 1
    float t = (float)(Frequency / SampleRate * AxisX);
    return (2f * Math.Abs(t - 2 * Math.Floor(t / 2) - 1) - 1) * Amplitude + Offset;


    "Square"

    C#-Quellcode

    1. // sign( sin( 2 * pi * t ) )
    2. float t = (float)(Frequency / SampleRate * AxisX);
    3. return (Math.Sign(Math.Sin(2 * Math.PI * t))) * Amplitude + Offset;



    "Sawtooth"

    C#-Quellcode

    1. // 2 * ( t/a - floor( t/a + 1/2 ) )
    2. float t = (float)(Frequency / SampleRate * AxisX);
    3. return 2f * (t - (float)Math.Floor(t + 0.5f))* Amplitude + Offset;




    @RodFromGermany wegen der Sache mit den virtuellen Einheiten ich werde mir das jetzt dann nochmal genauer ansehen um es zu verstehen,
    aktuell liefert meine Variante die Ergebnisse die erwartet werden :) aber trzd danke ich nehm mir jedes wort von dir zu herzen ;) (no joke)

    @VB3-Guru danke für die ganzen links, und für die fft kann ich unsere Firmen interne Lib benutzen. :)


    LG Mausekeks
    Brain is Loading: 35%