mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP ein Equalizer mit MATLAB


Autor: anabolik (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex (Gast)
Datum:

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

Autor: anabolik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: anabolik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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_fil... seite 12.
oder Biquads seite 19(dein vorschlag).

Autor: anabolik (Gast)
Datum:

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

Autor: anabolik (Gast)
Datum:

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

Autor: Detlef A (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So:

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

Cheers
Detlef

Autor: anabolik (Gast)
Datum:

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

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.