WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

ifft eines komplexen Spektrums/FIR Lautsprecherentzerrung

 

Lucas

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2015, 13:07     Titel: ifft eines komplexen Spektrums/FIR Lautsprecherentzerrung
  Antworten mit Zitat      
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

 


Leider ist z, die Impulsantwort, komplex. Woran liegt das ?
Vielen Dank für eure Antworten.

Gruß,
Lucas


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2015, 16:03     Titel:
  Antworten mit Zitat      
Code:

Zflip=flipud(Z)
Z=[Z;conj(Zflip)]
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Lucas

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2015, 10:39     Titel:
  Antworten mit Zitat      
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.
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2015, 10:40     Titel:
  Antworten mit Zitat      
Dein Z ist aber eine Matrix, kein Vektor.
Private Nachricht senden Benutzer-Profile anzeigen
 
Lucas

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2015, 11:53     Titel:
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 07.05.2015, 12:20     Titel:
  Antworten mit Zitat      
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.


Code:
clear all
close all
clc


fs=48000;
fny=fs/2;
fu=40;   %Untere Grenzfreq
fo=3000;  % Obere Grenzfreq



[b,a]=butter(2,[(fu/fny) (fo/fny)]);

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
%---------------------------------------------------------------

RefFlip=fliplr(ref);
Z=[conj(RefFlip) ref];

z=fftshift(ifft(Z));

Z2=ifftshift(fft(z));

figure('Name','Bandpass-Amplitude und Phase')
semilogx(abs(ref),'r')
hold on
semilogx(arg(ref))

figure('Name','z')
plot(z)

figure('Name','nur Realteil von z')
plot(real(z)) %nur realteil von z plotten

figure('Name','Bandpass-Amplitude und Phase Zurüchtransformiert')
semilogx(abs(Z2),'r')
hold on
plot(arg(Z2))
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 08.05.2015, 10:48     Titel:
  Antworten mit Zitat      
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.

Evtl. hilft dir der letzte Post dieses Threads um die Symmetrie von Z zu testen. http://www.gomatlab.de/fft-uebertra.....ifft-t28107,start,15.html

Vielleicht ist auch sinnvoll statt freqz lieber selbst die Impulsantwort zu erstellen und in den Frequenzbereich zu verwandeln. Also mittels

Code:

N = ... % Anzahl Messwerte -1 des Dirac Stoßes
dirac = [1;zeros(N,1)];
Impulsantwort = filter(b,a,dirac);
% Frequenzantwort berechnen
H = fft(Impulsantwort)
 


Allerdings verstehe ich diesen Teil auch nicht:


Code:

%---------------------------------------------------------------
% Inverse Fouriertransformation des Filterfrequenzganges
%---------------------------------------------------------------

RefFlip=fliplr(ref);
Z=[conj(RefFlip) ref];

z=fftshift(ifft(Z));

Z2=ifftshift(fft(z));
 


Würde ich aus meinem oberen Beispiel H wieder in den Zeitbereich transformieren wollen, müsste eigentlich ein

Code:


genügen. Warum drehst du denn den Vektor ref um? Ich habe gerade kein Matlab/Octave zur Verfügung. freqz liefert ohne den Zusatz

Code:
[h,f] = freqz(___,...,'whole',...)


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.