PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Freeware zum Offlinefalten?



Sleepwalker
02.07.2011, 09:42
Hi,

ich suche eine Freeware mit der man zwei oder mehr Impulse Offline falten kann, und die das Ergebnis dann auch gleich wieder kürzt. Beim Falten entsteht ja eine doppelt so lange Datei, und die möchte ich nicht manuell beschneiden, denn sonst könnte man das auch mit Brutefir machen.
Gibt es da was?

fosti
04.07.2011, 15:45
www.scilab.org

Chaomaniac
04.07.2011, 16:27
Scilab ist aber keine Freeware nicht...
An freier Software gäb's noch GNU Octave, schlägt in eine ähnliche Richtung wie Scilab oder das proprietäre Matlab.
Inwieweit die alle zum Falten geeignet sind, keine Ahnung.

P.S.:
BrutFIR ist doch auch freie Software, oder?
Warum nicht das modifizieren?

P.P.S.:
Was spricht gegen ein Script, bei dem man selber genau steuern kann, was genau passiert?

Sleepwalker
04.07.2011, 18:13
Hi,

ich brauche das um mehrere Faltungen automatisch ablaufen zu lassen. Hintergrund: Ich höre über Linux/Brutefir, wobei ich je einen Impuls habe für.
-Chassis entzerren (linear)
-Frequenzweiche
-DRC
-EQ über alles

also 4 hintereinandergeschaltete Filter, die ein 4 mal so langes Delay ergeben. Ich würde daher gerne die Dateien vor dem Start von Brutefir alle Offline miteinander falten, so das ein "Gesamtimpuls" dabei rauskommt, der nicht länger als die Einzelfilterlänge ist. Das geht zwar auch mit Brutefir, aber das Ergebnis wird ja immer länger, so das ich am Ende nix gewonnen habe. Ich müsst das dann manuell beschneiden, und das würde ich gerne umgehen. Das Programm müsste also den Peak des Gesamtimpulses erkennen, und dann bei X Samples davor und Y Samples danach nen Schnitt machen, und mir das Ergebnis liefern...

fosti
04.07.2011, 20:33
Scilab ist aber keine Freeware nicht...
...
Also Freeware (doppelte Negation): "Scilab 5 is governed by the CeCILL license (GPL compatible) abiding by the rules of distribution of free software.
See the information delivered on the Free Software Foundation on CeCILL >> (http://www.fsf.org/licensing/licenses/)
You can use, modify and/or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL: http://www.cecill.info (http://www.cecill.info/)"


Unter Matlab heisst der Befehl "convolve", sollte unter Scilab ähnlich sein....

Chaomaniac
04.07.2011, 23:25
Genau auf das wollte ich raus.
Free Software ≠ Freeware...

nr12
05.07.2011, 08:57
Hallo Leute,

viel wichtiger in dem Zusammenhang, wenn diese Tools genannt sind:
Welcher Algorithmus soll denn hier laufen?
Gibt es schon m-Skripte (z.B. für Octave), die das beispielhaft implementieren?

Gruß

Ulf

Sleepwalker
05.07.2011, 11:14
P.S.:
BrutFIR ist doch auch freie Software, oder?
Warum nicht das modifizieren?


Von den genannten Vorschlägen ist mir das noch am sympatischten, denn es fehlt hier tatsächlich nur die Funktion "Peak suchen und beschneiden". Alles andere kann Brutefir schon.

Uli.Brüggemann
05.07.2011, 15:33
Na ja, ganz so einfach ist es vielleicht nicht.
Das Falten ist kein Problem. Das einfache Ausschneiden ist im Prinzip ein Abschneiden inkl. gedachtes Fensterns mit einem Rechteckfenster. Das kann dann Einschwingprobleme bereiten, wenn die Samples/taps am Anfang und Ende <> 0 sind.
Normalerweise würde man dann also nach dem Ausschneiden noch passend fenstern, als da wären Hanning, Hamming, Blackman etc.

Natürlich können Matlab, Octve & Co das auch. Ich kenn noch so ein Programm, ist aber nicht Freeware :)

Sleepwalker
05.07.2011, 18:35
Natürlich können Matlab, Octve & Co das auch. Ich kenn noch so ein Programm, ist aber nicht Freeware :)

Ja so ein Programm kenn ich auch, aber mit diesem Programm gibt es das Problem ja gar nicht :D. Das mit dem Fenstern ist mir aber noch nicht ganz klar, denn die letzte Messung findet natürlich mit DRC und allen anderen Filtern im Einsatz statt.
Die anderen Filter werden nicht durch Messungen, sondern "statisch" erzeugt. Einmal durch dein MAXO, und in den beiden anderen Fällen von BruteFir selbst (EQ). Das MAXO wird aber vermutlich eh wegfallen, und die Trennung auch per BrutefirEQ durchgeführt. War halt erstmal bequemer.

Um Acourate drück ich mich zum einen wegen der Kosten rum, zum anderen wegen der hardwaregebundenen Einzelplatzlizenz. Den Kostenpunkt hatte ich schon überwunden, aber die Lizenzierung passt mir nicht. Ausserdem bastel ich natürlich auch gerne. Es kommt jeden Monat ein bischen mehr Verständnis für die Sache dazu. Es kann sich also nur noch um Monate handeln. Zum Glück hab ich Zeit:D

Torsten

The Alchemist
19.03.2012, 17:49
Ich hol das mal hier wieder hoch, da ich aus gegebenem Anlass ebenfalls den Wunsch hatte zwei Filter miteinander zu "verfalten".

Ich hab das mit Brutefir erledigt und bie mir ist das Ergebnis nicht doppelt so groß wie die beiden Filterdateien.

Beispiel:

Verfalten möchte ich die beiden Dateien brdrcl.pcm und fliterl.pcm.

Beide Dateien sind 256kb groß. Als Eingangsfile benutze ich brdrcl.pcm, innnerhalb von Brutefir arbeitet filterl.pcm. Das Ausgangsfile heißt kombil.pcm und ist genau wie das Eingangsfile nur 256kb groß.

Folgende Brutefir.conf habe ich verwendet:



float_bits: 32; # internal floating point precision
sampling_rate: 44100; # sampling rate in Hz of audio interfaces
filter_length: 4096,16; # length of filters
overflow_warnings: true; # echo warnings to stderr if overflow occurs
show_progress: true; # echo filtering progress to stderr
max_dither_table_size: 0; # maximum size in bytes of precalculated dither
allow_poll_mode: false; # allow use of input poll mode
modules_path: "."; # extra path where to find BruteFIR modules
monitor_rate: false; # monitor sample rate
convolver_config: "~/.brutefir_convolver"; # location of convolver config file

logic: "cli" { port: 3000; };

## COEFFS ##

coeff "left" {
filename: "/home/ek/filterl.pcm";
format: "FLOAT_LE";
attenuation: 0.0;
};



## INPUT OUTPUT ##

input "left" {
device: "file" { path: "brdrcl.pcm"; };
sample: "FLOAT_LE";
channels: 1;
};

output "left" {
device: "file" { path: "kombil.pcm"; };
sample: "FLOAT_LE";
channels: 1;
};

## FILTER ##

filter "left" {
from_inputs: "left";
to_outputs: "left";
coeff: "left";
};

Gruß

Elmar

Sleepwalker
19.03.2012, 20:21
Hi,

sind das minimalphasige Filter? Falls ja: Ist der Ausgang wirklich gar nicht grösser geworden, oder nur um die Partitionsgrösse (4Kb)?

The Alchemist
19.03.2012, 20:54
Also zunächst muss ich mich mal korrigieren, der Impuls filterl.pcm, also der der in Brutefir arbeitet, ist 512 KB gross, dabei handelt es sich um meine "Vorentzerrung", die ich mit den EQ´s aus REW gebastelt habe.

Der Impuls, den ich als Eingangsfile benutze ist mit DRC erstellt, die "Überallesentzerrung" und der ist 256 KB gross.

Das Ergebnis "kombil.pcm" ist genau wie das Eingangsfile "nur" 256 KB gross. (alles KB nicht kb, sorry dafür :o ) ob es sich dabei um Minimalphasige Filter handelt ?

Tatsache ist, dass ich mein Ziel erreicht habe, durch weniger Coeffs, habe ich wieder mehr freien Speicher ( TinyCore läuft ja vollständig im RAM) gewonnen.

Ob die Latenz im Gegensatz zum vorhergegangenen "from Filter to Filter" Prozedere kleiner geworden ist, müsste ich erst noch messen.

Gruß

Elmar

slacky
21.03.2012, 18:28
Wie handhabt das BruteFIR eigentlich mit den Filterlängen? Man muss ja immer Angaben machen, wie Elmar z.B. 65536.

Gibt man BruteFIR ein kürzeres Filter wird er vermutlich zero padden. Nur wie? Wird am Anfang und am Ende mit 0en gepadded um die Eigenschaft der linearphasigkeit beizubehalten?
Ich vermute mal, dass es nicht so gemacht wird da ich bei unterschiedlich langen Filtern auch unterschiedliche Delays erhalte. Die wären exakt gleich wenn vernünftig gepadded wird da beide Impulse bei 32768 wären.

Was passiert wenn man ihm ein längeres Filter gibt? Schneidet er einfach das Ende ab? Habe ich jetzt noch nicht getestet.

Ich frage deshalb, weil hier die Rede von unterschiedlich großen Sätzen an Koeffizienten war.

256kB deuten bei 32Bit floats auf eine Filterlänge von ~64000 hin. 512kB auf das doppelte - es sei denn es wären 64Bit doubles.

Da hintereinandergeschaltete Filter auch nacheinander berechnet werden scheint es hier dann keine Probleme mit den Delays zu geben aber das ganze hat mich wieder auf die Fragestellung gebracht ;)

Ansonsten würde ich mir das Faltungsergebnis mal plotten lassen. Wer kein Matlab oder sowas hat kanns auch mit Excel/Open Office machen. Bei linearphasigen sieht man sofort den Impuls in der Mitte.

Achja falls immer noch ein Programm für das Falten von Filtern gewünscht ist könnte ich da vielleicht was machen.

Sleepwalker
22.03.2012, 06:20
Gibt man BruteFIR ein kürzeres Filter wird er vermutlich zero padden. Nur wie? Wird am Anfang und am Ende mit 0en gepadded um die Eigenschaft der linearphasigkeit beizubehalten?
Ich vermute mal, dass es nicht so gemacht wird da ich bei unterschiedlich langen Filtern auch unterschiedliche Delays erhalte.
Achtung, jetzt kommt Halbwissen (bestenfalls) und Raten...

Nach meinen Verständnis wäre es (fast) egal wo die Nullen dranhängen, solange es Nullen sind. Abschneiden wäre ganz schlecht, weil das einem Rechteckfenster entspräche, mit den entsprechenden negativen Effekten.
Unterschiedliche Delays hat man bei unterschiedlichen Filterlängen, denn das Delay (Gesamtverzögerung) setzt sich ja aus 2x Partitionsgrösse + "Verzögerung bis zur Spitze der Filterdatei" zusammen. Das bei Elmar die gleiche Länge bei Eingang/Ausgang rauskommt, finde ich seltsam.
Nimmt man mal eine "ungewöhnliche" Filterdatei, d.h. eine mit einem Impuls am Anfang und "irgendwas" (also z.B. noch eine Spitze) am Ende, so hört man ein Echo (also z.B. zwei Impulse). Man kann die beiden Signale (Eingang/Filter) ja auch vertauschen, also den Eingang zur Filterdatei machen, und die Filterdatei da durch "jagen". Das Ergebnis muss ja das Gleiche sein, so wie 2+4 = 4+2 ist.
Nimmt man als Eingangssignal ein Rauschen und filtert es mit einem Filter der die besagten 2 Spitzen (Anfang/Ende) hat, ergibt sich natürlich etwas, das länger ist als der Eingang.
Vereinfacht gesagt beginnt die Wiedergabe mit dem ersten Impuls, und endet nach dem das Eingangssignal den zweiten Impuls (des Filters...) durchlaufen hat (Echo). Daher müsste bei einem nicht minimalphasigem Filter der Ausgang IMO länger sein.
Brutefir nutzt ja die schnelle Faltung, d.h. es arbeitet eigentlich im Frequenzbereich. Es wird (nach meinem Verständnis) eine FFT der Filterdatei gemacht, und geguckt wieviel von Frequenz X (Amplitude) und wann (Phase) vorhanden ist, und multipliziert die Frequenz- und Phasenanteile mit den Frequenz- und Phasenanteilen des Eingangssignals.
Das ist IMO solange kein Problem, solange alles minimalphsig bleibt, und die Phase den "Aplitudenanteilen" entspricht. Hat man Phasensprünge (Verzögerungen), müsste der Ausgang länger werden, weil das "Wann" später erfolgen kann, als beim Orginalsignal. Im Extremfall wäre dann die Antwort so lang wie Filter + Eingangssignal.

Das sie gleich lang sind, liegt also IMO daran, das der grösste Teil des Filters aus Nullen besteht und somit zeitlich gesehen das Eingangssignal nicht verlängert wird.

Interessant wäre doch die Frage, wie der Ausgang aussieht wenn man mal Filterdatei und Eingangsdatei tauscht. D.h. die längere Datei als Eingang nehmen...Imo sollte das Ergebnis gleich sein. Wenn die Ausgangsdatei dann wieder der Eingangsdateilänge entspricht, können das ja nur Nullen an Anfang und Ende sein...

Vieleicht ist das aber auch kompletter Unsinn? Keine Ahnung...

The Alchemist
22.03.2012, 07:28
Moinsen,

wenn ich die "lange" Impulsdatei (filterl.pcm, 512KB) als Eingang verwende ist die Datei auch wieder 512 KB groß am wenn sie hinten raus kommt.

Probiert das doch einfach mal mit 2 Impulsen und der Brutefir Config die ich angegeben habe (da müssen dann nur die Pfade zu den Impulsdateien geändert werden.)

Für mich ist die Diskussion zu hoch ;) , aber wenn ich mir vorstelle eine WAV-Datei zu offline zu falten, um sie z.B im Auto wiederzugeben, dann darf die Datei ja auch nicht länger werden als vorher; sie muss "nur" verändert werden.

Versucht man allerdings zwei Impulse mit lsconv zu falten, dann bekommt man ein vergrössertes File:

lsconv filterl.pcm brdrcl.pcm kombi2.pcm

Gruß

Elmar

waterburn
22.03.2012, 07:39
Hallo Sleepwalker,

ohne BruteFIR zu kennen würde ich deinen treoretischen Überlegungen zustimmen. Eine ergänzende Idee hätte ich allerdings noch. Ein Grund dass die Ausgabedatei nicht länger ist als die Eingangsdatei könnte sein, dass BruteFIR die zusätzlichen Koeffizienten zwar berechnet, aber noch nicht ausgibt, da es auf weitere Eingaben wartet. Stichwort wäre hier die segmentierte Faltung (http://de.wikipedia.org/wiki/Segmentierte_Faltung) bzw. das Overlap-Add Verfahren.

gruß
waterburn

The Alchemist
22.03.2012, 08:07
Hier mal zwei Bildchen:

Ich hab die beiden Filter, einmal mit lsconv gefaltet (die obere Spur) und einmal mit Brutefir (die untere Spur :D)

http://s14.directupload.net/file/d/2837/eb9jijcl_png.htm

Dann noch vergrössert:

http://s14.directupload.net/file/d/2837/gtukb4q8_png.htm


Gruß

Elmar

Sleepwalker
22.03.2012, 09:01
Moinsen,

wenn ich die "lange" Impulsdatei (filterl.pcm, 512KB) als Eingang verwende ist die Datei auch wieder 512 KB groß am wenn sie hinten raus kommt.

Probiert das doch einfach mal mit 2 Impulsen und der Brutefir Config die ich angegeben habe (da müssen dann nur die Pfade zu den Impulsdateien geändert werden.)

Hab ich. Es stimmt was du schreibst. Das kann aber (imo) nur sein, wenn der Filter minimalphasig ist. Beim REW ist er das auf jeden Fall, beim DRC kann man das einstellen.



Für mich ist die Diskussion zu hoch ;) , aber wenn ich mir vorstelle eine WAV-Datei zu offline zu falten, um sie z.B im Auto wiederzugeben, dann darf die Datei ja auch nicht länger werden als vorher; sie muss "nur" verändert werden.

Das stimmt eben nur bedingt. Du veränderst ja (evtl.) die Phase, was nichts anderes als der "Zeitpunkt" ist. Wenn du nun die tiefen Töne verzögerst, die hohen aber nicht (aka Phasenverschiebung), fängt das Wav bei der Wiedergabe mit den hohen Tönen an, die Tiefen setzten aber später ein und hören auch erst später auf. Das kann eben zu einem Ausgangswav mit der Größe (im Extremfall) Wav+Filterlänge führen. Im Prinzip passiert ja genau das, wenn man mit der Impulsantwort eines Raums (z.B. Kirche) arbeitet. Da sollte dann das Ausgangsfile um z.B. das Echo länger sein. Dieses Echo findet sich in der Impulsantwort des Raums rechts vom "Orginalimpuls", so wie man es auch bei Reflexionen bei Messungen hat. Da sieht man die "Zacken" in der Impulsantwort auch. Das führt dann zum Echo. Kannst du leicht testen, wenn du deinen Raum misst und die Messung nicht durch DRC jagst, sondern direkt mit der Raumimpulsantwort faltest. Das geht z.B. mit dem REW. Du misst und exportierst nicht die Impulsantwort der Filter (EQs), sondern der Messung. Das hört sich so an, als wenn du Musik über die Boxen abstpielst und mit dem Mikro aufnimmst. Ganz grausam...
Wenn du die dann mit deiner Test-Config als Filterdatei nimmst, MUSS (IMO) die Antwort läger werden. Sonst stimmt irgendwas nicht...im Zweifel mein Verständnis der Materie...



Versucht man allerdings zwei Impulse mit lsconv zu falten, dann bekommt man ein vergrössertes File:

lsconv filterl.pcm brdrcl.pcm kombi2.pcm

Das könnte daran liegen, das lsconv "wirklich" faltet, und nicht wie Brutefir "trickst". Du kannst dir die Faltung als zwei Messschriebe vorstellen, wo jeweils die Impulsantwort auf einem langen Blatt Papier ausgedruckt ist. Nun legst du die Blätter übereinander, und zwar so, dass vom vom oberen Blatt die rechte untere Ecke, und vom unteren Blatt die linke obere Ecke aneinander stossen. Also seitlich versetzt. Beim Falten schiebst du jetzt die Blätter aneinander vorbei. Immer wenn auf einem Blatt ein Wert (Sample) > 0 ist, "passiert" ja irgendwas, d.h. das Ergebnis (Ausgang) weicht von 0 ab. Wenn du die Blätter nun aneinander "vorbei" von Sample zu Sample schiebst, ergibt der Ausgang genau die Länge von "2 Blatt".
Die E stellt die Eingangssamples dar, F die Samples (Koeffizienten) des Filters, und A das Ausgangssignal.


1.
E :x x x x x x x 0
F: 0 0 0 y y y y y y y y
A: 0

2.
E:0 x x x x x x x x 0
F: 0 0 0 y y y y y y y y
A: 0 0 0 z 0

3.
E:0 0 x x x x x x x x 0
F: 0 0 0 y y y y y y y y
A: 0 0 0 z z 0

4.
E:0 0 0 x x x x x x x x 0
F: 0 0 0 y y y y y y y y
A: 0 0 0 z z z 0

5.
E:0 0 0 0 x x x x x x x x 0
F: 0 0 0 y y y y y y y y
A: 0 0 0 z z z z 0

5.
E:0 0 0 0 0 x x x x x x x x
F: 0 0 0 y y y y y y y y
A: 0 0 0 z z z z 0

usw.

So sieht das aus. Dann versteht man auch, warum ein linearphasiger Filter, dessen Impuls in der Mitte (der Impulsantwort des Filters) ist, eine Verzögerung (Latenz) von mind. der halben Filterlänge hat, ein minimalphasiger Filter, dessen "Spitze" aber am Anfang der Impulsantwort (Koeffizienten) ist, eben "nur" die Latenz von 2x Partitionsgrösse hat. Das Eingangssignal "sieht" beim "vorbeischieben" an den Filterkoeffizienten "sofort" etwas >0 und hat somit "sofort" was am Ausgang, wärend bei einem Impuls in der Mitte (lin.phasig) erstmal durch den halben Filter geschoben werden muss, bevor nennenswerte Grössen am Ausgang entstehen. "Nennenswerte" ist hier wichtig, weil die Koeffizienten zwar klein, aber nicht unbedingt 0 sind.

Wenn lsconv also richtig falten, und nicht wie Brutefir trickst, werden auch alle "Nullen" berücksichtigt, und landen als Sample am Ausgang. Wenn man aber in der Frequenzebene "faltet", existiert diese "0' nicht, d.h. sie entspricht keiner Amplitude/Phase, und fällt somit "weg".

So erklär ich mir das...ob das stimmt...

Edit: Meine Darstellung sollte anders aussehen. Offenbar verwirft die Forensoftware "überflüssige" Leerzeichen...

The Alchemist
22.03.2012, 12:29
Boah ey Torsten,

ich versteh das mit dem Falten in diesem Leben wohl nich mehr, für mich reicht es, dass es funzt :D

Ich hab verstanden, dass "Der Bürgermeister von Wesel" um den "Esel" verlängert wird, und das wohl alle meine Filter minimalphasig sind (ist das schlimm? ;))

Da gibt es dann noch das Programm MarcPM von U. Brüggemannn, das aus minimalphasigen Filtern linearphsige machen kann, das funktioniert allerdings nicht ganz so wie ich mir das vorgestellt hab, also konnte ich nicht testen, ob man längere Filter erhält wenn man nur linearphasige Filter faltet.


Wenn ich jetzt aber davon ausgehe, das Brutefir trickst, faltet Brutefir dann generell minimalphasig?


Gruß

Elmar

Sleepwalker
22.03.2012, 13:25
Wenn ich jetzt aber davon ausgehe, das Brutefir trickst, faltet Brutefir dann generell minimalphasig?


Nein :D.
Man muss sich das eher so vorstellen, das Brutefir alles weglässt wo sowieso 0 bei rauskommt, wärend die "echte" Faltung die Nullen mit rausgibt. Das Ergebnis ändert sich nicht, wie man bei dir an den Screenshots sehen kann. Es fehlen nur die sowieso bedeutlungslosen Nullen.

Bei DRC kann man in der config einstellen ob das Ergebnis eher linear- oder minimalphasig sein soll.
Um von minimalphasig auf linearphasig zu kommen hat der User KSTR im Hifi-Forum mal den Tipp gegeben, die min-phasige Impulsantwort (also das was du im REW als IR der EQs exportierst, und die zeitliche inverse zu falten. Zeitliche Inverse wäre die Impulsantwort zeitlich umgedreht, d.h. letzes Sample wird 1., vorletztes wird 2. usw.
Vieleicht kann Audacity das sogar (Reverse?). Im Prinzip wäre es so, als würdest du die PCM-Datei falsch rum abspielen. Wenn Audacity das kann, exportierst du das Ergebnis, und faltest das mit dem Orginal (also nicht umgekehrtem) Impuls. Was dann rauskommt hat (sollte(?))den gleichen Frequenzgang, aber eine lineare Phase. Das Ergebnis hat dann nicht mehr einen Impuls irgendwo am Anfang, der dann ausschwingt, sondern etwas in der Mitte das symetisch ist. D.h. Aus- und Einschwingen sollte gleich aussehen. Ob man dann so hören sollte...da bin ich unsicher. IMO müsste das zu ordentlichem Preringing führen...aber wie gesagt...da bin ich unsicher.

slacky
22.03.2012, 18:11
Nach meinen Verständnis wäre es (fast) egal wo die Nullen dranhängen, solange es Nullen sind. Abschneiden wäre ganz schlecht, weil das einem Rechteckfenster entspräche, mit den entsprechenden negativen Effekten.
Unterschiedliche Delays hat man bei unterschiedlichen Filterlängen, denn das Delay (Gesamtverzögerung) setzt sich ja aus 2x Partitionsgrösse + "Verzögerung bis zur Spitze der Filterdatei" zusammen. Das bei Elmar die gleiche Länge bei Eingang/Ausgang rauskommt, finde ich seltsam.
Nimmt man mal eine "ungewöhnliche" Filterdatei, d.h. eine mit einem Impuls am Anfang und "irgendwas" (also z.B. noch eine Spitze) am Ende, so hört man ein Echo (also z.B. zwei Impulse). Man kann die beiden Signale (Eingang/Filter) ja auch vertauschen, also den Eingang zur Filterdatei machen, und die Filterdatei da durch "jagen". Das Ergebnis muss ja das Gleiche sein, so wie 2+4 = 4+2 ist.
Nimmt man als Eingangssignal ein Rauschen und filtert es mit einem Filter der die besagten 2 Spitzen (Anfang/Ende) hat, ergibt sich natürlich etwas, das länger ist als der Eingang.Soweit bin ich einverstanden: Faltung ist komplett kommutativ, assoziativ, distributiv.

f*g=g*f

Vertauschen von Signal und Filter ist also absolut unproblematisch.
Die Länge des Ergebnisses der diskreten Faltung ist immer(!) gleich der Summe der Längen beider Signale zusammen -1. Das hat also nicht damit etwas zu tun ob man ein Filter mit 2 Impulsen hat sondern ist immer so.
Das man in einem solchen Fall ein Echo hat liegt daran, dass bei der Faltung von "etwas" mit einem Impuls das "etwas" an die Stelle des Impulses verschoben wird. Da wir im Zeitbereich Falten entspricht das einer zeitlichen Verzögerung, denn ein Impuls am Anfang lässt das Eingangssignal sofort und ohne Verzögerung durch, während der Impuls am Ende des Filters das Eingangssignal nochmals wiedergibt. Echos in einer Kirche kommen daher, da das wiedergegebene (Sprache, Musik) mit der Raumimpulsantwort, welche viele Nebenimpulse hat, im Zeitbereich gefaltet wird bevor es an unser Ohr kommt.

Zu dem Rest den du geschrieben hast: jein
Das Ergebnis hat immer die Länge beider Signale zusammen -1.
Wenn man 2 linearphasige Filter miteinander Faltet ist das Ergebnis auch stets linearphasig da der Impuls immer passend für die neue Gesamtlänge des Filters verschoben wird.

Bevor man eine FFT für solche Zwecke von Filter/Signal macht, zero padded man die Signale auf die Länge des zu erwartenden Ergebnis: L+M-1 da sonst Informationen verloren gehen würden.



Für mich ist die Diskussion zu hoch ;) , aber wenn ich mir vorstelle eine WAV-Datei zu offline zu falten, um sie z.B im Auto wiederzugeben, dann darf die Datei ja auch nicht länger werden als vorher; sie muss "nur" verändert werden.
Sie ist aber länger wenn eine ganz normale Faltungsoperation darauf angewendet wurde. Und das ist einzig und alleine davon abhängig wie Lange das Filter war. Das merkt man aber vielleicht garnicht, da z.B. ein 65k samples langes Filter bei einer Abtastrate von 44,1kHz für gerade mal etwas über 1s an Verlängerung verursacht.


Eine ergänzende Idee hätte ich allerdings noch. Ein Grund dass die Ausgabedatei nicht länger ist als die Eingangsdatei könnte sein, dass BruteFIR die zusätzlichen Koeffizienten zwar berechnet, aber noch nicht ausgibt, da es auf weitere Eingaben wartet.Ich glaube da könntest du Recht haben! Nachdem das erste Segment gefaltet wurde, werden die letzten M-1 samples abgeschnitten und abgespeichert. Das beschnittene Faltungsergebnis hat dann wieder die Länge der Buffer/des ursprünglichen Signals und wird nachdem es mit einem vorherig abgespeicherten Signalstücken (oder 0en falls es das erste ist) aufaddiert wird direkt ausgegeben. Das neuste abgespeicherte Signalstückchen wird dann auch wieder auf das nächste Faltungsergebnis am anfang aufaddiert um Ausschwingeffekte zu kompensieren.

Wie man Brutefir jetzt dazu bewegen könnte die letzten samples noch mit auszugeben ist jetzt fraglich. Theoretisch sollte es reichen die Filterlänge auf die nächste 2er Potenz einzustellen, da er eigentlich zero padden sollte - könnte man ja mal testen.

Wie man von minimum Delay auf linear Phase kommt weiß ich jetzt ehrlich gesagt nicht - nur umgekehrt. Normalerweise kommt man einfacher auf die linearphasigen Filter. Hier macht man am besten einfach die inverse Fouriertransformation vom Korrekturamplitudengang und hat direkt den linearphasigen Filterimpuls (evtl noch ein Fenster drüber).

Sleepwalker
22.03.2012, 20:39
Zu dem Rest den du geschrieben hast: jein
Das Ergebnis hat immer die Länge beider Signale zusammen -1.

Davon bin ich auch ausgegangen als ich "damals" die Frage nach so einem Tool gestellt habe. Elmars Versuch habe ich nachgestellt und er hat recht: Das Ergebnis ist (mit Brutefir) nicht länger.