Archiv verlassen und diese Seite im Standarddesign anzeigen : 8-fach Weiche mit BruteFIR
So, es geht los mit meiner 4-Wege-Weiche auf Basis von BruteFIR. Ich werde versuchen, einige Sachen hier für Nachbauer zu dokumentieren.
Fangen wir mal mit der Hardware an:
- Board+Prozessor: Intel D525MW
hier kann man praktisch jedes einigermassen moderne Motherboard einsetzen. Das Intel-Board hatte den Vorteil, keine kleinen fiesen Lüfter drauf zu haben und sehr preisgünstig zu sein. Darauf ist ein 2-Kern-Atom-Prozessor, der nicht gerade sonderlich leistungsfähig ist, aber für BruteFIR ausreichen sollte (hoffentlich ;-)
- RAM: 2GB Notebook-RAM
Die lagen von der letzten Notebook-Aufrüstung eh noch rum :-)
- Sounkarte: Asus Xonar D1
Scheinbar gibt es mit der sehr gute Erfahrungen und der Linux-Support scheint auch gut zu sein. Für den Anfang reicht die mal, später ist geplant, den Ton direkt per I2S abzugreifen und digital an die Endstufen weiterzuleiten.
- Eine Festplatte wird nicht gebraucht, ich starte mit einem 2GB USB-Stick (eigentlich 4GB, aber im Moment nur zur Hälfte genutzt). Davon kann das Intel-Board problemlos booten, auch wenn der Bootvorgang im Moment doch arg langsam ist. Da bleibt noch Platz für Tuning.
Einen Kurs für die Installation von Linux gebe ich hier nicht, daher halte ich mich hier kurz.
Ich starte mit Debian Linux, was sich einfach als Minimalsystem installieren lässt. Das reicht für den Start.
1. Debian-Minimalinstallation
dabei den SSH-Daemon mitinstallieren, dann braucht man jetzt keinen Monitor und keine Tastatur mehr sondern kann alles übers Netz erledigen.
2. Pakete nachinstallieren:
Die wichtigsten ALSA-Tools und BruteFIR sollten natürlich drauf, zusätzlich Octave. Das wird später für die Berechnung der Filter gebraucht. JackD ist scheinbar weit verbreitet bei der Nutzung von BruteFIR, also installieren wir den mal mit.
apt-get install alsa-base alsaplayer alsaplayer-text alsa-tools octave octave-signal brutefir jackd
Nach dieser Installation ist das System bei mir schon mehr als 1GB gross - also nicht mehr allzu schlank. Aber 4GB-USB-Sticks kosten ja auch nur nur sehr wenig.
Weiter gehts mit dem Sound-Basissetup
Zuerst mal schauen, ob die Soundkarte überhaupt erkannt wurde:
> aplay -l
**** Liste der Hardware-Geräte (PLAYBACK) ****
Karte 0: D1 [Xonar D1], Gerät 0: Multichannel [Multichannel]
Sub-Geräte: 1/1
Sub-Gerät #0: subdevice #0
Karte 0: D1 [Xonar D1], Gerät 1: Digital [Digital]
Sub-Geräte: 1/1
Sub-Gerät #0: subdevice #0
> aplay -L
null
Discard all samples (playback) or generate zero samples (capture)
default:CARD=D1
Xonar D1, Multichannel
Default Audio Device
front:CARD=D1,DEV=0
Xonar D1, Multichannel
Front speakers
surround40:CARD=D1,DEV=0
Xonar D1, Multichannel
4.0 Surround output to Front and Rear speakers
surround41:CARD=D1,DEV=0
Xonar D1, Multichannel
4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=D1,DEV=0
Xonar D1, Multichannel
5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=D1,DEV=0
Xonar D1, Multichannel
5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=D1,DEV=0
Xonar D1, Multichannel
7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=D1,DEV=0
Xonar D1, Multichannel
IEC958 (S/PDIF) Digital Audio Output
Das sieht schon mal gut aus :-)
Meist ist die Lautstärke allerdings auf 0, also erstmal die Lautstärke erhöhen:
> alsamixer
Und wenn jetzt alles richtig geklappt hat, sollte bei
> aplay /usr/share/sounds/alsa/Noise.wav
ein Rauschen aus den beiden vorderen Ausgängen kommen. Bei mir blieb erstmal alles still, nach einem Reboot war dann aber der Ton da :-)
Hi usul
Willst du brutefir von jackd aus füttern?
Ich hab letztens mit dem neuen loopback device von alsa rumgespielt. Das sieht viel versprechend aus.
Das modul aloop generiert 2 virtuelle Karte mit 8 Ein/Ausgängen.
Das Outputdevice von Karte-A übergibt den Stream an das Inputdevice von Karte-B.
Damit kann jedes Programm das für Alsa geschrieben wurde an Brutefir übergeben werden.
Habe aber noch keinen Dauertest gemacht.
Grüße
Sebastian
Das aloop-Module sieht spannend aus, werde mir das mal anschauen.
So weiter gehts mit dem "HowTo".
Als nächstes versuchen wir mal brutefir zum Laufen zu bekommen. Am einfachsten ist es, mal komplett auf Filter und sonstigen Kram zu verzichten und nur den Stereoeingang auf den Ausgang durchzureichen. Ein Kabel reicht dafür natürlich auch ;-)
Als erstes JackD starten (zum Loopback Device kommen wir später)
#jackd -P 9 -dalsa -r48000 -p1024 -n2 -D -Chw:0 -Phw:0
Jetzt braucht brutefir noch eine Konfiguration, die ich mal unter "2ch-plain.conf" speichere:
## DEFAULT GENERAL SETTINGS ##
float_bits: 64; # internal floating point precision
sampling_rate: 48000; # sampling rate in Hz of audio interfaces
filter_length: 1024,4; # length of filters: 4 (not used here ;-)
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
powersave: false; # pause filtering when input is zero
lock_memory: true; # try to lock memory if realtime prio is set
## LOGIC ##
logic: "cli" { port: 3000; };
## INPUT, OUTPUT ##
input "left", "right" {
device: "jack" { ports: "alsa_pcm:capture_1", "alsa_pcm:capture_2";};
sample: "AUTO";
channels: 2/0,1;
};
output "left", "right" {
device: "jack" { ports: "alsa_pcm:playback_1", "alsa_pcm:playback_2";
};
sample: "AUTO";
channels: 2/0,1;
delay: 0,0;
};
filter "main_left" {
inputs: "left";
to_outputs: "left";
coeff: -1;
};
filter "main_right" {
inputs: "right";
to_outputs: "right";
coeff: -1;
};
So, jetzt noch Brutefir starten und dann sollte auf den ersten beiden Ausgangskanälen genau das rauskommen, was zum Eingang der Soundkarte reinkommt (einfach einen MP3-Player oder ähnliches anschliessen).
#brutefir ./2ch-plain.conf
Ach ja, im Moment wird mal alles als "root" gemacht. Nicht die feine Art, um erstmal alles zum Laufen zu bekommen aber schneller, als immer an sudo zu denken ;-)
Im Moment macht das mal 4% CPU-Last auf dem Atom.
Ich habe mich Anfangs in die irre führen lassen mit den Ein/Ausgängen. Ich schreib mal hier aus was ich an Tips habe, auch für Google Piloten die hier landen ;)
Eine Kette könnte für brutfir so aussehen:
player -> Outputdevice Karte-A -> Inputdevice Karte-B -> brutfir alsa input plugin -> brutfir -> brutfir alsa output plugin -> output channels xonar
Die Installation ist bei jeder Distribution unterschiedlich deswegen kann ich das Ganze nur
in Stichpunkten zusammen fassen:
Das Modul "snd_aloop" muß beim booten geladen werden (manuell "modprobe snd-aloop")
Unterhalb vom Verzeichnis /etc sollte es eine Datei "alsa.conf" oder ähnliches geben.
Da muss folgendes ergänzt werden:
options snd cards_limit=2 #da wird die Anzahl der verbauten Karten angegeben,inkl aloop
alias snd-card-1 snd-aloop index=3
options snd-card-1 index=1 id="LOOP"
Die Kartennummern wird von Null an aufwärts gezählt.
Die Loopback Karte hat kein Mixerdevice. Es ist also kein Fehler wenn man keinen Lautstärkeregler findet.
Aber erstmal viel Spaß mit dem konventionelle Setup. Die Brutfir Config ist schön kryptisch :)
Na gut, dann hier mal schnell noch die Info, wie man das Sound-Loopback-Device zum Laufen bekommen (für Debian). Hab ich schon eingebunden und es ist mal geladen.
Sorry fürs Englisch, das meiste sind aber eh Befehle ;-)
apt-get install alsa-source
cd /usr/src
tar xvfj alsa-driver.tar.bz2
cd /usr/src/modules/alsa-driver
fakeroot debian/rules binary_modules KSRC=/usr/src/linux-headers-`uname -r` KVERS=`uname -r`
dpkg --install /usr/src/modules/alsa-modules-`uname -r`_1.0.23+dfsg-2*.deb
Edit the file /etc/rc.local and add a line
modprobe snd-aloop
Add the following line in /etc/modprobe.d/alsa-base.conf
options snd_aloop index=2
> reboot
> aplay -l
xxx@localhost:~$ aplay -l**** Liste der Hardware-Geräte (PLAYBACK) ****
Karte 0: D1 [Xonar D1], Gerät 0: Multichannel [Multichannel]
Sub-Geräte: 1/1
Sub-Gerät #0: subdevice #0
Karte 0: D1 [Xonar D1], Gerät 1: Digital [Digital]
Sub-Geräte: 1/1
Sub-Gerät #0: subdevice #0
Karte 2: Loopback [Loopback], Gerät 0: Loopback PCM [Loopback PCM]
Sub-Geräte: 8/8
Sub-Gerät #0: subdevice #0
Sub-Gerät #1: subdevice #1
Sub-Gerät #2: subdevice #2
Sub-Gerät #3: subdevice #3
Sub-Gerät #4: subdevice #4
Sub-Gerät #5: subdevice #5
Sub-Gerät #6: subdevice #6
Sub-Gerät #7: subdevice #7
Karte 2: Loopback [Loopback], Gerät 1: Loopback PCM [Loopback PCM]
Sub-Geräte: 8/8
Sub-Gerät #0: subdevice #0
Sub-Gerät #1: subdevice #1
Sub-Gerät #2: subdevice #2
Sub-Gerät #3: subdevice #3
Sub-Gerät #4: subdevice #4
Sub-Gerät #5: subdevice #5
Sub-Gerät #6: subdevice #6
Sub-Gerät #7: subdevice #7
Ich benutze das Ding im Moment noch nicht, weil ich dann erst ein Programm braucht, was mir den Eingang der Soundkarte zum Ausgang der Loopback-Soundkarte durchschleust. Und die Jack-Konfiguration funktioniert erstmal :-)
Ach ja: Ich würde der Loopback-Soundkarte die id 99 geben, dann hat ist egal, wie viele Soundkarten im System stecken ;-) Mal schauen, ob es irgendwelche Programme gibt, die mit "Lücken" in den IDs Probleme haben.
Ach ja: Ich würde der Loopback-Soundkarte die id 99 geben
Sehr gute Idee. :thumbup:
Weiter gehts. Da das schlimmste mal abgeschlossen ist (Software-Installation, Brutefir-Basiskonfiguration) geht es jetzt daran, die Filterkonfiguration zu erstellen.
Erstmal nur auf einem Kanal, das Duplizieren auf den zweiten ist später einfach:
## DEFAULT GENERAL SETTINGS ##
float_bits: 64; # internal floating point precision
sampling_rate: 48000; # sampling rate in Hz of audio interfaces
filter_length: 1024,32; # length of filters: 32768
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
powersave: false; # pause filtering when input is zero
lock_memory: true; # try to lock memory if realtime prio is set
## LOGIC ##
logic: "cli" { port: 3000; };
## INPUT, OUTPUT ##
input "left", "right" {
device: "jack" { ports: "alsa_pcm:capture_1", "alsa_pcm:capture_2";};
sample: "AUTO";
channels: 2/0,1;
};
output "llow", "lhigh" {
device: "jack" { ports: "alsa_pcm:playback_1", "alsa_pcm:playback_2";
};
sample: "AUTO";
channels: 2/0,1;
delay: 0,0;
};
coeff "lowleft" {
filename: "low.txt";
format: "text";
};
coeff "highleft" {
filename: "high.txt";
format: "text";
};
filter "ll" {
inputs: "left";
to_outputs: "llow";
coeff: "lowleft";
};
filter "lh" {
inputs: "left";
to_outputs: "lhigh";
coeff: "highleft";
};
Hier gibt es jetzt ein paar Dinge, die sich geändert haben.
1. Die Filterlänge ist jetzt auf 32k gewachsen, aber der Filter ist jetzt in 32 Partitionen aufgeteilt. Das ist eine Brutefir-Spezialität, die es erlaubt auch mit langen Filtern recht kurze Latenzen zu erreichen. Das belastet die CPU zwar, aber davon ist genug vorhanden.
2. Die "coeff"-Statements sind dazugekommen. Hierfür werden 2 Dateien "low.txt" und "high.txt" benötigt.
Woher kommen nun diese Dateien? Ganz einfach - die werden mit Octave erzeugt:
#!/usr/bin/octave
hh=fir1(32768,2500/24000);
hh=hh(1:32768);
hh=hh(:);
save -ascii low.txt hh
hh=fir1(32768, 2500/24000,'high');
hh=hh(1:32768);
hh=hh(:);
save -ascii high.txt hh
Auf die Details will ich nicht weiter eingehen, dazu nur soviel: Mit der fir() Funktion werden ja ein Hoch- und ein Tiefpass erzeugt, wobei die Samplerate 48kHz beträgt (24000=48k/2).
Dann kann man das ganze mal wieder starten und messen:
http://www.diy-hifi-forum.eu/forum/picture.php?albumid=367&pictureid=5402
Sieht gut aus :-) Mit normalen LC-Filtern wäre das wohl mehr Aufwand gewesen ;-)
Den Müll beim Hochtöner unterhalb der Trennfrequenz (immerhin noch etwa -30dB Pegel) kann ich noch nicht so recht identifizieren. Ich vermute, dass das am Filter liegt, bin aber nicht sicher, dass es nicht am Messaufbau liegt. Ist aber nicht so wichtig, denn bei den Filtern liegt eh noch Arbeit vor mir.
Die Filter haben eine extreme Flankensteilheit. Ist das gut? Ein Blick auf die Phasenlage zeigt etwas hässliches:
http://www.diy-hifi-forum.eu/forum/picture.php?albumid=367&pictureid=5403
Im Übergangsbereich bei 2.5kHz ist die Phase alles andere als linear :-( Dummerweise stellt ARTA die Diagramme immer mit logarithmischer Skale dar, wodurch man genau hinschauen muss, damit man es bemerkt. So einfach geht das mit den Filtern also auch nicht ;-)
Also geht es weiter mit dem Filterdesign.
Allerdings habe ich noch ein anderes Problem. Zum Messen benutze ich (noch) Arta, wofür ich immer Windows booten muss. Und da ich das nicht so sehr mag, suche ich eine Lösung für MacOS. Das Internet verrät: Octave ist auch dafür die perfekte Lösung und mindestens so leistungsfähig wie Arta, wenn man denn weiss, was man tun muss ;-) Fertige Skripte habe ich dazu leider nicht gefunden, also muss ich mich wohl mal in das Thema etwas tiefer einarbeiten. Ziel ist es, alles unter MacOS machen zu können. Das werde ich auch schaffen ;-)
Ach ja: Mit der aktuellen Filterkonfiguration verbraucht mein Dualcore Atom etwa 10-15% CPU, ohne Gehäuse klappt das auch noch problemlos ohne aktive Lüftung (CPU Temperatur 45 Grad, erlaubt sind 100). Mal schauen, wie sich das weiter entwickelt, denn im Moment sind ja auch nur 2 Kanäle zu berechnen. Im Endstadium sollen es 8 werden.
The Alchemist
15.09.2011, 22:10
http://s7.directupload.net/file/d/2648/oxdo5fxe_png.htm
Hab deine Filter mal schnell über virtuelles verdrahten gemessen.
Schaut eigentlich gut aus.
Zum Messen könntest Du falls es dir reicht den RoomEQWizard verwenden, der läuft auch auf MacOs.
Wie macht man denn einen Bandpass mit Octav, die Scripte, die ich bislang im Inet gefunden habe waren alle viel komplizierter, dien sieht sehr überschaubar aus!
(Selbst programmieren kann ich so etwas nicht....)
Gruß
Elmar
http://s7.directupload.net/file/d/2648/oxdo5fxe_png.htm
Hab deine Filter mal schnell über virtuelles verdrahten gemessen.
Schaut eigentlich gut aus.
Das Problem ist halt, dass die Amplitudenmessung (oder auch Simulation) alleine nichts über die Phasenlage aussagt. Und hier
scheint der Filter wohl ein Problem zu haben.
Zum Messen könntest Du falls es dir reicht den RoomEQWizard verwenden, der läuft auch auf MacOs.
Hatte den gestern mal laufen, aber der passt nicht so richtig. Messungen ohne Raumeinfluss habe ich nicht finden können. Oder hab ich die nicht gefunden?
Wie macht man denn einen Bandpass mit Octav, die Scripte, die ich bislang im Inet gefunden habe waren alle viel komplizierter, dien sieht sehr überschaubar aus!
Ganz einfach:
hh=fir1(4096,[500/24000 3000/24000]);
Ich glaube, das Problem der Filter liegt daran, dass Octave ein Filter mit unendlicher Steilheit annähert, was aber nicht gewünscht ist. Um die Steilheit festzulegen müsste man wohl die Funktion fir2() benutzen. Ich werde da mal weiterforschen.
Ansonsten gab es noch Hinweise MaXO zu benutzen. Diese Filtern scheinen wirklich sehr gut zu sein. Oder aber die EQ-Funktion von Brutefir. Beides habe ich noch nicht selbst probiert, dazu muss jetzt erstmal ein brauchbares Messsetup her.
The Alchemist
16.09.2011, 08:50
REW kann den Raumeinfluß nicht ausblenden und wird das wohl auch nie können (was der Name eigentlich schon impliziert :D)
Ich benutze den REW um die Impulse mit denen ich DRC füttere zu erhalten, da geht es dann vornehmlich um Raumeinflüsse....
REW ist für mich das einzige unter Linux laufende Messprogramm, ich komme mit einem Rechner zu Messen und Abspielen aus, also keine Kabelfrickelei.
(Lösungen mit Wine klammere ich mal aus und solche die selbst kompiliert werden müssen und ggf. tieferes Wissen über das Betriebssystem voraussetzen ebenfalls.)
MaXo hab ich Anfangs auch benutzt, die Latenzen und die Prozessorbelastung ist aber bei diesen Filtern sehr viel höher als bei denen mit Octav erzeugten.
Heir mal ein Script, bei dem wohl die Filtersteilheit beeinflußt werden kann,selbst hab ich das nicht ausprobiert. (den originalen Thread im diyAudio Forum find ich grad nicht):
n=15; # exponent for filter size (16->64k 15->32k ...)
fsubsonic=35; # sub-sonic cutoff frequency in Hz
fxo=1000; # main 2-way crossover frequency in Hz
wxo=10; # width of xo region in Hz
wsubsonic=35; # width of subsonic cutoff in Hz
fs=44100; # sample rate in Hz
k=2^n; # order of filter, # of coefficients in array
fn=fs/2; # Nyquist frequency
f = [fxo-(wxo/2), fxo+(wxo/2)];
m = [1, 0];
dev = [0.000005, 0.000005];
[n, w, beta, ftype] = kaiserord(f, m, dev, fn);
out = fir1(n,w,ftype,kaiser(n+1,beta),'scale');
l = length(out);
t = zeros(1,k);
if k < l
s = round((l - k) / 2);
e = l - s - 1;
for n = s:e
t(n-s+1) = out(n);
end
else
s = round((k - l) / 2);
for n = 1:l
t(n+s) = out(n);
end
end
tc=t(:);
save -ascii lopassraw.txt tc
freqz(t,1,[],fn)
f = [fxo-(wxo/2), fxo+(wxo/2)];
m = [0, 1];
dev = [0.000005, 0.000005];
[n, w, beta, ftype] = kaiserord(f, m, dev, fn);
out = fir1(n,w,ftype,kaiser(n+1,beta),'scale');
l = length(out);
t = zeros(1,k);
if k < l
s = round((l - k) / 2);
e = l - s - 1;
for n = s:e
t(n-s+1) = out(n);
end
else
s = round((k - l) / 2);
for n = 1:l
t(n+s) = out(n);
end
end
tc=t(:);
save -ascii hipassraw.txt tc
freqz(t,1,[],fn)
f = [fsubsonic-(wsubsonic/2), fsubsonic+(wsubsonic/2)];
m = [0, 1];
dev = [0.000005, 0.000005];
[n, w, beta, ftype] = kaiserord(f, m, dev, fn);
out = fir1(n,w,ftype,kaiser(n+1,beta),'scale');
l = length(out);
t = zeros(1,k);
if k < l
s = round((l - k) / 2);
e = l - s - 1;
for n = s:e
t(n-s+1) = out(n);
end
else
s = round((k - l) / 2);
for n = 1:l
t(n+s) = out(n);
end
end
tc=t(:);
save -ascii subsonicraw.txt tc
freqz(t,1,[],fn)
Da DRC auch die Phase korrigiert, ist mir die Phasenlage der Filter nicht so wichtig.
Wie möchtest Du denn später die Entzerrung der Chassis vornehmen?
Gruß
Elmar
The Alchemist
16.09.2011, 09:28
Nochmal Nachtrag, hier der Link zum diyAudio Forum:
http://www.diyaudio.com/forums/digital-source/32506-pc-music-players-31.html
Damit wir uns nicht missverstehen, ich habe deine Filter nicht simuliert, sondern in meine Brutefir eingesetzt und über virtuelle Verkabelung von REW und Jack "gemessen".
Die Arbeitsweise habe ich mir angewöhnt um materiellen Schaden zu vermeiden; macht man einen blöden Fehler in der .brutefir_config, kommt ganz schnell auch mal lautstarker Müll aus den Ausgängen der Soundkarte, so schnell kann man kaum reagieren und einen Hochtöner kanns dann auch mal Himmeln.
In diesem Zusammenhang würde ich auch empfehlen die Hochtöner möglichst nicht auf die ersten beiden Ausgänge der Soundkarte (die Hauptausgänge) zu legen. Startet Brutefir evtl. nicht so wie Du es dir vorgestellt hast, liegt hier evtl das Musikgesamtsignal an, was ebenfalls des Hochtöners Abschied bedeuten kann...
Gruß
Elmar
Die Idee mit dem HT ist gut. Zum Messen hab ich jetzt eine Octave-basierte Lösung gefunden:
http://sourceforge.net/projects/mataa/
Ist keine fertige Lösung, aber es ist ein schönes Beispielskript dabei, dass man gut anpassen und erweitern kann. Sieht auf den ersten Blick sehr nett aus.
The Alchemist
16.09.2011, 20:23
Nun von Octave versteh ich grad soviel, als das ich ein Script aufrufen kann :D.
Für mich bleibt der REW in Verbindung mit SOX (zum Umwandeln der Impulse von wav zu pcm) die erste Wahl.
Sehr grosses Interesse habe ich aber an deinen Scripten für die Filter :)
Gruß
Elmar
So, mit dem Messen komme ich noch nicht voran, da ich noch Probleme mit der externen Soundkarte unter MacOS habe. Also nochmal zurück zu ARTA.
Ich habe mal auf die Schnelle das Verhalten meines trivialen Octave-Filters mit einem von MaXO generierten verglichen (Maxo 10. Ordnung). Dabei fällt deutlich das Nachschwingen des Octave-Filters im Stopband auf - zu sehen an den kleinen Nachschwingern bei 4kHz. Im Hochton sehen die auch unterschiedlich aus, aber wenn ich mir gerade den Frequenzgang anschaue, habe ich scheinbar einen mit und einen ohne 2db-Reduktion im Hochton gemessen :( Also den Hochton hier erstmal ignorieren.
Ich werde auch nochmal schauen, wie das Verhalten der Brutefir-internen Filter aussieht.
Octave fir()
http://www.diy-hifi-forum.eu/forum/picture.php?albumid=367&pictureid=5476
MaXO
http://www.diy-hifi-forum.eu/forum/picture.php?albumid=367&pictureid=5477
ferryman
20.09.2011, 08:31
Hallo Daniel,
erstmal sollten die Wasserfälle pegeltechnisch vergleichbar sein. Sonst muss es da zu Fehlschlüssen kommen.
Viele Grüße
Julian
Was steht denn eigentlich genau in den 2 Dateien "low.txt" und "high.txt" drin? Einfach nur die Filterkoeffizienten?
Wer Matlab hat kann sich mal das fdatool anschauen:
http://hada.dyndns.org/fdatool.png
Was steht denn eigentlich genau in den 2 Dateien "low.txt" und "high.txt" drin? Einfach nur die Filterkoeffizienten?
Genau, halt einfach im Textformat.
Wer Matlab hat kann sich mal das fdatool anschauen
Leider ist das nur fürs Filterdesign eines Lautsprechers zu teuer, daher muss ich mit octave leben :-(
Ich habe aber vor, die fir-Sachen in octave mal genauer anzuschauen.
Hmm, jetzt fangen die Schwierigkeiten doch an. Ich habe das ganze auf 8 Kanäle erweitert.
## DEFAULT GENERAL SETTINGS ##
float_bits: 64; # internal floating point precision
sampling_rate: 48000; # sampling rate in Hz of audio interfaces
filter_length: 8192,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
powersave: false; # pause filtering when input is zero
lock_memory: true; # try to lock memory if realtime prio is set
## LOGIC ##
logic: "cli" { port: 3000; };
## INPUT, OUTPUT ##
input "left", "right" {
device: "jack" { ports: "alsa_pcm:capture_1", "alsa_pcm:capture_2";};
sample: "AUTO";
channels: 2/0,1;
};
output "lsub", "llow", "lmid", "lhigh", "rsub", "rlow", "rmid", "rhigh" {
device: "jack" { ports: "alsa_pcm:playback_1", "alsa_pcm:playback_2", "alsa_pcm:playback_7", "alsa_pcm:playback_8",
"alsa_pcm:playback_3", "alsa_pcm:playback_4", "alsa_pcm:playback_5", "alsa_pcm:playback_6";
};
sample: "AUTO";
channels: 8/0,1,2,3,4,5,6,7;
delay: 0,0,0,0,0,0,0,0;
};
coeff "subleft" {
filename: "XOSubL48.pcm";
format: "FLOAT_LE";
};
coeff "lowleft" {
filename: "XOLowL48.pcm";
format: "FLOAT_LE";
};
coeff "midleft" {
filename: "XOMidL48.pcm";
format: "FLOAT_LE";
};
coeff "highleft" {
filename: "XOHighL48.pcm";
format: "FLOAT_LE";
};
filter "ls" {
inputs: "left";
to_outputs: "lsub";
coeff: "subleft";
};
filter "ll" {
inputs: "left";
to_outputs: "llow";
coeff: "lowleft";
};
filter "lm" {
inputs: "left";
to_outputs: "lmid";
coeff: "midleft";
};
filter "lh" {
inputs: "left";
to_outputs: "lhigh"/1;
coeff: "highleft";
};
Und nun habe ich das seltsame Phänomen, dass der Mitteltöner dem Hochtöner hinterherläuft. Die Verzögerung ist gut hörbar und dürfte deutlich über 100ms betragen.
Dummerweise kann ich mir nicht erklären, woher die kommt. Ich hatte die 4-Wege-Filter in Verdacht, aber selbst wenn ich die bisherigen 2-Wege-Filter nehme, passiert das. An denen liegt es also nicht.
Irgendwelche Ideen?
Ich hatte bisher noch nichts mit BruteFIR zu tun aber vielleicht braucht er länger um tieferfrequente Sachen zu filtern.
Schonmal versucht mittels Messsystem den genauen Versatz festzustellen und mit einem delay zu korrigieren?
Die Filterlänge ist ja eigentlich 16*8192 für alle Filter.
Versuch doch mal Sub und MIDLOW jeweils auf rechts und links von dem selben Subdevice zu legen.
Vielleicht hinkt ja nur der DAC hinterher.
Ändert sich was wenn du das output plugin auf alsa umstellst?
The Alchemist
28.09.2011, 08:37
Hallo,
100 ms Nachhinken wäre schon der Hammer wenn es soviel wäre.
Eventuell handelt es sich aber um ein psychoakustisches Phänomen, da der Hochtöner und der MT nicht den richtigen Pegel haben; da hab ich mir grad mal auf der bpa Seite die Messung vom Coax angesehen.
Du senkst den Pegel des Hochtöners nur um 1 db ab, wenn ich das beim überfliegen richtig gesehen habe.
Um diesen Effekt aus zu schließen hilft nur Messen wie groß der Zeitversatz tatsächlich ist, das einer vorhanden ist, ist unstrittig.
Nach der Messung dann Pegel und Delay anpassen.
Wenn ich deine Konfiguration richtig im Kopf habe, möchtest Du eine Blackbox betreiben, das heißt Du gibst ein Signal von aussen in deinen Faltrechner.
In diesem Fall ist die Benutzung von Jack nicht notwendig, auch auf das Sound-Loopback-Device würd ich verzichten...
Gruß
Elmar
Versuch doch mal Sub und MIDLOW jeweils auf rechts und links von dem selben Subdevice zu legen.
Vielleicht hinkt ja nur der DAC hinterher.
Das Problem habe ich mit mid/high und die laufen auf dem gleichen DAC. Selbst wenn ich die auf die Kanäle 0/1 lege, habe ich das Problem. Es scheint aufzutreten, wenn ich die Konfiguration von 2 auf 8 Kanäle erweitere.
Ändert sich was wenn du das output plugin auf alsa umstellst?
Noch nicht probiert.
Um diesen Effekt aus zu schließen hilft nur Messen wie groß der Zeitversatz tatsächlich ist, das einer vorhanden ist, ist unstrittig.
Nach der Messung dann Pegel und Delay anpassen.
Das wäre die am wenigsten wünschenswerte Lösung. Ich vermute noch irgendwo ein Konfigurationsfehler (vielleicht nicht direkt bei BruteFIR, sondern bei der Systemkonfiguration oder bei JackD), der hierfür verantwortlich ist. Ich möchte erstmal versuchen, den zu finden.
The Alchemist
28.09.2011, 11:50
An dieser Stelle habe ich nun ein Verständnisproblem.
Der riesengroße Vorteil von Brutefir ist doch, dass man Laufzeitunterschiede , egal wodurch sie bedingt sind, einfach ausgleichen kann.
Auch der Pegelunterschied ist zwingend anzugleichen, sonst gibt es nie eine klingende Box.
Um das Messen kommst Du also auf keinen Fall drum herum.
Desweiteren würde ich linke und rechte Ausgänge immer auf einen Soundkartenausgang legen, also beide Subs auf 0/1 beide Lows auf 2/3 usw..
Die Konfig würde ich auch mal so umschreiben, dass auch alle 8 Ausgänge arbeiten müssen.
Gruß
Elmar
An dieser Stelle habe ich nun ein Verständnisproblem.
Der riesengroße Vorteil von Brutefir ist doch, dass man Laufzeitunterschiede , egal wodurch sie bedingt sind, einfach ausgleichen kann.
Nun, da haben wir wohl wirklich ein unterschiedliches Verständnis. Ich setzte Brutefir nicht ein, um Software- oder Konfigurationsfehler durch zusätzliche Delays zu umschiffen. Eine Signallaufzeit über 100ms ist für mich generell zu viel.
Dass gemessen und die Pegel angepasst werden müssen ist natürlich klar.
Die gleichen Kanäle auf den gleichen DAC zu legen, ist sicher sinnvoll, dafür brauche ich dann aber erst noch Adapterkabel. Aber das ist dann eh "Feintuning".
The Alchemist
28.09.2011, 13:33
Ich betreibe 6 Kanäle mit Brutefir und einer Asus D2, die Laufzeitunterschiede zwischen Ht und Tiefmitteltöner liegen im einstelligen Samplebereich (pro Kanal), mit gehörmäßigen Schätzungen im Millisekundenbereich tu ich mich immer etwas schwer :D.
Dennoch habe ich die Laufzeit aller 6 im Betrieb befindlichen Chassis angegelichen, wird auch in der Anleitung zu DRC empfohlen, was bei mir die Entzerrung übernimmt.
Im DIY Audio Forum hat sich aber schon einmal jemand über unverhältnismäßige große Unterschiede bei einer Asus Karte beklagt, von daher hilft nur messen. ;)
Gruß
Elmar
Die Filterlänge ist ja eigentlich 16*8192 für alle Filter.
Versuch doch mal Sub und MIDLOW jeweils auf rechts und links von dem selben Subdevice zu legen.
Vielleicht hinkt ja nur der DAC hinterher.
Ändert sich was wenn du das output plugin auf alsa umstellst?
So, heute komme ich mal wieder dazu, etwas zu testen. Die Umstellung als ALSA ändert nichts.
Ich habe mal versucht, den zeitlichen Versatz zu messen. Es sieht so aus, als sei der eine Filterlänge. Bei mir sind das im Moment 65536 Taps, also so 1,2 Sekunden bei 48kHz. Wenn ich die Samplerate auf 96kHz erhöhe, sinkt der Versatz auf die Hälfte.
Irgendwo ist da also noch ein Fehler bei Brutefir. Hat jemand sonst noch eine Idee?
:mad::mad::mad::mad::mad:
Wollte gerade mal Brutefir auf die neueste Version updaten - da ist das Filesystem voll. 2GB reichen wohl nicht aus :-( So richtig schlank sind aktuelle Linux-Systeme wohl doch nicht mehr. Also geht es jetzt an eine Neuinstallation auf einem grösseren USB-Stick...
The Alchemist
15.10.2011, 18:08
Über 2 GB ohne ein grafische Benutzer Oberfläche ist schon heftig.
Meine Version mit Ubuntu 10.04 und LXDE als Oberfläche hatte glaube ich installiert 1,5 GB verbraucht. (CD Iso war so knapp unter 400MB)
Kannst Du Brutefir in einer Konsole starten und die Meldungen posten?
Gruß
Elmar
Den Fehler bei Brutefir habe ich vermutlich gefunden. Ich habe da ein kleineres Durcheinander von minimal- und linearphasigen Filtern veranstaltet (sieht zumindest so aus).
Jetzt wird aber erstmal neu installiert.
Den Müll beim Hochtöner unterhalb der Trennfrequenz (immerhin noch etwa -30dB Pegel) kann ich noch nicht so recht identifizieren. Ich vermute, dass das am Filter liegt, bin aber nicht sicher, dass es nicht am Messaufbau liegt. Ist aber nicht so wichtig, denn bei den Filtern liegt eh noch Arbeit vor mir.Hast du hier schon etwas rausgefunden? Ich selbst habe auch ein wenig rumexperimentiert mit BruteFIR und bin auf Ähnliches gestoßen..
http://img828.imageshack.us/img828/5708/mit3.png
Das sind elektrische Frequenzgänge die schnell zusammengeschustert wurden. Wirklich zusammen passen die Flanken nicht, das ist mir klar. :rolleyes:
Der Bandpasseffekt an den Enden des Spektrums kommt von den beiden Soundkarten (im Moment will nur Analog Line IN funktionieren)
Bei mir läuft alles über ALSA und laut Matlab sollten meine Filter im "linken" Stopband bei -60dB sein (bei Tiefpässen klappt es wie man sieht )
http://img689.imageshack.us/img689/8440/fdaf.png
Uli.Brüggemann
18.10.2011, 08:51
Wenn, wie im Beispielbild gezeigt, das linearphasige Filter 871 taps hat, dann müssen für eine richtige Messauswertung mindestens 435 Samples links vom Pulspeak vorhanden sein. Vermutlich entstehen die -30 dB schlichtweg durch Abschneiden von Samples vor dem Puls.
Zumeist wird die Bedeutung von Samples mit kleiner Amplitude eben wegen der geringen Amplitude gewaltig unterschätzt.
Vielen Dank! Da ich mit Arta nur 300 samples Vorlauf bekomme werde ich mal einen Test mit 600 Taps veranstalten um dem Phänomen nach zu gehen.
EDIT:
@Uli: Ein schneller Test bestätigt deine Vermutung! Erschwerend kam allerdings hinzu, dass ich wie gewohnt den Cursor sogar noch bei sample 300 als Startwert stehen hatte. Sonst schafft es die Hochpassflanke bei gleichem Filter auch fast ganz runter. Die Phase wird nun auch "richtiger" dargestellt. Das hatte vorher übergaupt nicht gestimmt wie ich jetzt im Vergleich feststellen musste
Slacky was für Filter Design Programm hast du da?
Das Toolbar sieht schwer nach Wine aus.
Grüße
Sebastian
Slacky was für Filter Design Programm hast du da?
Siehe Post #19 (http://www.diy-hifi-forum.eu/forum/showpost.php?p=46951&postcount=19). Das ist das Filter Design and Analysis Tool (http://www.mathworks.de/products/signal/demos.html?file=/products/demos/shipping/signal/introfdatooldemo.html) aus der Signal Processing Toolbox für Matlab
Danke :)
Ich werde mit die Demo mal bei Zeiten zu Gemüt führen.
So, mein Brutefir setup läuft mal. Auf dem neuen Memorystick ist auch noch genügend Platz :-)
Jetzt habe ich aber wieder ein Problemchen mit dem Timing. Die beiden Bandpässe in meinem 4-Wege-Setup haben jetzt wieder einen (kleineren) zeitlichen Versatz zum Hoch- und Tiefpass.
Die Filter sind mit Maxo generiert (8. Ordnung) und sind linearphasig. Ich hab es auch nochmal angeschaut und es sind auch wirklich linearphasige Filter, der Impuls sitzt bei allen Filtern genau in der Mitte.
Ich habe den Eindruck, dass das irgendwie mit dem Bandpass zu tun hat, im Moment weiss ich aber noch nicht, wo mein Denkfehler ist.
ferryman
18.10.2011, 21:36
Hallo Daniel,
wie schaut die Sprungantwort aus?
Gruß
Julian
Die Sprungantwort sieht halt auch ziemlich übel aus, da ARTA die Mitten rausnimmt, da die ja verzögert kommen. Daher sieht man in der Sprungantwort nur die sehr tiefen und die sehr hohen Töne.
Jetzt habe ich das ganze nochmal schnell mit Octave-Filtern ausprobiert (die vermutlich minimalphasig sind, habe das nicht überprüft) und habe das gleiche Problem wieder.
Ich dachte, dass ich Brutefir schnell in den Griff bekomme, aber scheinbar kann man extrem viel falsch machen ;-)
ferryman
19.10.2011, 19:56
Wird das nicht schlicht daran liegen, dass der Mitteltöner Hoch- und Tiefpass bekommt, Hoch- und Tieftöner jeweils nur Hoch- oder Tiefpass?
Viele Grüße
Julian
Die Bandpassfilter sind ja in einen Impuls zusammengerechnet und werden nicht nacheinander errechnet.
Irgendwo vermute ich noch einen Bug in meiner Brutefir Konfiguration, daher hier mal die gesamte Config. Vielleicht sieht ja jemand etwas, was ich übersehen habe.
float_bits: 32; # internal floating point precision
sampling_rate: 48000; # sampling rate in Hz of audio interfaces
filter_length: 8192,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: true; # allow use of input poll mode
modules_path: "."; # extra path where to find BruteFIR modules
monitor_rate: false; # monitor sample rate
powersave: false; # pause filtering when input is zero
lock_memory: true; # try to lock memory if realtime prio is set
## LOGIC ##
logic: "cli" { port: 3000; };
## INPUT, OUTPUT ##
input "left" {
device: "alsa" { device: "hw:0"; ignore_xrun: true; };
sample: "S24_4LE";
channels: 2/0;
};
output "lsub", "llow", "lmid", "lhigh" {
device: "alsa" { device: "hw:0"; ignore_xrun: true; };
sample: "S24_4LE";
channels: 8/1,0,7,6;
};
coeff "subleft" {
filename: "XOSubL48.pcm";
format: "FLOAT_LE";
};
coeff "lowleft" {
filename: "XOLowL48.pcm";
format: "FLOAT_LE";
};
coeff "highleft" {
filename: "XOHighL48.pcm";
format: "FLOAT_LE";
};
coeff "midleft" {
filename: "XOMidL48.pcm";
format: "FLOAT_LE";
};
filter "ls" {
inputs: "left";
to_outputs: "lsub";
coeff: "subleft";
};
filter "ll" {
inputs: "left";
to_outputs: "llow";
coeff: "lowleft";
};
filter "lm" {
inputs: "left";
to_outputs: "lmid";
coeff: "midleft";
};
filter "lh" {
inputs: "left";
to_outputs: "lhigh";
coeff: "highleft";
};
The Alchemist
19.10.2011, 22:29
Was sind denn die Meldungen , die Brutefir beim Start auswirft?
Hier mal noch schnell der Output:
BruteFIR v1.0k (March 2009) (c) Anders Torger
Internal resolution is 32 bit floating point.
Creating 4 FFTW plans of size 16384...finished.
Loading 4 coefficient sets...finished.
Realtime priorities are min = 2, usermax = 1, mid = 3 and max = 4.
Warning: no support for clock cycle counter on this platform.
Timers for benchmarking may be unreliable.
Filters in process 0: 0
Filters in process 1: 1
Filters in process 2: 2
Filters in process 3: 3
Realtime priority 1 set for cli process (pid 1052)
Realtime priority 3 set for input process (pid 1047)
Realtime priority 4 set for filter process (pid 1049)
Realtime priority 4 set for filter process (pid 1051)
Realtime priority 4 set for filter process (pid 1048)
Realtime priority 4 set for filter process (pid 1050)
Realtime priority 3 set for output process (pid 1053)
Fixed I/O-delay is 16384 samples
Audio processing starts now
peak: 0/0/-105.60 1/0/-118.47 2/0/-111.24 3/0/-100.86
peak: 0/0/-105.60 1/0/-117.65 2/0/-110.51 3/0/-100.86
The Alchemist
20.10.2011, 22:53
Ich hatte jetzt eigentlich mit mehr Fehlern gerechnet, z.B. von ungenutzten Kanälen...
Die Meldung :
Warning: no support for clock cycle counter on this platform. Ist ein wenig merkwürdig hast Du irgendwelche Dämonen die dir den Prozessor takten?
Seis drum ich kann grad nicht testen und hab mal ein paar Dinge in deiner "Präambel" näher an die Standardversion zurückportiert.
Außerdem habe ich deine Ein und Ausgänge auf "Auto" gesetzt und nicht benutzte Kanäle gestrichen.
Mein Hauptverdächtiger ist der poll-mode...
Achtung! Eventuell habe ich deine Ausgänge durcheinander gewürfelt unbedingt testen wegen der Hochtöner!
float_bits: 32; # internal floating point precision
sampling_rate: 48000; # sampling rate in Hz of audio interfaces
filter_length: 8192,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 ##
logic: "cli" { port: 3000; };
## INPUT, OUTPUT ##
input "left" {
device: "alsa" { device: "hw:0"; ignore_xrun: true; };
sample: "AUTO";
channels:1/0;
};
output "lsub", "llow", "lmid", "lhigh" {
device: "alsa" { device: "hw:0"; ignore_xrun: true; };
sample: "AUTO";
channels: 4;
};
coeff "subleft" {
filename: "XOSubL48.pcm";
format: "FLOAT_LE";
};
coeff "lowleft" {
filename: "XOLowL48.pcm";
format: "FLOAT_LE";
};
coeff "highleft" {
filename: "XOHighL48.pcm";
format: "FLOAT_LE";
};
coeff "midleft" {
filename: "XOMidL48.pcm";
format: "FLOAT_LE";
};
filter "ls" {
inputs: "left";
to_outputs: "lsub";
coeff: "subleft";
};
filter "ll" {
inputs: "left";
to_outputs: "llow";
coeff: "lowleft";
};
filter "lm" {
inputs: "left";
to_outputs: "lmid";
coeff: "midleft";
};
filter "lh" {
inputs: "left";
to_outputs: "lhigh";
coeff: "highleft";
};
Gruß
Elmar
Mit ALSA geht wohl "AUTO" beim Sample-Format nicht.
Auch ein Mono-Eingang geht nicht, da muss ich "2/0" nehmen.
Den Rest habe ich mal so gelassen, hat aber nichts geändert.
Habe gerade mal mit Audacity versucht, die Verzögerung zu messen - das sind etwa 150ms.
Diese Verzögerung tritt sogar auf, wenn ich die Filter komplett rausnehme und durch "coeff: 0" ersetze.
Der Poll-Mode ist es auch nicht, den hatte ich erst aktiviert, als mir nicht anderes mehr einfiel.
Da das delay auf dem gleichen DAC auftritt, kann ich den als Fehlerquelle auch ausschliessen.
Lediglich die "no support for clock cycle counter" Warnung hat mich auch stutzig gemacht, aber mehr Infos dazu habe ich bisher nicht gefunden. Das Ding ist ein normaler Atom D625 mit Debian.
The Alchemist
21.10.2011, 18:55
Ich kann nach meinem Urlaub deine Filter mal testen. Sind die alle gleich lang?
Mir fällt leider sonst nichts ein.
Gruß
Elmar
Ja, die FIlter sind alle gleich lang. Du kannst die gerne auch testen, ich glaube aber nicht, dass es an denen liegt, denn selbst wenn ich die komplett abschalte habe ich ja dieses Problem. Ich probiere vielleicht mal den "brutefir on USB stick", vielleicht passt ja irgendwas mit meinem Linux-Setup nicht.
Ich habe auch noch Hyperthreading in Verdacht, Brutefir durcheinander zu bringen.
The Alchemist
21.10.2011, 19:12
Eventuell kann ferryman (Julian) dir die Live CD zukommen lassen.
Dann kannst Du es mit Jack noch einmal testen.
Zumindest bei mir und bei Ihm hat es ohne Verzögerungen geklappt.
Vielleicht ist es irgendein Linux Konfigurationsproblem .
ferryman
21.10.2011, 19:17
Nicht nur eventuell, sehr gerne. Skype ferryman911 :bye:
Bin heute Abend aber nicht da.
Viele Grüße
Julian
Sleepwalker
21.10.2011, 19:56
Brutefir hat 2 config Dateien. Die andere ist die config.deault. Die wird als erstes eingelesen und wenn in der brutefir.config was anderes drin steht, wird das dann überschrieben.
Steht also in der default-config z.B.
allow_poll_mode: false;
und in der brutefir.config lässt du das weg, d.h. überschreibst es nicht mehr, bleibt das gültig.
Ich könnte mir also vorstellen, dass du in der default-Datei Einstellungen wie z.B. Delay drin hast, die dann wirksam werden und bleiben.
In meiner brutefir.config setze ich alle Parameter (also z.B. die Delays für Ausgänge usw.), wärend du da nur das nötigste drin stehen hast.
Würde mich nicht wundern wenn du aus versehen mal beim rumspielen da was geändert hast.
Dann solltest du noch darauf achten wie du die Filter auf die Prozessoren verteilst, wenn du mehrere hast, und wie die getaktet werden. Eigentlich sollte das keinen Einfluss haben, aber so einen Fehler wie bei dir kenn ich auch sonst nicht.
vBulletin® v4.2.5, Copyright ©2000-2024, Jelsoft Enterprises Ltd.