ifft eines komplexen Spektrums/FIR Lautsprecherentzerrung
Lucas
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 06.05.2015, 13:07
Titel: ifft eines komplexen Spektrums/FIR Lautsprecherentzerrung
Hallo,
Ich versuche gerade die Phasenverzerrung und den Amplitudengang eines Lautsprechers zu entzerren. Dazu möchte ich FIR-filter entwickeln die das übernehmen.
Ich habe den Wunschamplitudengang des Filters schon soweit fertig entwickelt.
Der Phasengang des Filters soll genau der gespiegelte des Lautsprecherchassis sein um diesen zu kompensieren.
Mein Plan ist nun die Amplituden- und Phaseninformation in komplexen Zahlen zu verpacken, also einen komplexen Frequenzgang des Filters zu erzeugen.
Diesen komplexen Frequenzgang möchte ich invers fouriertransformieren und müsste eine reale Impulsantwort bekommen, die ich dann z.b. mit einem Hamming-Window fenstern kann. Die gefensterten Werte der Impulsantwort sind dann die Koeffizienten des gewünschten FIR-Filters.
Das erste Problem das Auftritt ist, dass meine Impulsantwort nicht real ist.
Hier der Code der die Phasen und Amplitudeninformationen in ein komplexen Frequenzgang verpackt und diesen komplex konjugiert und spiegelt.
Code:
phase=phaseData.*(pi/180); %Grad in rad umrechnen
amp=10.^(wunschAmplitudengang/20); %Spl(dB) in Spannungswert umrechnen
Z=amp.*cos(-phase)+(amp.*sin(-phase))*(sqrt(-1)); %Phase und Amplitude in komplexe Zahl verpacken
Zflip=flipud(Z); %Spiegeln
Z=[Z;conj(Zflip)]; %gespiegelter Vektor wird kompl.konj. und mit ursprünglichem zusammengefügt
z=fftshift(ifft(Z)); %fouriertrafo des komplexen Frequenzgangs
An dieser Stelle machst Du Z zu einer Matrix mit zwei Zeilen und so vielen Spalten, wie es vorher schon waren. Bist Du sicher, dass Du das willst?
Wenn Du das repariert hast, hilft Dir womöglich die Option 'symmetric' von ifft() weiter.
Lucas
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.05.2015, 10:39
Titel:
Z ist ein Spaltenvektor, weil die Daten der Phase und der Amplitude auch als Spaltenvektoren vorliegen.
Und das neue Z ist dann ein Spaltenvektor mit doppelt so vielen Zeileneinträgen.
Ich glaube das müsste so schon stimmen.
also mein Z hat die Dimension 4098x1 . Das ist für mich ein Spaltenvektor und keine Matrix.
Übrigens benutze ich Octave und kann deshalb die 'symmetric' option nicht nutzen.
Kann es sein,dass es einfach nur Rundungsfehler des Programms sind, die mir einen Imaginärteil erzeugen ?
Lucas
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.05.2015, 12:20
Titel:
Erst mal danke für alle bisherigen Antworten und alle weiteren!
Hier nochmal ausführbarer Code der mein Problem hoffentlich besser verdeutlicht.
Die aus dem komplexen Frequenzgang transformierte Impulsantwort ist nicht rein reell!
Ich habe zwei Butterworth Bandpässe 2.Ordnung kaskadiert um eine Linkwitz-Riley Charakteristik zu erhalten. Das komplexe Spektrum dieses Filters sollt invers fouriertransformiert zu einer reellen Impulsantwort werden.
Sie ist aber komplex.
sys1=tf(b,a); %Übertragungsfunktion des TP erstellen
sys1=sys1*sys1; % mit sich selbst multiplizieren um LinkwitzRiley 4.Ordnung zu erhalten. [b,a]=tfdata(sys1,'v'); % koeffizienten auslesen
f=[0:24000];
ref=freqz(b,a,f,fs); %komplexer Frequenzgang des Bandpasses
%---------------------------------------------------------------
% Inverse Fouriertransformation des Filterfrequenzganges
%---------------------------------------------------------------
Das Problem liegt vermutlich im Aufbau von Z, da dieser nicht der erforderlichen Norm (Symmetrie) entspricht. Ist das tranformierende Signal y(t) N Werte lang, so ist Y(f) bei N/2+1 spiegelsymmetrisch. Der Gleichsignalanteil wie auch Fs/2 kommen aber nur EINMAL in dem Vektor vor. Der Rest ist dann eben conjugiert komplex aufgeteilt.
nur das Spektrum 0...fs/2. Daher dann wohl dein Umbau von ref zu Z. Ich würde mal den Weg über die FFT gehen statt freqz zu benutzen.
Sollte der Ausfau von Z richtig sein, könnten auch Rundungsfehler das Problem versachen. Das Ergebnis ist deshalb komplex, da eben der Vektor Z nicht exakt konjugiert symmetrisch ist. Durch Rundungsfehler könnte es sein, dass z.B. eben Paare nicht genau konjugiert komplex zueinander sind. Andere Möglichkeit wäre von ref nur den positiven Frequenzbereich, also 0...Fs/2 zu nutzen und dann damit die fehlenden konjugiert komplexen Anteile zu erstellen und anzufügen.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.