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.
Was hindert dich, eine IFFT deines Wunschspektrums zu machen? Dann bist du wieder im Zeitbereich und kannst dein Signal damit falten.
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?
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.
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).
noch eine frage. wenn ich H(z) habe, wie kommt man auf h(n) (freqz liefert doch übertragungsfunktion aus a,b-koeffizienten, oder)?
danke h=filter(b,a,ones(1,10000)); ist das die methode mit durchschieben einer eins?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.