MindMap - 8Ch AdLib. Audio DSP.

Status
Für weitere Antworten geschlossen.
Es lässt sich ja leicht ausrechnen wie steil die Filterflanken der Frequenzweiche sein müssen um die Teilsignale ab den Punkten xx und yy Hz bis unter die Rauschschwelle zu drücken. Das kannst du von deiner (definierten) Lücke aus rückwärts rausrechnen.

Kenne jetzt zwar die Formeln nicht und hab meine Bücher vom Studium nicht mehr da, aber das lässt sich bestimmt irgendwo im Netz finden.

Im Zweifelsfall und bei -12-dB-Filtern würde ich auch sicherheitshalber auf Sub und HT setzen - es muss wirklich genug Platz sein, denn wenn dir da auch nur mit 1 dB das andere Signal reinsaut, hast du Matsch. :ugly:
 
Sagen wir Du nimmst nen 24db/okt Filter

Der erste Bereich geht bis 300Hz (TMT) der HT fängt bei 5kHz an.

Abhörlautstärke 120db

300Hz -> 120db
600Hz -> 96db
1200Hz -> 72db
2400Hz -> 48db
4800Hz -> 24db
9600Hz -> 0db

5000Hz -> 120db
2500Hz -> 96db
1250Hz -> 72db

Sprich bei 1,2kHz addieren sich die beiden Signale mit 72db ;)
 
Jop, ist echt grenzwertig... wie schaut nochmal eine 48-dB-Passivweiche aus? :D Vor allem kommen wir dann mit ordentlichen Bauteilen so langsam in die Preisregion einer zusätzlichen DAC-Einheit...
 
Dann baust dir halt nen FIR Filter mit 100db/Oct :ugly:

Ich revidiere übrigens eine Aussage aus meiner Erklärung zu FIR Filtern, man kann FIR Filter auch dann Lautzeitkonstant verwirklichen, wenn man eine gerade Anzahl von Koeffizenten nimmt. Dann gibt es in der Mitte halt zwei identische Werte. Ich benutze halt aus gewohnheit immer ungrade Zahlen für die Taps, von daher hat sich das bei mir wohl so eingeschlichen. Das Parks McClellan Verfahren liefert jedenfalls immer passende Koeffizenten zurück. Also ist das Problem schonmal :done:
 
So,

dann machen wir uns mal daran wie man mit Matlab FIR Filterkoeffizenten bestimmt. Zuerst müsst ihr verstehen, dass man bei einem FIR Filter nicht genau definieren kann, was man gerne hätte. Man muss solangen an den Parametern drehen, bis man dort ist, wo man hin will. Das ist ansich die hohe Kunst beim Design von FIR Filtern. IIR Filter, wie zum Beispiel das darauf basierende Biquad-Filter sind da anders, mann sucht sich aus was man will und fertig.

Genug geredet, los geht es. Zunächst öffnet man Matlab, hier sieht man eine Übersicht mit dem Command Window in der Mitte. Hier könnte man ansich alle Befehle eintippen, aber das wird irgendwann sehr übersichtlich. Daher legen wir uns mit Strg+n ein Script an. Hier geben wir nun unsere Befehle ein. Mit einem Druck auf F5 können wir das Script ausführen. Matlab wird beim erstenmal fordern, dass wir das Script speichern. Eventuell taucht danach noch eine Meldung auf, dass die Pfade nicht korrekt sind, also sagen wir Matlab, dass es dies für uns hinzufügen soll. Alles weitere müssen wir dann den Script Ausgaben entnehmen.

Für das erste Script greifen wir auf die Fir1 Methode zurück, um die Filterkoeffizenten zu bestimmen. Diese führt schnell zu ersten Ergebnissen und benötigt nur wenige Parameter an denen man drehen kann. Das macht es für den Anfang leichter. Für uns sind interessant Zeile 7, wo wir die Grenzfrequenz des Filters in kHz angeben können (Achtung Matlab rechnet mit . nicht mit , in Zahlen) und Zeile 15, wo wir Entscheiden können, ob wir einen Hoch- oder Tiefpass berechnen wollen. Dann ist Zeile 5 noch wichtig. Diese bestimmt die Anzahl der verwendeten Taps und damit aufgrund der Fir1 Methode indirekt auch die Flankensteilheit des Filters. Da der DSP nur vielzahlige von 16 als Taps anzahl zulässt, die Fir1 Methode aber mit n+1 rechnet, nehmen wir hier eine Zahl entsprechend (n*16)-1

Mit F5 erzeugt das Script dann einige Fenster, in den wir uns das Filter angucken können. Zunächst währe da der wohl wichtige Amplitundengang. Um den -3dB Punkt besser finden zu können, kann man sich unter Tools einen Datacursor einblenden lassen. Der Frequenzgang ist nur so zur Info da, spannend ist noch die Gruppenlaufzeit, diese sollte bis zur Grenzfrequenz immer konstant sein, was das Filter danach macht, ist eigentlich egal. Zu guter letzt, kann man noch ins Command Window schauen, dort werden die Filterkoeffizenten angezeigt, die man in den DSP 1 zu 1 übertragen muss. Wie man sieht, spiegeln sich die Werte aber der Mitte.

Und nun zum Script

clear; %Alte Speicherückstände löschen


%Filterspezifikation
n = 15; %Anzahl Taps entspricht ungefähr der Filterordnung
ftast = 48; %Arbeitsfrequenz des DSP in kHz
fd = 5; %Ungefähre Grenzfrequenz des Filters in kHz



%FIR Filter mit Hanning-Fenster berechnen
fsh=ftast/2; %Shannon-Frequenz bestimmen
%Hier high oder low eintragen für Art des Filters
b = fir1(n,fd/fsh,'low',Hanning(n+1)); %Koeffizenten b0...bn bestimmen;
a = 1; %Amplitundengang für DC-Fall korregieren


%Berechnung Amplitundengang
w = 0:0.001:pi; %Schrittweite 0 bis fmax
h = freqz(b,a,w);
graph=20*log10(abs(h)); %Amplitudengang in dB umrechnen


%Berechnung Phasengang
phi = unwrap(angle(h));


%Berechnung Gruppenlaufzeit
tgr = -diff(phi)./diff(w)*(1/(2*fsh));


%Amplitudengang zeichnen
figure(1);
plot(w*fsh/pi,graph);
grid;

title(['Amplitudengang FIR-Filter mit ', num2str(n+1),' Taps']);
xlabel('Frequenz [kHz]');
ylabel('Amplitudengang [dB]');


%Gruppenlaufzeit zeichnen
figure(2);
plot(w(1:length(w)-1)*(fsh/pi),abs(tgr));
axis([0 fsh 0 5]);
grid;

title(['Gruppenlaufzeit FIR-Filter mit ',num2str(n+1),' Taps']);
xlabel('Frequenz [kHz]');
ylabel('Gruppenlaufzeit [ms]');


%Phasengang zeichnen
figure(3);
plot(w*fsh/pi,phi);
grid;

title(['Phasengang FIR-Filter mit ', num2str(n+1), ' Taps']);
xlabel('Frequenz [kHz]');
ylabel('Phasengang [Grad]');


%Filterkoeffizenten in Command Window ausgeben
clc; %Command Window leeren
fprintf('%f\n',b); %Koeffizenten für FIR Filter aus Vektor b ausgeben



So, damit könnt ihr jetzt erstmal spielen. Morgen gibt es dann mehr und MillenChi sorg doch bitte mal dafür, dass man in das Antwortfenster auch lange texte eingeben kann, ohne das ab einer bestimmten Länge der Cursor immer nach oben springt, ist ja mega nervig.
 
Vielen Dank erstmal.
Klingt interessant...
Werd ich die Tage mal testen.

PS:
Um die Antwort Box müssen wir uns noch kümmern...
 
Na dann,

weiter geht es mit dem FIR Tutorial für Matlab. Nachdem wir jetzt ein bisschen mit High- und Lowpass spielen konnte, kümmern wir uns jetzt um den Bandpass mittels Fir1 Methode. Dazu ändern wir das vorhandene Script ein wenig ab und speichern es unter anderem Namen. Für den Bandpass geben wir nun die Frequenzen an, die wir am Anfang und Ende nutzen wollen, um zu filtern. Das war auch schon alles, der rest des Scriptes bleibt unverändert.

clear; %Alte Speicherückstände löschen


%Filterspezifikation
n = 15; %Anzahl Taps entspricht ungefähr der Filterordnung
ftast = 48; %Arbeitsfrequenz des DSP in kHz
fdb = 10; %Beginn Durchlassbereich in kHz
fde = 15; %Ende Durchlassbereich in kHz


%FIR Filter mit Hanning-Fenster berechnen
fsh=ftast/2; %Shannon-Frequenz bestimmen
%Hier high oder low eintragen für Art des Filters
b = fir1(n,[fdb/fsh,fde/fsh],Hanning(n+1)); %Koeffizenten b0...bn bestimmen;
a = 1; %Amplitundengang für DC-Fall korregieren


%Berechnung Amplitundengang
w = 0:0.001:pi; %Schrittweite 0 bis fmax
h = freqz(b,a,w);
graph=20*log10(abs(h)); %Amplitudengang in dB umrechnen


%Berechnung Phasengang
phi = unwrap(angle(h));


%Berechnung Gruppenlaufzeit
tgr = -diff(phi)./diff(w)*(1/(2*fsh));


%Amplitudengang zeichnen
figure(1);
plot(w*fsh/pi,graph);
grid;

title(['Amplitudengang FIR-Filter mit ', num2str(n+1),' Taps']);
xlabel('Frequenz [kHz]');
ylabel('Amplitudengang [dB]');


%Gruppenlaufzeit zeichnen
figure(2);
plot(w(1:length(w)-1)*(fsh/pi),abs(tgr));
axis([0 fsh 0 5]);
grid;

title(['Gruppenlaufzeit FIR-Filter mit ',num2str(n+1),' Taps']);
xlabel('Frequenz [kHz]');
ylabel('Gruppenlaufzeit [ms]');


%Phasengang zeichnen
figure(3);
plot(w*fsh/pi,phi);
grid;

title(['Phasengang FIR-Filter mit ', num2str(n+1), ' Taps']);
xlabel('Frequenz [kHz]');
ylabel('Phasengang [Grad]');


%Filterkoeffizenten in Command Window ausgeben
clc; %Command Window leeren
fprintf('%f\n',b); %Koeffizenten für FIR Filter aus Vektor b ausgeben
 
darf ich die Beiträge mit ins "How To" übernehmen?
 
Und heiter geht es weiter,

nachdem wir jetzt die 3 wichtigsten Filtertypen mittels der Fir1 Methode berechnet haben, wechseln wir nun zur FIR Berechnung mittels Parks McClellan. Ich würde diese Methode bevorzugen. Sie liefert meiner Meinung nach die besseren Ergebnisse. Ist jedoch etwas komplizierter in der Anwendung, da es hier mehr Parameter gibt, an denen man drehen kann. Bei PMC Verfahren gibt man Bereiche an in denen man sich ansich ideale Frequenzgänge wünscht. Man definiert für das Filter einen Durchlassbereich und einen Sperrbereich. Gibt an, welche Sperrdämpfung der Sperrbereich mindestens haben soll und definiert welche Restwelligkeit man im Durchlassbereich erlauben will. Daraus ergibt sich dann in Verbindung mit den Taps die Flankensteilheit im Übergangsbereich zwischen Sperr- und Durchlassbereich. Dabei beeinflussen sich die Parameter gegenseitig. Je Steiler man trennt, desto höher wird die Welligkeit im Durchlassbereich. Lässt man also eine größere Restwelligkeit zu, kann man steiler trennen. Auch hier ist also viel probieren angesagt. Ich habe die Scripte jetzt etwas vereinfacht und gebe nur noch den Amplitudengang aus. Phasengang und Gruppenlaufzeit sind ansich uninteressant. Dafür habe ich die Grenzen der Filterspezifikation in die Graphik eingefügt. So könnt ihr schnell sehen, ob die Anzahl der Taps ausreichend ist, um den gewünschten Frequenzgang zu erreichen.

Script Low-Pass

clear; %Alte Werte aus Zwischenspeicher löschen

%Vorgaben für Filter
ftast = 48; %Abtastrate von DSP in kHz
fsh = ftast/2; %Shanonfrequenz berechnen
n = 31; %Anzahl Taps
fd = 4.5; %Frequenz Ende Druchlassbereich in kHz
fs = 8.5; %Frequenz Beginn Sperrbereich in kHz
dwell = 0.2; %Restwelligkeit in dB
smin = 40; %minimale Sperrdämpfung in dB


%Filterberechnung
dsperr = 10^(smin/20);
w = [dsperr 1/dwell];

omegad = fd/fsh;
omegas = fs/fsh;

f = [0 omegad omegas 1];
as = [1 1 0 0]; %Vorgabe für idealen Frequenzgang

b = remez(n,f,as,w); %Filterkoeffizenten berechnen
a = 1; %DC Korrektur

omega = linspace(0,fsh,2001);
amp = freqz(b,a,omega); %Amplitudengang berechnen
damp = 20*log10(abs(amp)); %Amplitudengang in dB umrechnen


%Amplitudengang zeichnen
figure(1);
plot(omega*fsh/pi,damp,[0 fd],[-20.*log(1/(1-dwell)) -20.*log(1/(1-dwell))],'r',[fd fd],[-20.*log(1/(1-dwell)) -100],'r',[0 fs],[-20.*log(1/(1+dwell)) -20.*log(1/(1+dwell))],'r',[fs fs],[-20.*log(1/(1+dwell)) -smin],'r',[fs fsh],[-smin -smin],'r');
axis([0 fsh -100 30]);

title(['Amplitudengang FIR-Filter mit ',num2str(n+1),' Taps']);
xlabel('Frequenz [kHz]');
ylabel('Amplitude [dB]');

%Ausgabe Filterkoeffizenten
clc;
fprintf('%f\n',b);


Script High-Pass

clear; %Alte Werte aus Zwischenspeicher löschen

%Vorgaben für Filter
ftast = 48; %Abtastrate von DSP in kHz
fsh = ftast/2; %Shanonfrequenz berechnen
n = 31; %Anzahl Taps
fs = 4.5; %Frequenz Ende Sperrbereich in kHz
fd = 8.5; %Frequenz Beginn Durchlassbereich in kHz
dwell = 0.2; %Restwelligkeit Durchlassbereich in dB
smin = 40; %minimale Sperrdämpfung in dB


%Filterberechnung
dsperr = 10^(smin/20);
w = [dsperr 1/dwell];

omegad = fd/fsh;
omegas = fs/fsh;

f = [0 omegas omegad 1];
as = [0 0 1 1]; %Vorgabe für idealen Frequenzgang

b = remez(n,f,as,w); %Filterkoeffizenten berechnen
a = 1; %DC Korrektur

omega = linspace(0,fsh,2001);
amp = freqz(b,a,omega); %Amplitudengang berechnen
damp = 20*log10(abs(amp)); %Amplitudengang in dB umrechnen


%Amplitudengang zeichnen
figure(1);
plot(omega*fsh/pi,damp,[0 fs],[-smin -smin],'r',[fs fs],[-20.*log(1/(1+dwell)) -smin],'r',[fd fd],[-20.*log(1/(1-dwell)) -100],'r',[fs fsh],[-20.*log(1/(1+dwell)) -20.*log(1/(1+dwell))],'r',[fd fsh],[-20.*log(1/(1-dwell)) -20.*log(1/(1-dwell))],'r');
axis([0 fsh -100 30]);

title(['Amplitudengang FIR-Filter mit ',num2str(n+1),' Taps']);
xlabel('Frequenz [kHz]');
ylabel('Amplitude [dB]');

%Ausgabe Filterkoeffizenten
clc;
fprintf('%f\n',b);


Script Band-Pass

clear; %Alte Werte aus Zwischenspeicher löschen

%Vorgaben für Filter
ftast = 48; %Abtastrate von DSP in kHz
fsh = ftast/2; %Shanonfrequenz berechnen
n = 31; %Anzahl Taps
fs1 = 4.5; %Frequenz Ende Sperrbereich1 in kHz
fd1 = 8.5; %Frequenz Beginn Durchlassbereich1 in kHz
fd2 = 14.5; %Frequenz Ende Durchlassbereich2 in kHz
fs2 = 18.5; %Frequenz Beginn Sperrbereich2 in kHz
dwell = 0.2; %Restwelligkeit Durchlassbereich in dB
smin = 70; %minimale Sperrdämpfung in dB


%Filterberechnung
dsperr = 10^(smin/20);
w = [dsperr 1/dwell dsperr];

omegad1 = fd1/fsh;
omegas1 = fs1/fsh;
omegad2 = fd2/fsh;
omegas2 = fs2/fsh;

fs = [0 omegas1 omegad1 omegad2 omegas2 1];
as = [0 0 1 1 0 0]; %Vorgabe für idealen Frequenzgang

b = remez(n,fs,as,w); %Filterkoeffizenten berechnen
a = 1; %DC Korrektur

omega = linspace(0,fsh,2001);
amp = freqz(b,a,omega); %Amplitudengang berechnen
damp = 20*log10(abs(amp)); %Amplitudengang in dB umrechnen


%Amplitudengang zeichnen
figure(1);
plot(omega*fsh/pi,damp,[0 fs1],[-smin -smin],'r',[fs1 fs1],[3 -smin],'r',[fd1 fd1],[-3 -100],'r',[fd1 fd2],[-20.*log10(1/(1-dwell)) -20.*log10(1/(1-dwell))],'r',[fs1 fs2],[3 3],'r',[fs2 fs2],[3 -smin],'r',[fd2 fd2],[-3 -100],'r',[fs2 fsh],[-smin -smin],'r');
axis([0 fsh -100 30]);

title(['Amplitudengang FIR-Filter mit ',num2str(n+1),' Taps']);
xlabel('Frequenz [kHz]');
ylabel('Amplitude [dB]');

%Ausgabe Filterkoeffizenten
clc;
fprintf('%f\n',b);

So und nun überlasse ich euch wieder eurem Schicksal, viel Spaß beim rumprobieren.
 
Nun FIR Filter sind ja durchaus ne interessante Option auch wenn ich vermutlich eher auf "konventionelles" Phase Alignment gehen werde (hab das Glück ne Meyer Sound SIM 3 zur Verfügung zu haben). Aber immer gut zu wissen wis anders gehen würde, dazulernen is immer fein ;)

Was mich eher interessieren würde, WANN gibts den MindMap jetzt zu kaufen, ich sitz grob auf Nadeln^^
 
Frank ist fleissig in der Produktion der Prozessoren die vor Erscheinung schon vorbestellt waren.

lt. letzten Infos sollte Er wohl damit irgendwann zw. Mitte September und Anfang Oktober durch sein.
(ich wart ja auch )

aber ne andere Frage - wenn Du so auf Nadeln sitzt , warum fragst Du ihn net via tel. direkt :kopfkratz:
 
Ich wusste ja ned mal das die Vorbestellbar sind sonnst wär das schön längst erledigt^^

Naja, jetzt wo ich grad krank bin werd ich mal schaun wie ich für ne Vorbestllung mit ihm in Kontakt komme sowas is ja ned immer einfach bei mienen Arbeitszeiten...

Thx für die Info Odie!
 
so richtig offiziell Vorbestellbar war er auch nicht - man musste ihn nur lange genug nerven bis er sich breitschlagen liess.

Kannst ja dein Glück versuchen - sein Tel. findest auf seiner HP

wobei ich mir sicher bin,
dass sobald Frank soweit ist das der VK offiziell beginnen kann werden wir es hier vorher erfahren.

Gruß
Markus
 
Was ja genau der Grund is warum ich gefragt hab^^ Egal, weiter im Text und Gute Nacht zusammen.
 
Heut ma ein bissl den kleinen Prozzi in der Gladen One bewundert...alter is das Ding geil...Frequenzeinstellung bis auf 0,xx Hz genau, "Live" Einstellung aller Filter, der Amp fährt die Musik langsam "hoch", die Preset umschaltung geht butterweich ineinander "über"

Man kann quasi die Schleife bei manchen Autos, wenn der Beifahrer den Anschnaller ins Gurtschloss steckt dafür nutzen, um das 2. Preset zu aktivieren, das beide Seiten gut hören können :liebe:
 
achja.. ich muss mich noch entschuldigen.
Ich bin noch nicht fertig mit dem Tutorial.
Hab grad n bisl mehr um die Ohren.
Aber wohl am WE fertig..
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten