Forum: Digitale Signalverarbeitung / DSP / Machine Learning ein Equalizer mit MATLAB


von anabolik (Gast)


Angehängte Dateien:

Lesenswert?

hallo.

ich möchte mit matlab ein equalizer realisieren. meine 2
überlegungen/ansätze habe ich in einem bild (sehe
anhang)zusammengefasst. die erste variante könnte man mit matlabbefehl
"fftfilt(h,x)" verwirklichen(hoffe ich). bei der zweiten würde ich
x(n) FFT-transformieren(mit overlap-add oder overlap-save) und daraus
sich ergebendes spektrum mit meinem Wunsch-EQ-Spektrum multiplizieren
und mit IFFT das gefiltertes signal zu bekommen.
mein problem: wie realisiere ich das wunschspektrum in matlab(auf dem
papier ist ja alles klar: re(w/wg)+((dreieck(w/w1)*dirackam(w/2xw1))x
re(w/wg) das ganze noch um 10020Hz mit diracimpuls verschieben/falten).
für Var.1 und Var.2 brauche ich doch mein Wunsch-EQ-Spektrum in matlab.
wenn ihr was anderes vorschlagen könnt, ich bin für alles offen.

von Alex (Gast)


Lesenswert?

Was hindert dich, eine IFFT deines Wunschspektrums zu machen? Dann bist
du wieder im Zeitbereich und kannst dein Signal damit falten.

von anabolik (Gast)


Lesenswert?

ja dies sieht ja die variante 1 vor(hier mit fftfilt jedoch ohne faltung
sondern multiplikation im f-bereich. diskrete faltung mit for-schleifen
ist zu langsam. gibt es ein befehl in matlab für faltung?). mein
problem ist, wie realisiere ich mein wunschspektrum in matlab um es
später mit IFFT aus H_wunsch(w) h(t) zu machen und dann mit
fftfilt(B,X) auf y(t) zu kommen. soll ich
re(w/wg-10020Hz)+dreieck_1(w/w1-(w1+20HZ))+dreieck_2(w/w1-(2w1+20HZ))+dr 
eieck_3(w/w1-(3w1+20HZ))+u.s.w.
definieren, wobei re(w/wg-10020Hz) für w<20Hz und w>20kHz 0 ist und für
20Hz<w<20kHz 1 ist?

von Matthias (Gast)


Lesenswert?

Faltung in Matlab geht mit conv.

Wie du das Spektrum am schönsten definierst fällt mir im Moment aber
nicht ein. Problematisch hierbei ist ja, dass die filterfrequenzen für
nen audio equalizer exponentiell ansteigen sollten, damit bei
logarithmischer ansicht der frequenzachse die Filterteile ungefähr
gleich verteilt sein. Zusätzlich sollte dann auch die Bandbreite mit
höherer Frequenz ansteigen, so dass die Güte immer ungefähr gleich
bleibt.

Ich würde mir vermutlich erstmal n linearer Spektrum erzeugen, mit
f= 0:20000;
H(1:length(f)) = 1;

dann die einzelnen Durchlass und Sperrbereiche definieren und
draufmultiplizieren, zB Cos Fenster bei 30Hz ( keine Ahnung ob das
optimal ist, aber is jetz schnell hinzuschreiben) mit 10Hz Bandbreite:
gain = 1;
f1=25:35;
H1=1+ gain.*(cos((f1-30)./5 .*(pi/2))); % sollte bei 30Hz maximal sein
und bei -25 und 35 = 1

und dann das Teilspektrum auf das Gesamtspektrum aufmultiplizieren.
Sollte so ähnlich funktionieren:
H(find(f=f1)) = H(find(f=f1)) .* H1;

Aber wie gesagt, wo man die Filter genau ansetzt und wie man sie
designt ist nochmal ne andere Frage die man genauer untersuchen sollte.
Ich glaube typische 8/32 band equalizer nutzen IIR Filter, und dabei ein
biquad für jedes Band. Dabei muss dann wohl auch für jedes Biquad
Gain/Güte und Frequenz eingestellt werden.

von anabolik (Gast)


Lesenswert?

danke wäre nie drauf gekommen!
wäre denn cos^2 besser oder Hamming-, Hanning- und
Blackman-Fenster(sind doch eigentlich für die begrenzung im zeitbereich
bestimmt)?
was hälst du von Yule-Walker-IIR-Filter
"http://home.zhwin.ch/~hrt/DSV1/skript/dsv1kap5_filter.doc"; seite 12.
oder Biquads seite 19(dein vorschlag).

von anabolik (Gast)


Lesenswert?

noch eine frage. wenn ich H(z) habe, wie kommt man auf h(n) (freqz
liefert doch übertragungsfunktion aus a,b-koeffizienten, oder)?

von anabolik (Gast)


Lesenswert?

polynomdevision zu fuß kommt doch nicht in frage, oder?

von Detlef A (Gast)


Lesenswert?

So:

h=filter(b,a,ones(1,10000));

Cheers
Detlef

von anabolik (Gast)


Lesenswert?

danke
h=filter(b,a,ones(1,10000)); ist das die methode mit durchschieben
einer eins?

von Detlef _. (detlef_a)


Lesenswert?

Das Ding ist die Sprungantwort des Filters:
h=filter(b,a,ones(1,10000));

Das Ding ist die Impulsantwort des Filters:
h=filter(b,a,[1 zeroes(1,10000)]);

Cheers
Detlef

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.