Ich steh grad ein wenig auf dem Schlauch. Ich lese in c Inputsignale in einen Integer ein, jezt will ich die Tonhöhe verändern aber irgendwie komm ich nicht darauf wie ich das realisieren kann. Ich bin mir sicher das es etwas ganz einfaches sein muss aber ich stehe wie gesagt momentan total auf dem Schlauch.
Entspricht dabei das t dem Eingangssignal? Wenn ja kann man die Tonhöhe mit sin(2*pi*n*t) verändern? (Das n wäre dann ein vorher eingesezter Wert) Danke für deine schnelle Antwort
Die Tonhöhe einer Tonaufzeichnung nachträglich zu ändern ist nicht so einfach, geht es darum? Da gibt es den "Pitch-shifter", das geht ähnlich der Zeitlupe/-raffer beim Film. Alle Frequenzen sind mit einem Faktor multipliziert. Dann gibt es noch die Einseitenbandmischung, da wird eine Frequenz addiert, das klingt bei Musik anschließend sehr seltsam. Der "Ringmodulator" war in der experimentellen Musik mal ein beliebtes Spielzeug.
Es geht darum die Tonhöhe in echtzeit zu verändern. Ich lese den Integerwert in c ein bearbeite ihn und gebe ihn gleich danach wieder aus, am besten wäre ein kleines code Beispiel wie das aussehen könnte.
wie gesagt, das geht nicht so einfach, hab schon öfters den "voice changer" von ELV genannt, der arbeitet mit einem MSM6722 von OKI: http://www.alldatasheet.com/datasheet-pdf/pdf/134894/OKI/MSM6722.html http://www.elv.de/Voice-Changer,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_13700
danke für die hilfe ein kompletter Baustein kommt leider nicht in Frage der Aufbau ist unveränderlich es muss leider alles softwareseitig erledigt werden. An Rechengeschwindigkeit oder Ram mangelt es nicht aber am verständnis.
Zum Frequenz-Verdoppeln wird je ein Stück von einigen Millisekunden zwischengespeichert, und doppelt so schnell zweimal ausgegeben. Genauso macht es der Zeitlupe im Film, jedes Bild wird doppelt gezeigt. Die Störung, die sich dadurch ergibt sollte im Infraschallbereich liegen, dann hört man sie nicht so stark.
Also muss das auf jeden Fall auf mehrere Threads verteilt sein das man gleichzeitig aufnnehmen und abspielen kann? Ab eiw vielen samples funktioniert das ganze denn einigermasen? (Es geht um sehr schwache Instrumentensignale also darf die latenz nicht zu hoch werden)
Nein das geht kontinuierlich mit einem Ringpuffer, der mit einem Schreibzeiger z.B. mit einer festen Geschwindigkeit beschrieben wird und mit einem Lesezeiger mit variablem Tempo wieder ausgelesen. Eine kleine Verzögerung ergibt sich immer. Der Lesezeiger überholt bei Frequenzerhöhung immer wieder des Schreibzeiger, bei Erniedrigung kommt er nicht nach und überspringt Stücke aus dem Datenstrom, die schon wieder überschrieben wurden.
Hmm das sind alles Sachen die mir neu sind ich habe bisher nur in diversen Hochsprachen programmiert oder eben direkt mit logikbausteinen gearbeitet daher habe ich ein komplett falsches denkmuster. Ich dachte mir das Schreib und Lesezyklen paralell aber mit unterschiedlicher geschwindigkeit erfolgen müssen => Multithreading. Wie der Ringpuffer (wenn ich es richtig verstanden hab ist das ja nur ein Integer Arrayin dem die Werte ständig überschrieben werden)seriell ablaufen soll ist mir schleierhaft.
Die Methode mit dem Pitch Shift hört sich auch recht interessant an. Wie schwer ist es in etwa das zu lernen und dann umzusetzen? Ich bin udrhcuas bereit einige Stunden zu investieren um mich in die Materie einzuarbeiten aber ich finde zu solchen sachen immer nur beschreibungen für die ein mathestudium als grundkenntnis nicht übel wäre
Das Thema hatten wir schon öfters: http://www.mikrocontroller.net/attachment/12563/PitchChange.png Beitrag "Stimme verzerren?"
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.