Datum: 28.11.2008 01:42
Hallo Meine Soundkarte ist in der Lage, den abgespielten Sound (Musik, Sprache, etc.) beliebig höher/tiefer abzuspielen. Wie wird sowas gemacht? Gruss Michael
Datum: 28.11.2008 14:33
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
Datum: 29.11.2008 10:55
@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.
Datum: 01.12.2008 11:25
@ 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.
Datum: 01.12.2008 14:25
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
Datum: 03.12.2008 23:04
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...
Datum: 03.12.2008 23:21
> 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.
Datum: 03.12.2008 23:23
Dann ist eine FFT also durchaus denkbar? Dann steht doch dem Spieltrieb nichts mehr im Wege... :^)
Datum: 04.12.2008 12:16
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
Datum: 04.12.2008 20:39
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.
Datum: 04.12.2008 20:49
Ein linearer Trend muss noch rausgerechnet werden sonst knackt es und es gibt spektrale Anteile die da nicht reingehören.
Datum: 04.12.2008 20:55
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
Datum: 04.12.2008 21:01
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.
Datum: 04.12.2008 21:15
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
Datum: 04.12.2008 21:33
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).
Datum: 07.12.2008 23:42
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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email ü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
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel