Verfasst am: 29.03.2015, 15:25
Titel: Frequenzspektrum eines Schwingkreises
Hallöchen liebe Gemeinde, ich versuche gerade einen doch recht simplen Schwingkreis zu analysieren und arbeite dabei mit LT-Spice um den ganzen Spaß zu simuliren und wollte die Datenauswertung mit MATLAB machen. Es handelt sich dabei um einen simplen Parallelschwingkreis mit der Resonanzfrequenz bei etwa 100MHz. Nun habe ich ein Skript geschrieben, dass quasi aus den exportierten .txt Datein die entsprechenden Größen extrahiert, darstellt und für die FFT vorbereitet. Nun kann ich ja sehr schön das FFT-Ergebnis von LT-Spice mit dem Ergebnis von Matlab vergleichen und dabei fällt mir auf, dass dort anscheinend noch ein Problem in der Umrechnung des Amplitudenspektrums besteht. Ich habe schon einige Zeit im Forum verbracht und versucht das Problem alleine zu lösen, komme jedoch nicht weiter.
Den Code poste ich einfach mal hier drunter.
% L1 zuschneiden und vorbereiten Ein- und Ausschaltvorgangsgröße % hinzufügen der "tail-Größen" um aus dem Schwingvorgang eine % periodische Größe zu machen, Start = Endwert
t_on = time(1:400); % Einschaltzeit (Originaldaten)
str1 = [groesse,'_on']; % str1 für neue Variable
str2 = eval(groesse); % str2 als Referenz für Ausgangsssignal eval([str1 ' = str2(1:400,:);']); % dynamisches Zuschneiden für Einschaltvorgang
t_interp = 0 : time(400)/8000 : time(400); % äquidistanter Zeitstempel für interpolliertes Signal % mit Start bei 0 und Ende beim Zeitwert des Originalsignals % time(400)
interpolation = interp1(t_on,eval(str1),t_interp,'linear'); % linear interpolliertes Zeitsignal "L1_on" auf neuen Zeitbereich "t_interp" if(strcmp(groesse,'L1'))
%gesamt_signal = [interpolation L1_on_tail]; % Einschaltvorgang + "Tail-Funktion"
gesamt_signal = interpolation; % für Plot des % tatsächlichen Signals else
gesamt_signal = interpolation;
end
fft_amplitude = fft(gesamt_signal); % Durchführen der FFT
fft_amplitude = abs(fft_amplitude); % Absolutwert um negative Frequenzen zu eliminieren
fft_amplitude(1) = []; % Gleichanteil unterdrücken
if(strcmp(groesse,'L1'))
schrittweite = (time(400)*3)/(24000); % Abstand zwischen zwei Abtastpunkten skaliert auf das neue Signal % demnach die dreifache % Zeit von time(400)
%fft_time = 0 : (time(400)*3)/24000 : time(400)*3;
else
schrittweite = (time(400)/8000);
end
n = length(fft_amplitude);
amplitude_fft = 20*log10((fft_amplitude(1:floor(n/2)-1))); % dB-Umrechnung
%amplitude_fft = amplitude_fft - max(amplitude_fft); % Normierung auf 0 dB max
freq_fft = (1:floor((n-1)/2))/((n)*(schrittweite)); % Erstellen des Frequenzvektors abhängig von Schrittweite
fighandle2 = figure;
semilogx(freq_fft,amplitude_fft,'Linewidth',1.2);
set(fighandle2,'defaulttextinterpreter','latex');
set(gca,'Fontsize',18);
xlabel('Frequenz in $Hz$','Interpreter','latex','Fontsize',18);
ylabel('Amplitude in $dB$','Interpreter','latex','Fontsize',18);
grid on
clear L1_on_tail; clear n; clear i; clear schrittweite;
clear str1; clear str2; clear str3;
Das Bild, welches ich angehängt habe, zeigt das FFT-Ergbenis, was LT-Spice ausspuckt. Die Resonanzfrequenz ist deutlich zu erkennen und von der prinzipiellen Form her stimmen die beiden Spektren auch überein. Allerdings stimmt die Amplitude nicht
Hat jemand eine Idee, woran das liegt?
N = 1024; % gewünschte FFT-Länge (N=2^x, sonst wird der DFT-Algorithmus verwendet!)
H = fft(y, N);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(H);
% Darstellung des interessierenden Frequenzbereichs des % Amplitudengangs (0...fn) und % daran angepasste Amplitudenskalierung (Normierung auf N/2):
amplitudengang = [amplH(1)/N amplH(2:N/2)/(N/2) amplH((N/2) + 1)/N]; % DC-Bin und Nyquistfrequenz auf N normieren!
Demnach muss ich das Amplitudenspektrum nach der Betragsbildung skallieren und dann in dB umrechnen und dann müsste das gleiche rauskommen, liege ich damit richtig?
So ich habe das mal versucht zu implementieren und es sieht damit auch deutlich besser aus (ich hab das Spektrum mal als Bild angehängt), und es ergibt sich folgender Code
Code:
N = 2^17;
t_interp = 0 : time(400)/N : time(400); % äquidistanter Zeitstempel für interpolliertes Signal % mit Start bei 0 und Ende beim Zeitwert des Originalsignals % time(400)
interpolation = interp1(t_on,eval(str1),t_interp,'linear'); % linear interpolliertes Zeitsignal "L1_on" auf neuen Zeitbereich "t_interp" if(strcmp(groesse,'L1'))
gesamt_signal = [interpolation L1_on_tail]; % Einschaltvorgang + "Tail-Funktion"
%gesamt_signal = interpolation; % für Plot des % tatsächlichen Signals else
gesamt_signal = interpolation;
end
fft_amplitude = fft(gesamt_signal,N); % Durchführen der FFT
fft_amplitude = [fft_amplitude(1)/N fft_amplitude(2:N/2)/(N/2) fft_amplitude((N/2) + 1)/N];
fft_amplitude = abs(fft_amplitude); % Absolutwert um negative Frequenzen zu eliminieren
fft_amplitude(1) = []; % Gleichanteil unterdrücken
if(strcmp(groesse,'L1'))
schrittweite = (time(400)*3)/(24000); % Abstand zwischen zwei Abtastpunkten skaliert auf das neue Signal % demnach die dreifache % Zeit von time(400)
%fft_time = 0 : (time(400)*3)/24000 : time(400)*3;
else
schrittweite = (time(400)/8000);
end
%amplitudengang = [fft_amplitude(1)/N fft_amplitude(2:N/2)/(N/2) fft_amplitude((N/2) + 1)/N];
%n = length(fft_amplitude);
amplitude_fft = 20*log10((fft_amplitude(1:floor(N/2)-1))); % dB-Umrechnung
%amplitude_fft = amplitude_fft - max(amplitude_fft); % Normierung auf 0 dB max
freq_fft = (1:floor((N-1)/2))/((N)*(schrittweite)); % Erstellen des Frequenzvektors abhängig von Schrittweite
fighandle2 = figure;
semilogx(freq_fft,amplitude_fft,'Linewidth',1.2);
set(fighandle2,'defaulttextinterpreter','latex');
set(gca,'Fontsize',18);
xlabel('Frequenz in $Hz$','Interpreter','latex','Fontsize',18);
ylabel('Amplitude in $dB$','Interpreter','latex','Fontsize',18);
grid on
Allerdings ergibt sich bei der zweiten Resonanz bei 300MHz immer noch eine Abweichung, eine Ahnung, wo das herkommt?
Und eine zweite blöde Frage müsste ich noch loswerden, die "gewünschte FFT-Länge" beeinflusst lediglich die Auflösung der FFT und entsprechend auch die Frequenzskalierung, richtig?
Da ich diese hier einmal auf 2^17 egwählt hatte???
Ist N>length(signal) werden die fehlenden Messwerte als Nullen am Ende des Signals gehängt um die Länge N zu erreichen. Das macht die Funktion FFT autotmatisch. Ja, N beinflusst die Auflösung des Spektrums.
Ich bevorzuge daher folgende Schreibweise für den Frequenzvektor:
Ja richtig, damit hast du vollkommen recht, allerdings wenn ich so das Spektrum berchne ist die Amplitude im Resonanzpunkt nicht die, die bei der Simulation mit Spice rauskommt. Das wundert mich eben. Oder hat Spice dabei vielleicht irgendeine Fensterfunktion automation verwendet, das die Amplitude verändert hat?
Wie gesagt...wie lang ist denn length(gesamt_signal)? Ist es kleiner als N, werden Nullen angefügt und das Spektrum wird schon etwas anders sein. Vor allem da bei einem realen Messignal von Leakage auszugehen ist, was ja die Amplitude beeinflusst. Deshalb sollte man auch immer einer Fensterfuntkion nutzen.
gibt es denn da bevorzugte Fensterfunktionen?
Mein Zeitsignal habe ich einmal angehängt. Ich hätte jetzt so ein "chebwin" genommen, da der Schwingungsvorgang quasi mit 1 skaliert wird und der rest gedämpft wird, ist die Überlegung richtig?
EDIT: die Anpassung der Länge hat super geholfen, nun sind es keine 70dB Unterschied mehr zwischen den beiden Spektren sondern lediglich 7-8dB. Die kriegen wir vielleicht noch mit dem Filter weg.
Und die length(gesamt_signal) ist genauso groß wie das gewählte N, nämlich 2^14.
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.