Forum: Digitale Signalverarbeitung / DSP / Machine Learning Nachhall auf einem DSP


von Rafael K. (r-kane)


Lesenswert?

Mahlzeit zusammen!

Zur Zeit interessiere ich mich für eine Realisierung eines 
Nachhalleffektes mit einem DSP, doch bin ich noch fern von einer 
Realisierung, denn zwei Probleme beschäftigen mich.

1. Raumimpulsantworten
Bisher habe ich das so gemacht, dass ich mir mit Hilfe von Cool Edit 
Raumimpulsantworten für die Faltung erzeugt habe.
Was mich aber eher interessieren würde: Wie kann ich Raumimpulsantworten 
mit Hilfe von Matlab erzeugen? Irgendwie fehlt mir da der springende 
Gedanke. Ich kann mir ein Signal mit zB einer Sekunde Länge erzeugen und 
den ersten Wert auf 1 setzen. Dann möchte ich dieses Signal irgendwie so 
verarbeiten, dass ich in etwa eine Impulsantwort erhalte, wie es bei 
Cool Edit der Fall ist. Ich habe mittlerweile einige Theorien zur 
Impulsantworterzeugung gelesen, aber anscheinend nicht wirklich 
verstanden oder die Beschreibung war einfach zu mangelhaft, als dass ich 
damit irgendwas in Matlab habe umsetzen können.
Auf jeden Fall habe ich schon das Schrödermodell angewendet mit 4 
Kammfiltern und einem oder 2 Allpässen, aber diese Lösung ist nicht 
wirklich etwas, was ich Nachhall nennen würde.

2. Faltung
Also wie oben geschrieben habe ich mir die Impulsantworten mit Hilfe von 
Cool Edit generiert, die ich dann auch erfolgreich mittels Faltung in 
Matlab verwenden konnte. Das Ergebnis klingt wirklich sehr gut! Aber 
auch hier habe ich erstmal ein Problem: Bei einer Soundlänge von ca. 3 
Sekunden und einer Raumimpulsantwort von 1 sec. bei jeweils 44100 Hz 
habe ich also 44100 * 44100 = 1.944.810.000 MACs pro Sekunde!! Und an 
sich würde ich den Nachhall auch noch länger ziehen wollen. Angeblich 
soll Nachhall mit Hilfe von DSPs in Echtzeit möglich sein, aber ich kann 
mir das bei der hohen Anzahl an Berechnungen schwer vorstellen. Bei 
meiner Soundkarte kann ich sowas ja auch aktivieren und es scheint 
wunderbar zu funktioneren, also muß es ja irgendwie gehen, hehe.
Unter Matlab habe ich bisher die Funktion "conv" verwendet, um die 
Signale im Zeitbereich zu falten, aber auch das dauert Ewigkeiten (ca. 
32 Sekunden auf einem AMD Athlon 64 X2 6000+) und ist nicht besonders 
akzeptabel. Klar, der Rechner hat auch noch anderes nebenbei zu tun im 
Gegensatz zu einem DSP, aber ich hatte gehofft, es gibt eine weitaus 
schnellere Möglichkeit dies zu schaffen.
Jetzt könnte ich natürlich die Signale mittels FFT in den 
Frequenzbereich transformieren und dann eine Multiplikation ausführen. 
Habe das mal ausprobiert aber das erste Problem, was ich dann hatte, 
war, dass Matlab sagte, dass die Dimensionen der Matritzen nicht 
übereinstimmen (klar, das Eingangssignal ist länger als die 
Raumimpulsantwort). Und so wirklich weiter bin ich an dieser Stelle mit 
meinen Gedanken noch nicht gekommen.

So, ich habe mein Problem versucht mal ordentlich zu erläutern. Sollten 
noch Fragen offenstehen, bitte stellen.

Ich würde gerne wissen, was ich da noch machen könnte, um mein Projekt 
voranzubringen. Ich bin für jeden kleinen Hinweis dankbar.
Zur Information: Ich habe derzeit 2 Bücher: Digital Audio Effects (DAFX) 
und Digitale Audiosignalverarbeitung, beide von Zölzer. Leider sind mir 
die Bücher an dieser Stelle keine Hilfe, oder ich habe Informationen 
dummerweise überlesen, die mir da hätten weiterhelfen können.

Im Voraus schon mal Danke für Denkanstöße!

Gruß,
Rafael

von Christoph db1uq K. (christoph_kessler)


Lesenswert?


von Rafael K. (r-kane)


Lesenswert?

Auf die Idee bei Google Books zu schauen bin ich noch gar nicht 
gekommen. Danke für den Tip. Ich werds mir direkt anschauen!

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Rafael Kania wrote:
> Unter Matlab habe ich bisher die Funktion "conv" verwendet, um die
> Signale im Zeitbereich zu falten, aber auch das dauert Ewigkeiten

Nimm die Funktion fftfilt.

von Rafael K. (r-kane)


Lesenswert?

@Christoph: Leider kann ich bei dem Buch nur die ersten 9 Seiten lesen 
(ich bin mir aber ziemlich sicher, dass das Inhaltsverzeichnis fast 
komplett verlinkt war, als ichs das erste Mal aufgerufen habe, später 
jedoch nicht mehr).
Die 3 unteren Links sind leider alle 404.

@Andreas: Vielen Dank! Was ein Erfolgserlebnis :D Anstatt >30sec. habe 
ich jetzt eine Berechnungszeit von unter 0.2sec. für die Funktion 
gehabt! Also das ist ja schon nahezu perfekt :) Ich hab die 
Impulsantwort mal auf 176400 Samples, also auf 4 Sekunden gestreckt und 
selbst da bin ich noch unter 0.5 Sekunden Bearbeitungszeit für die 
Funktion. Besten Dank!

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Ja die machen es einem nicht leicht, ohne Bezahlung Bücher zu lesen. Ich 
dachte mir schon, dass die direkten Links nur temporär funktionieren.
Inhaltsverzeichnis und Register kann man bei Amazon eigentlich immer 
lesen, aber Google bietet ja mit der Suchfunktion den Zugriff auf 
wesentlich spezifischere Seiten, mit Lücken natürlich.

Die Bilder bekomme ich in Firefox durch Rechtsklick neben das Buch und 
"Seiteninformationen anzeigen", dort "Medien" und dann muß ich die 
Adresse des Bildes finden, kopieren und in einem neuen Tab aufrufen. 
Dort läßt sich die "Grafik abspeichern" wieder mit Rechtsklick.

von Rafael K. (r-kane)


Lesenswert?

So, einige Wochen sind vergangen und mein Effekt funktioniert, so wie 
ich ihn haben will. Zumindest bei Matlab.
Natürlich war die einfachste Methode die fftfilt-Funktion zu verwenden, 
ich habe das aber noch etwas zum Verständnis auseinandergepflückt, bzw 
einen Algorithmus verwendet, wie er in "Digitale Signalverarbeitung" 6. 
Auflage (Teubner-Verlag) beschrieben wurde.

Dies funktioniert auch soweit, nur würde ich das gerne irgendwie auf 
Simulink modellieren bzw. das Ganze auf einen DSP bringen und da stecke 
ich fest...

Bisherige Idee ist natürlich, auch hier die Overlap-Add-Methode zu 
verwenden, aber ich bin mir noch nicht so ganz im Klaren, wie ich das in 
Simulink umsetzen kann. Idee ist in etwa Folgende:
  - Eingabe von Sound (Mikro/Wavedatei)
  - Buffer von zB 512 Samples
  - Verlängerung der Impulsantwort auf die nächste 2er-Potenz (zB.
    44100->65536) (m.H. von Zero-Padding?)
  - Verlängerung des im Buffer befindlichen Inhalts auf die Länge der
    Impulsantwort (auch Zero-Padding?)
  - FFT des Signals
  - Punktweise Multiplikation des Signals mit Impulsantwort (wie?)
  - IFFT des Produktes
  - Realteil aus dem komplexen Teil holen
  - Ausgabe des Blocks oder mehrerer gesammelter Blöcke (realer Anteil)

Leider hapert es hier an der Umsetzung. Problem ist, dass ich nicht 
genau weiß, wie ich Simulink sagen kann, dass es immer wieder diese 
punktweise Multiplikation ausführen soll. Ein weiteres Problem ist: Wie 
kann ich durch Variablen bestimmen, um wieviel Samples das Signal im 
Buffer verlängert werden soll. Kann ja auch mal sein, dass ich die 
Impulsantwort modifizieren möchte.
Ich hab bisher auch nichts im Netz dazu finden können... hat da jemand 
vielleicht den Durchblick?
Danke im Voraus!

von Strubi (Gast)


Lesenswert?

Hier noch eine kleiner, etwas unorthodoxer Tip fuer die Praxis:

1. In eine Kirche gehen (oder den Raum mit dem bevorzugten Nachhall) und 
ein gutes Mikrofon und Aufnahmegeraet mitnehmen.
2. In die Haende klatschen, oder einen Knaller zuenden, und das ganze 
aufnehmen.
3. Das Audio-Signal mit dem Sample falten (entsprechend normierter 
FIR-Filter)

Was der Bloedsinn soll? Der Knall ist ein ausreichend guter Impuls, um 
die Impulsantwort (so also die Frequenzcharakteristik) des Raumes in 
kurzer Zeit zu bestimmen. Funktioniert ganz ordentlich bei kleinen 
Raeumen, bei Kirchen wird ab einer gewissen Nachhall-Länge das FIR zu 
ineffektiv, da kommt man mit einem simplen Delay besser weg.
Ich weiss nicht, was die Experten dazu sagen (ich bin keiner), aber ich 
denke, fuer's Nahfeld kommst du mit einem kurzen FIR gut weg, und fuers 
Fernfeld kannst Du die Frequenzcharakteristik weglassen, oder einfach 
vor dem Delay noch einen Bandpass einbauen.
Wie das alles in Simulink oder Matlab gehen soll, weiss ich nicht, aber 
auf einem ollen Motorola 56k hat das damals ganz ordentlich 
funktioniert.

Gruss,

- Strubi

von Rafael K. (r-kane)


Lesenswert?

Hey Strubi,

danke für den Tip aber soweit bin ich schon ^^ Also ne Impulsantwort 
habe ich, Faltunghall mit Matlab ist kein Problem, aber das ganze mit 
Simulink zu modellieren bereitet mir Kopfschmerzen... :/

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
Noch kein Account? Hier anmelden.