Soundgenerierung durch Überlagerung von Kreisfunktionen



  • Hi Leutz,

    da ich das Thema schonmal gepostet habe und mir gesagt wurde so nicht bzw. im falschen bereich wollt ich jetzt nochmal genauer werden.

    Also das Thema lautet: Soundgenerierung durch Überlagerung von Kreisfunktionen unter Linux.

    Ich könnte dafür von euch etwas Hilfe gebrauchen. Vielleicht einfach erstmal wie ich das am besten mache, denn soviel Erfahrungen mit C/C++ hab ich noch nicht.Hier noch etwas genauer was ich machen soll:
    1. Entwicklung eines Programmpaketes in C/C++ zur Generierung überlagerter Kreisfunktionen unterschiedlicher Frequenz, Phase und Amplitude unter Verwendung einer Sinus-Lookup-Tabelle für 8Bit (16Bit) Digital-Signale.
    2. Erstellen von Unterprogrammen zur Erzeugung der Töne der Tonleiter und von Klängen.
    3. Generierung von Klängen, Abspeichern von Signalsequenzen als (mono/stereo)-wave-Datein.
    4. Abspielen der wave-Dateien unter Linux.

    Ich will nicht dass ihr mir meine Aufgabe proggt, sondern einfach nur Hinweise wie ich da ran gehe bzw. Tipps wie ich das hinbekommen kann. Zum Beispiel weiß ich nicht was eine Sinus-Lookup-Tabelle ist bzw. wie ich eine erstelle.

    ich wär euch über jede Hilfe zu tiefsten Dank verpflichtet.

    mfg Basti



  • Dieser Thread wurde von Moderator/in Korbinian aus dem Forum Projekte in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • DiggaPdm schrieb:

    Ich will nicht dass ihr mir meine Aufgabe proggt, sondern einfach nur Hinweise wie ich da ran gehe bzw. Tipps wie ich das hinbekommen kann. Zum Beispiel weiß ich nicht was eine Sinus-Lookup-Tabelle ist bzw. wie ich eine erstelle.

    Das ist ein Array, in dem vorberechnete Werte der Sinus-Funktion abgelegt werden, mit dem Ziel, auf diese dann ohne die (angenommene) langsame Neuberechnung zugreifen zu können.

    Wenn du noch mehr konkrete Fragen hast, immer her damit, aber so allgemein ist das nix.

    Vielleicht könntest du noch was zum Level, auf dem das stattfinden soll, schreiben. Ist das für die Schule? Ausbildung? Studium?



  • Hi,

    danke erstmal für deinen Beitrag. Also konkrete Fragen, nun ja malsehen, ich hoffe dass das konkrete Fragen sind für Dich!

    1. Wie generiere ich eine solche Sinus-Lookup-Tabelle denn?
    2.Kreisfunktionen unterschiedlicher Frequenz,Phase und Amplitude. Werde diese Unterschide schon in der Lookup-Tabelle berücksichtigt?
    2.Wie erzeuge ich Töne der Tonleiter bzw. Klänge?
    3.Wie kann ich diese abspielen bzw. speichern?

    Zur tiefe, naja es ist fürs Studium, aber eigentlich nur ne kleinere Aufgabe. Nur wir hatten zwar vor 2 Semestern mal C/C++ Programmierung, aber nur wirklich ganz kurz (das waren 3x8h). Und danach find ich kann man dann nicht sowas hier verlangen. Naja egal nun muss ich sehen dass ich das beste daraus mache....ich danke Dir/euch schonmal im voraus!

    mfg



  • zu 1)
    indem du sie vorher einmal von dem rechner ausrechnen lässt... kannst du z.b. in ner schleife rechnen lassen und die ausgabe in eine textdatei umlenken...
    dann kopierst du das in deinen quellcode...

    oder du liest die werte halt beim programmstart immer aus ner datei ein aber soviel arbeit würde ich mir zum testen und rumspielen erstmal nicht machen...

    zu 2) du brauchst einfach nur ne grundfrequenz... die legst du fest... du könntst z.b. 440 Hz nehmen das ist dann ein a...

    um dann immer den nächsten halbton zu bekommen multiplizierst du die grundfrequenz mit der zwölften wurzel aus 2.... also wenn du z.b. 3 halbtöne über ein a willst einfach mit (zwölfte wurzel aus 2)^3 multiplizieren und dann hast du ein c...
    das kommt da her das du auf ner oktave immer ne frequenzverdopplung hast und 12 halbtöne pro oktave... (ein musiker wird mich für diese aussage vermutlich erschiessen aber der normalsterbliche hört da keinen unterschied).. auch hier kannst du wieder lookuptable verwenden um dir die rechnerei zu ersparen...

    zu3) abspielen kannst du das zum testen erstmal auf dem PC-Speaker... ist Os abbhängig wie die C++-Funktion dafür heisst...



  • DiggaPdm schrieb:

    1. Wie generiere ich eine solche Sinus-Lookup-Tabelle denn?

    z.B. so:

    const double pi = 3.141...
    double table[360];
    for (int i = 0; i < 360; ++i)
      table[i] = sin(i * pi / 180);
    

    Das ist nur ein übersimplifiziertes Beispiel. Du musst wissen, wieviele Werte du brauchst. Ausserdem ist die sin-Funktion bekanntlich hochgradig symmetrisch, so dass auf jeden Fall reichen würde, Werte bis 45° abzulegen. Beim auslesen kann man dann noch verschiedene Interpolationstechniken benutzen. Erforsche das Gebiet mal. Ach ja, nur damit das klar ist, diese Lookup-Geschichte hat keinerlei primären Nährwert, weil es nur eine Möglichkeit ist, die Berechnung des Sinus zu beschleunigen. Eventuell können heutige Prozessoren den Sinus auch so schnell berechnen, dass sich das nicht mehr lohnt, ich bin da nicht mehr so im Bilde.

    2.Kreisfunktionen unterschiedlicher Frequenz,Phase und Amplitude. Werde diese Unterschide schon in der Lookup-Tabelle berücksichtigt?

    Nein.

    2.Wie erzeuge ich Töne der Tonleiter bzw. Klänge?

    Du bestimmst erstmal die Grundfrequenz der Note. Der Kammerton A hat beispielsweise 440 Hz. Tonhöhenempfindung ist logarithmisch, eine Oktave entspricht genau einer Verdoppelung der Tonhöhe. Für die Frequenzen der Zwischentöne gibt es verschiedene Stimmungen, aber die heute gebräuchlichste setzt einfach pro Halbton einen Faktor von 12-te Wurzel aus 2 an. Beispiel: Wenn A 440 Hz hat, dann hat das nächsthöhere C (3 Halbtöne höher) eine Frequenz von440 \mathrm{Hz}\cdot (\sqrt[12]{2})^3 = 523{,}25 \mathrm{Hz}

    Soviel zur Grundfrequenz. Eine simple Sinusschwingung ist aber ein recht langweiliger Piepton. Der Klang eines Musikinstruments wird erst durch die Obertöne bestimmt (BTW schonmal von Fourier gehört? Spektrum usw.?). Man müsste also die entsprechende Obertonverteilung des gewünschten Klanges kennen und diese Schwingungen zur Grundschwingung hinzuaddieren.

    Das letzte wichtige ist die zeitliche Veränderung des Klanges, vom Anschlag bis zum Ausklingen. Dazu kann vielleicht jemand anderes noch was sagen.

    3.Wie kann ich diese abspielen bzw. speichern?

    Weiß ich nicht konkret. Eine Beschreibung des WAV-Formates müsstest du auf www.wotsit.org finden.

    edit: Hmpf zu langsam. Sachmal, warum hast du das gleiche Beispiel (3 Halbtöne über A) genommen? 😃



  • edit: Hmpf zu langsam. Sachmal, warum hast du das gleiche Beispiel (3 Halbtöne über A) genommen? 😃

    lol das hab ich mich auch gerade gefragt...



  • Hi,

    danke erstmal soweit für die Hilfe! Werd malsehen, ob ich damit was anfangen kann bzw. was damit zustande bringe.

    Vielleicht eins erstmal noch. Wie schreib ich nen Unterprogramm um Wave-Files abzuspielen?
    Aso, ich muss doch auf irgendwelche Sounddevices von Linux zugreifen um überhaupt Sound abspielen oder generieren zu können oder? Wie mach ich das denn?

    mfg Basti



  • up





  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Rund um die Programmierung in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • @kingruedi

    DANKE!!! Ich werds mir gleich mal zu gemüte führen!


Anmelden zum Antworten