www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Stimme in Echtzeit erhöhen


Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Meine Soundkarte ist in der Lage, den abgespielten Sound (Musik, 
Sprache, etc.) beliebig höher/tiefer abzuspielen. Wie wird sowas 
gemacht?

Gruss
Michael

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort Pitch Shifting
Beitrag "Höhe eines Signals verändern"

Autor: nur ein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich machs jezt folgendermasen: 2 Threads mit unterschiedlicher 
geschwindigkeit in einem wird der speicher mit daten gefüllt im anderen 
wird das ganze mit anderer geschwindigkeit ausgelesen. Ist vll. nicht 
die beste methode aber eine sehr einfache

Autor: Martin Laabs (mla)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich mich nicht irre mit

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@nur ein (Gast)

wie willst du das machem, wenn die ausgangsgeschwindigkeit höher ist als 
der eingang, woher soll der der schnellere thread seine daten nehmen? 
Andersrum würde irgendwann der Buffer überlaufen. Und mit Echtzeit hat 
das dann auch wenig zu tun.

Autor: nur ein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter
der buffer (mom. 15 werte) wird wenn er überläuft eben wieder von vorne 
ausgegeben und die 15 werte werden beim eingang wieder überschrieben. 
Bei so kleinen Zeitabständen fällt das ganze nicht auf.

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie's die Karte konkret macht ist schwer zu sagen (es gibt verschiedene
Möglichkeiten.

Ein einfacher Ansatz ist der, das Spektrum einfach komplett nach Oben
(Stimme wird heller) oder nach Unten (Stimme wird dunkler) zu
verschieben, dadurch wird die Abspielgeschwindigkeit nicht verändert.

Gruss

Jörg

Autor: T. H. (pumpkin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die Geschichte mit den unterschiedlichen Samplingfrequenzen 
funktioniert in der Tat recht ordentlich - in anbetracht des Aufwandes.

Das Spektrum "hart" zu verschieben birgt den Nachteil, dass man 
Unstetigkeiten im Spektrum bekommt. Abhilfe würde evtl. eine 
nichtlineare Frequenzverzerrung bringen, also prinzipiell sowas wie eine 
bilineare Transformation auf die Frequenzachse (bildlich gesprochen fürs 
Verständnis). Allerdings habe ich es bisher nicht ausprobiert und sehr 
wahrscheinlich gibt es wesentlich elegantere Methoden. Zudem wäre 
interessant zu wissen, was der Autor unter "Echtzeit" versteht. Just my 
two cents...

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Zudem wäre interessant zu wissen, was der Autor unter "Echtzeit" versteht.

So, dass ich permanent ins Mikrofon reden kann und ohne vom Menschen 
spürbare Verzögerung meine erhöhte Stimme herauskommt.

Autor: T. H. (pumpkin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann ist eine FFT also durchaus denkbar? Dann steht doch dem Spieltrieb 
nichts mehr im Wege...  :^)

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe vor ein/zwei Jahren in DirectSound (Windows-DirectX) einen
Filter mit Spektrumanalyse plus Spektrummodifikation (wie z.B.
Spektrum-Shifting) geschreiben. Bei 48KHz lief das ganze ohne Probleme
lockerst in Realzeit (CPU-Konsum << 10%). Es sollte sich also ohne
Probleme auf DSP/FPGA implementieren lassen.

Was ich nicht verstehe: Warum soll bei Spektrumverschiebungen
Unstetigkeiten entstehen Bei Verschiebung nach Oben werden z.B.
geeignete Were "Unten" aufgefüllt)? Problematischer ist da der
obige Ansatz des Bufferings mit kleinen Fenstern und schnellerem
bzw. langsamerem Abspielen. Zwischen den einzelnen Fenstern hat
man idR. Unstetigkeiten, es sei den es wird zwischen den Fenstern
linear gefiltert. Ob man die aber hört muss man einfach mal
ausprobieren.

Gruss

Jörg

Autor: T. H. (pumpkin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg wrote:
> Was ich nicht verstehe: Warum soll bei Spektrumverschiebungen
> Unstetigkeiten entstehen Bei Verschiebung nach Oben werden z.B.
> geeignete Were "Unten" aufgefüllt)?

Die Frage hast du doch gerade schon selber beantwortet. Nimm ein 
Spektrum, schneide ein Stück aus, schiebe den Ausschnitt. Was du 
bekommst ist ein unstetiges Spektrum. Auffüllen ist eine Methode, 
allerdings eine imho unschöne.

Autor: Jorge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein linearer Trend muss noch rausgerechnet werden sonst knackt es und es 
gibt spektrale Anteile die da nicht reingehören.

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, dann habe ich es falsch beschrieben: ich verschiebe das Spektrum
komplett (keinen Ausschnitt), der Anfangswert dient als Auffüller.
Wird dies bei menschlichen Stimmen oder Musik gemacht, dann sind die
Randswerte idR = 0 (Real und Imaginärteil). Falls er nicht 0 ist:
linear und zügig nach 0 abfallen lassen, einfach auf 0 setzen ergibt
klirren (habe ich bei meiner mittelbilligen 5.1-Soundkarte deutlich
vernommen).

Besser wäre natürlich eine Verschiebung, bei der z.B. der untere
Spektralteil wenig/garnicht verschoben wird und mit steigender
Frequenz immer mehr verschoben wird (z.B. mit höherpolynomialer Ansatz).
Muss man aber mal ausprobieren.

Weiss jemand, wie's denn professionell gemacht wird?

Gruss

Jörg

Autor: T. H. (pumpkin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg wrote:
> Sorry, dann habe ich es falsch beschrieben: ich verschiebe das Spektrum
> komplett (keinen Ausschnitt), der Anfangswert dient als Auffüller.
> Wird dies bei menschlichen Stimmen oder Musik gemacht, dann sind die
> Randswerte idR = 0 (Real und Imaginärteil). Falls er nicht 0 ist:
> linear und zügig nach 0 abfallen lassen, einfach auf 0 setzen ergibt
> klirren (habe ich bei meiner mittelbilligen 5.1-Soundkarte deutlich
> vernommen).

Achso. Dass sich das nicht so berauschend anhört glaube ich.

> Besser wäre natürlich eine Verschiebung, bei der z.B. der untere
> Spektralteil wenig/garnicht verschoben wird und mit steigender
> Frequenz immer mehr verschoben wird (z.B. mit höherpolynomialer Ansatz).
> Muss man aber mal ausprobieren.

Genau das meinte ich mit meinem "bilinearen" Ansatz.  :^)   Gut wäre 
wenn man eine Einhüllende des Spektrums berechnet, dann ist man flexibel 
beim Verschieben.

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du denn Ansatz mal ausprobiert? Muss mal am Wochenende mein
Filter-Programm ausprobieren, war glaube ich flexibel genug, um
das ganze mal zu testen.
Aber DirectSound als Testsystem zu verwenden ist auch nur bedingt
ermpfehlenswert. Ändert man z.B. die Abspielgeschwindigkeit (wie
Oben beschrieben), dann hört sich das ganze schnell "beschissen" an
(liegt aber vieleicht an meiner Soundkarte). Mit FPGA bzw. DSP lassen
sich solche Ansätze bis auf wenige 10 ns genau steuern.

Gruss

Jörg

Autor: T. H. (pumpkin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, habe ich nicht. Würde ich erstmal in MATLAB probieren bevor ich da 
richtig anfange zu programmieren.

Was mir gerade noch einfällt: Wichtig wäre in meinen Augen auch eine 
überlappende Blockanalyse des Zeitsignals, um anschließend wieder 
überlappende Blöcke zu erhalten - womit sich auftretende Unstetigkeiten 
an den Blockgrenzen im Zeitsignal etwas ausbügeln lassen (die 
bearbeiteten Blöcke werden sich nicht mehr nahtlos aneinander fügen, 
außerdem sollte man ohnehin fenstern - was man zu so gleich ausnutzen 
kann).

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Spektrum einfach zu verschieben laesst die Stimme allerdings nicht 
nur hoeher klingen, sondern voellig anders, da die Frequenzen der 
Harmonischen nicht mehr im gleichen Verhaeltnis zueinander stehen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.