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

FFT, Akkustisches Signal

 

gout
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 02.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2015, 09:30     Titel: FFT, Akkustisches Signal
  Antworten mit Zitat      
Hallo Zusammen,
ich habe ein akkustisches Signal aufgenommen, dabei natürlich auch Shannon beachtet, d.h.
ich habe eine Messwertreihe von 8388608 Messwerten,
abgetast mit 50000 Hz. Das Signal ist 167 Sek lang.
Unten mal ein Plot.
Die Auslösung ist 16 bit.
Nun hab ich mir schon ein paar Tage die Finger gebrochen und einfach Blauäugig ein paar FFT's durchgeführt.

Weil ich aber keine Lust mehr hatte bei den hunderten von Signal jedesmal jede Funktion neu auszuführen, hab ich eine Funktion geschrieben.

Code:
function [FFT_Abs_Korr,FFT_Abs_Auss] = FFT_Skript1_1( Signal_01 )
X = double(Signal_01);
n = length(X);
Ausschnitt = Signal_01(1:n/4);
Ergaenzen = zeros(1,n/4);
Ausschnitt = [Ausschnitt, Ergaenzen ];
y_FFT = abs(fft(X));
x_FFT = abs(fft(Ausschnitt));
FFT_Abs_Auss = x_FFT(1:n/2);
FFT_Abs_Korr = y_FFT(1:n/2);
plot(FFT_Abs_Korr,'DisplayName','FFT');hold all;plot(FFT_Abs_Auss,'DisplayName','FFT_Ausschnitt');hold off;
xlim([0 20000]);
ylim([0 15000]);
end  

Dabei nehme ich das erste viertel der Messwerte erneut um die Frequenzen zu vergleichen. Der Interessante Teil, aus dem ich mir erhoffe etwas zu Finden ist in bereich 2/4 - 3/4.
Der Erste Teil ist für mich also zum vergleichen erdacht. (Normalzustand der Anlage).
Nun die Frage, ist das was ich hier verbrochen habe, verständlich und viel wichtiger, auch richtig?
Ich habe soviele Bsp. gelesen und keins dieser Bsp. scheint zu passen.
Ich bin vor allem unsicher, weil wenn ich das Signal in 16 Teile zerlege und einzeln Transformiere kommt ein großer einheitsbrei dabei raus.
Danke Schonmal für die Hilfe

Gruß
Gout

Einheitsbrei.jpg
 Beschreibung:
Einmal der Einheitsbrei

Download
 Dateiname:  Einheitsbrei.jpg
 Dateigröße:  25.85 KB
 Heruntergeladen:  481 mal
Original_signal.jpg
 Beschreibung:
Das Orginal Signal

Download
 Dateiname:  Original_signal.jpg
 Dateigröße:  18.61 KB
 Heruntergeladen:  472 mal
FFT.jpg
 Beschreibung:
Die FFT mit dem oben gennanten Funktion

Download
 Dateiname:  FFT.jpg
 Dateigröße:  52.58 KB
 Heruntergeladen:  497 mal
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 14.05.2015, 08:53     Titel:
  Antworten mit Zitat      
Da du nur den positiven Frequenzbereich nutzt, stimmt die Skalierung der Amplitude nicht. Siehe folgendes Skript:

http://www.gomatlab.de/fft-umfassendes-beispiel-t777.html

Außerdem ist es ratsam eine Fensterfunktion wie z.B. Hanning zu verwenden um den Leakage Effekt zu minimieren. Selbst wenn das komplette Signale nur volle Perioden enthält (was bei einem realen Messsignal schon sehr unwahrscheinlich ist) wirst du durch die Segmentierung erst recht Leakage erzeugen. Auch hier zeigt das verlinkte Skript wie die Fensterung erfolgt.

Sollte Amplitudentreue statt Frequenzgenauigkeit erwünscht sein kann man alternative auch zu einem Flattop Window statt Hanning greifen.

Noch ein kleiner Tipp: Das Zeropadding, so nennt man den Vorgang des Anhängens von Nullen vor der FFT, kann von der Funktion auch direkt durchgeführt werden.

Code:

Ausschnitt = Signal_01(1:n/4);
Ausschnitt = [Ausschnitt, Ergaenzen ];
Ergaenzen = zeros(1,n/4);
x_FFT = abs(fft(Ausschnitt));

% äquivalent zu oberem Code
Nfft = n/2;
x_FFT = abs( fft(Signal_01(1:n/4),Nfft) );
 


Ist Nfft > length(signal) hängt die Funktion automatisch die fehlenden Nullen an um auf die Länge von Nfft zu kommen.
Private Nachricht senden Benutzer-Profile anzeigen
 
gout
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 02.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2015, 15:08     Titel:
  Antworten mit Zitat      
Hi, Sorry das ich erst so spät antworte.
Ich hätte nur ne Frage,
Wie mach ich das mit der Normierung??
Dieses Thema Normierung lässt mich ehrlich gesagt nicht so richtig los.

Und noch eine Zweite frage.
Wenn ich meinen Graphen jetzt mit xlim versuche zu Skalieren, dann ist das Ergebnis vollständig anders als wenn ich so in meinen Graphen hineinzoome. Wie kann das eigentlich sein??

Gruß
Gout
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 12.06.2015, 06:52     Titel:
  Antworten mit Zitat      
Die Normierung ist doch in dem verlinkten Skript angegeben!

Für den gesamten Frequenzbereich:
N ist die Anzahl der Messwerte
Code:

% Berechnung der FFT
% ------------------
H = fft(y, N);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(H);
% Amplitudenskalierung (Normierung auf N) und verschieben der Elemente des
% Amplitudenvektors, so dass die Darstellung des Amplitudengangs von -fn...0...fn
% erfolgen kann:
amplitudengang = fftshift(amplH/N);
 


Nur der positive Frequenzbereich 0...fn

Code:

% 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)]; % DC-Bin auf N normieren!
 


Zur 2. Frage: xlim begrenzt doch nur die linke und rechte Grenze der x-Achse eines Plots. Meinst du evtl. eine andere Beschriftung der Labels zwischen einer Darstellung mit xlim und einem zoom? Also statt 1000 die 1e3 oder 10^3 Schreibweise? Bitte mal ein konkretes Bsp. an Hand von Plots darstellen, um zu zeigen was genau du meinst.
Private Nachricht senden Benutzer-Profile anzeigen
 
gout
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 02.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2015, 15:56     Titel:
  Antworten mit Zitat      
Vielen dank für die Hilfe,
ich habe jetzt viel ausprobiert und komm leider noch nicht weiter.
Ich denke ich habe die Anwendung FFT jetzt richtig benutzt,
Mit Fensterung und Normierung.
Ich würde mein Thema gerne nochmal vorstellen und mal nachfragen wie eure herangehensweise wäre, bzw. würde mich unteressieren ob jemand schonmal so ein Problem hatte.
Außerdem hätte ich da ein Paar fragen.
Aber erstmal die Aufgabe

Ich habe mit einem Mikrofon (Wie sich im nachhinein Rausstellte 100 Hz bis 10000 Hz); etwas aufgenommen.
Angeschlossen an das Mikrofon was ein Datenlogger,
eigestellt wurde:
fa = 50000 Hz ( Da zu dem Zeitpunkt der Kollege noch dachte aufnahmebereich wäre bis 21000 Hz und er großzügig war),
Ein TriggerSignal das von einer SPS kommt
Aufgenommen wurde 167.7722 s, was genau 8388608 signle Werte sind
50 % der Werte (8388608) werden vor dem Trigger und 50% danach, also Sind 83.8861 s vor dem Trigger. Das sind die eigentlich interessanten Werte.

Der Trigger wird von einem Bediener betätigt und ist also nur eine Ungefähre angabe wann das Ereigniss passiert ist.

Als Anhang sieht man die Messkurve mit dem Triggersignal.
Zusätlich habe ich noch einmal den Interesannten Bereich ausgeschnitten.

Man kann schon am Signal sehen, das etwas Passiert vor dem Trigger, allerdings kriege ich nicht raus ob sich die Frequenz veränder oder die Amplitude, alles ist bei meinen Versuchen exakt Gleich.

Würde mich freuen wenn ihr mir eure Herangehensweie mal erläutern würdet.

Ich hab übrigens jetzt bereits mehrere Skripte geschrieben die auch gerne mal Reinstellen kann.
Das obere war eins der ersten Embarassed :

Hätte noch eine frage die ich bis jetzt noch nirgendwo lesen konnte.
Wenn ich einen Großen datenblock (in meinem Fall habe ich immer 2097152 (gesamlänge/4) genommen und die ersten beiden blöcke miteinernader verglichen) durch eine FFT jage, mittelt matlab dann automatisch. Weil ich immer die gleichen Frequenzen bekomme wenn ich die FFT durchjage.

Und direkt noch eine Frage, Wenn ich eine Frequenzaüflösung von z.B. 0,1 habe und ich bei dem Graphen den Bereich über Xlim auf 10000 Hz begrenzen möchte. Muss ich doch bei Xlim die obere Grenze auf 100000 eingeben oder liege ich da Falsch??


Grüße
Gout

beispiel.jpg
 Beschreibung:
Signal mit Trigger

Download
 Dateiname:  beispiel.jpg
 Dateigröße:  65.99 KB
 Heruntergeladen:  430 mal
Bereich.jpg
 Beschreibung:
Interessanter Bereich des Signals

Download
 Dateiname:  Bereich.jpg
 Dateigröße:  113.22 KB
 Heruntergeladen:  499 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.06.2015, 18:37     Titel:
  Antworten mit Zitat      
Was genau passiert denn mit dem Audiosignal wenn der Trigger ausgelöst wird?

Evtl. ist ja ein Spektrogramm eher geeignet. Damit erhältst du neben Amplitude und Frequenz auch noch einen Zusammenhang zur Zeit. Während ein normales Frequenzspektrum alle vorhanden Frequenzanteile der kompletten Messzeit darstellt, unabhängig davon ob der Frequenzanteil während der gesamten Messdauer vorliegt oder nicht, kann das Spektrogramm differenzieren. Das Signal wird segmentiert und je nach Segmentlänge und Überlappung benachbarter Segmente kann man die Auflösung von Zeit und Frequenz beeinflussen.

http://de.mathworks.com/help/signal/ref/spectrogram.html
Private Nachricht senden Benutzer-Profile anzeigen
 
gout
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 02.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2015, 19:43     Titel:
  Antworten mit Zitat      
Ich versuch es mal mit einem Topf voll Milch zu erklären.
Das Thema ist sonst etwas zu Metallurgisch.
Also wenn man Milch aufkocht kann es ja sein, dass die überläuft.
Wenn ich das jetzt mit einer Kamera beobachte, und der Topf sehr Hoch ist dauert es länger bis ich merke das die Milch überläuft.
Also wenn die Milch überläuft drücke ich den Trigger, um dann, in diesem Fall den Strom der Herdplatte abzuschalten.

Meisten läuft die Milch trotzdem über.
Jetzt nimmt man das ganze mit einem Mikrofon auf.
Und analysiert das ganze Signal Smile.

Und man erkennt ja auch am Signal das vor dem Trigger etwas Passiert, also das sich was ändert.
Das muss doch im Spektrum sichtbar sein.

Achja vielen dank, werde ich ausprobieren.
Aber bei der normalen FFT muss ich doch eigentlich auch Unterschiede sehen wenn ich die ersten 40s mit den zweiten 40s vergleiche. Also das Grundsignal mit dem veränderten
Signal vor dem Trigger.
Grund
Gout



P.S. Wer sich damit auskennen Soll sich das Thema BOF Konverter und Schaumschlacke mal angucken
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.06.2015, 19:52     Titel:
  Antworten mit Zitat      
Ohne deinen Code und das Signal ist es halt schwer dir genauer zu helfen.

Hier wäre eine Funktion die ein korrektes Frequenzspektrum erstellt. Diese müsstest du dann nur mit deinen unterschiedlichen Segmenten ausführen.

Code:

function [mag, mag_dB, fv] = FFT_betragsspektrum( signal, nfft, fa, window, scale)
% Input:
% Signal im Zeitbereich
% nfft = Anzahl Messwerte für fft
% wenn nfft > length(sig) -> fft(sig,nfft) führt Zeropadding durch
% fa = Abtastfreq.
% window: Fensterung mit Hann window
% scale: 0 = keine Impulsantwort als Eingang, 1 = Impulsantwort
% Output:
% Magnitude des Spektrums linear und dB skaliert
% Frequenzvektor fv in [Hz] von 0...fa/2

% un-,gerade Anzahl Messwerte?
if mod(nfft,2) == 0;
    k = (nfft/2) + 1;
else
    nfft = nfft + 1;
    k = (nfft/2) + 1;
end

fn = fa/2; % Nyquistfreq.
df = fa/nfft; % Frequenzauflösung des Spektrums
% Frequenzvektor: Darstellung bis Nyquistfreq.
fv = 0: df : fn;

sig = signal(:);

% Fensterung
if window == 1
    win = hann(nfft)'; % Hanning Fensterfunktion
    sig_win = sig .* win * nfft / sum(win); % Fensterung mit Amplitudenkorrektur
    sig = sig_win;
end

% Signal transformieren
Fy = fft(sig,nfft);
 
%   Betrag - nur positives Freq.spektrum
if scale == 0
    Fy_pos0 = abs(Fy(1:k));

    %   Skalierung  
    mag = [Fy_pos0(1)/nfft ;Fy_pos0(2:k-1)/(nfft/2);Fy_pos0(k)/nfft];
else % nicht durch nfft teilen bei Impulsantwort
    mag = abs(Fy(1:k));
end

% Umrechnung in dB
mag_dB = 20*log10(mag + eps); % eps = kleine Konstante zur Vermeidung von log(0)
 
 


Aufruf und Darstellung wäre dann z.B. so:

Code:

fa = ... % Abtastfrequenz in Hz
nfft = 1024; % Anzahl Messwerte in Segment
segment_1 = signal(1 : nfft) ;
segment_2 = signal(nfft+1 : 2*nfft);

[~, mag_dB, fv] = FFT_betragsspektrum( segment_1, nfft, fa, 1, 0) ;

plot(fv,mag_dB,'b');

hold on;

[~, mag_dB, fv] = FFT_betragsspektrum( segment_2, nfft, fa, 1, 0) ;

plot(fv,mag_dB,'r');

legend('Segment 1','Segment 2')
xlabel('Frequenz in Hz');
ylabel('Amplitude dB');
 


EDIT: habe dir noch in der Funktion ein Hanning Fenster eingefügt
Private Nachricht senden Benutzer-Profile anzeigen
 
gout
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 02.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2015, 20:17     Titel:
  Antworten mit Zitat      
Klar kein Proble,
Signal häng ich dran ist aber was größer Very Happy

und Code,
hab verschiedene sachen versucht
Code:

function [amplitudengangx,amplitudengangy] = FFT_Skript3( Signal_01 )
X = double(Signal_01); %umwandeln in Double
n = length(X); % Länge errechnen
X = X(round(n/4):round(n/4*2));
N = length(X);
Y = Signal_01(1:round(n/4)+1);
x_FFT = fft(X);
y_FFT = fft(Y);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplx = abs(x_FFT);
amply = abs(y_FFT);
% Amplitudenskalierung (Normierung auf N) und verschieben der Elemente des
% Amplitudenvektors, so dass die Darstellung des Amplitudengangs von -fn...0...fn
% erfolgen kann:
amplitudengangx = [amplx(1)/N amplx(2:N/2)/(N/2)];
amplitudengangy = [amply(1)/N amply(2:N/2)/(N/2)];
plot(amplitudengangx,'DisplayName','FFT');hold all;plot(amplitudengangy,'DisplayName','FFT_Ausschnitt');hold off;
xlim([0 10000]);
%ylim([0 2000]);
end
 


ist die älteste.
Zum Teil aus dem Umfassenden Beispiel geklaut.

Code:

clear all;
load Auswurf_4_04.03.15-04.14.37.mat;

x=double(Signal_01);
n= length(x);

fa = 50000; % Abtastfrequenz
fn = fa/2; % Nyquistfrequenz
N = 65536; % gewünschte FFT-Länge (N=2^x, sonst wird der DFT-Algorithmus verwendet!)
df = fa/N; % Schrittweite er Frequenzen

x1= x(((n/2)-N) : (n/2)-1);
x2= x(((n/2)-2*N) : (n/2)-N-1);
x3= x(((n/2)-3*N) : (n/2)-2*N-1);
x4= x(((n/2)-4*N) : (n/2)-3*N-1);
x5= x(((n/2)-5*N) : (n/2)-4*N-1);
x6= x(((n/2)-6*N) : (n/2)-5*N-1);
x7= x(((n/2)-7*N) : (n/2)-6*N-1);
x8= x(((n/2)-8*N) : (n/2)-7*N-1);


y1= x((1:N));
y2= x((1*N) : 2*N-1);
y3= x((2*N) : 3*N-1);
y4= x((3*N) : 4*N-1);
y5= x((4*N) : 5*N-1);
y6= x((5*N) : 6*N-1);
y7= x((6*N) : 7*N-1);
y8= x((7*N) : 8*N-1);


x_ges= [x1,x2,x3,x4,x5,x6,x7,x8];
y_ges= [y1,y2,y3,y4,y5,y6,y7,y8];


hw=hanning(N);
hwT= hw';
hw1=hanning(N*8);
hwT1= hw1';

X1=x1.*(hwT*N/sum(hw));
X2=x2.*(hwT*N/sum(hw));
X3=x3.*(hwT*N/sum(hw));
X4=x4.*(hwT*N/sum(hw));
X5=x5.*(hwT*N/sum(hw));
X6=x6.*(hwT*N/sum(hw));
X7=x7.*(hwT*N/sum(hw));
X8=x8.*(hwT*N/sum(hw));
X_ges=x_ges.*(hwT1*N/sum(hw));


Y1=y1.*(hwT*N/sum(hw));
Y2=y2.*(hwT*N/sum(hw));
Y3=y3.*(hwT*N/sum(hw));
Y4=y4.*(hwT*N/sum(hw));
Y5=y5.*(hwT*N/sum(hw));
Y6=y6.*(hwT*N/sum(hw));
Y7=y7.*(hwT*N/sum(hw));
Y8=y8.*(hwT*N/sum(hw));
Y_ges=y_ges.*(hwT1*N/sum(hw));

H1 = fft(X1, N);
amplH1 = abs(H1);
amplitudengang1 = [amplH1(1)/N amplH1(2:N/2)/(N/2)];

H2 = fft(X2, N);
amplH2 = abs(H2);
amplitudengang2 = [amplH2(1)/N amplH2(2:N/2)/(N/2)];

H3 = fft(X3, N);
amplH3 = abs(H3);
amplitudengang3 = [amplH3(1)/N amplH3(2:N/2)/(N/2)];

H4 = fft(X4, N);
amplH4 = abs(H4);
amplitudengang4 = [amplH1(4)/N amplH4(2:N/2)/(N/2)];

H5 = fft(X5, N);
amplH5 = abs(H5);
amplitudengang5 = [amplH5(1)/N amplH5(2:N/2)/(N/2)];

H6 = fft(X6, N);
amplH6 = abs(H6);
amplitudengang6 = [amplH6(1)/N amplH6(2:N/2)/(N/2)];

H7 = fft(X7, N);
amplH7 = abs(H7);
amplitudengang7 = [amplH7(1)/N amplH7(2:N/2)/(N/2)];

H8 = fft(X8, N);
amplH8 = abs(H8);
amplitudengang8 = [amplH8(1)/N amplH8(2:N/2)/(N/2)];

HY1 = fft(Y1, N);
amplHY1 = abs(HY1);
amplitudengangY1 = [amplHY1(1)/N amplHY1(2:N/2)/(N/2)];

HY2 = fft(Y2, N);
amplHY2 = abs(HY2);
amplitudengangY2 = [amplHY2(1)/N amplHY2(2:N/2)/(N/2)];

HY3 = fft(Y3, N);
amplHY3 = abs(HY3);
amplitudengangY3 = [amplHY3(1)/N amplHY3(2:N/2)/(N/2)];

HY4 = fft(Y4, N);
amplHY4 = abs(HY4);
amplitudengangY4 = [amplHY4(1)/N amplHY4(2:N/2)/(N/2)];

HY5 = fft(Y5, N);
amplHY5 = abs(HY5);
amplitudengangY5 = [amplHY5(1)/N amplHY5(2:N/2)/(N/2)];

HY6 = fft(Y6, N);
amplHY6 = abs(HY6);
amplitudengangY6 = [amplHY6(1)/N amplHY6(2:N/2)/(N/2)];

HY7 = fft(Y7, N);
amplHY7 = abs(HY7);
amplitudengangY7 = [amplHY7(1)/N amplHY7(2:N/2)/(N/2)];

HY8 = fft(Y2, N);
amplHY8 = abs(HY8);
amplitudengangY8 = [amplHY8(1)/N amplHY8(2:N/2)/(N/2)];

plot(amplitudengang1,'DisplayName','amplitudengang1');hold all;plot(amplitudengang2,'DisplayName','amplitudengang2');hold all;plot(amplitudengang3,'DisplayName','amplitudengang3');hold all;plot(amplitudengang4,'DisplayName','amplitudengang4');hold all;plot(amplitudengang5,'DisplayName','amplitudengang5');hold all;plot(amplitudengang6,'DisplayName','amplitudengang6');hold all;plot(amplitudengang7,'DisplayName','amplitudengang7');hold all;plot(amplitudengang8,'DisplayName','amplitudengang8');hold all;plot(amplitudengangY1,'DisplayName','amplitudengangY1');hold all;plot(amplitudengangY3,'DisplayName','amplitudengangY3');hold all;plot(amplitudengangY4,'DisplayName','amplitudengang4');hold all;plot(amplitudengangY5,'DisplayName','amplitudengangY5');hold all;plot(amplitudengangY6,'DisplayName','amplitudengangY6');hold all;plot(amplitudengangY7,'DisplayName','amplitudengangY7');hold all;plot(amplitudengangY8,'DisplayName','amplitudengangY8');hold off;
 


Ist die aktuellste Versin,
noch etwas unschön ist aber erst vor 1 Std fertig geworden.
Ich habe extra so viele Zwischenergebnisse um zu Kontrollieren.
Das ist meine KurzzeitFFT und ich habe nur die veränderungen im Signal angeschaut. Und die dann mit dem Standart verglichen.

Danke nochmal

Gruß
Gout
Private Nachricht senden Benutzer-Profile anzeigen
 
gout
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 02.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2015, 20:23     Titel:
  Antworten mit Zitat      
So jetzt die datei, ist etwas groß also Gezippt

Auswurf_4_04.03.15-04.14.37.rar
 Beschreibung:

Download
 Dateiname:  Auswurf_4_04.03.15-04.14.37.rar
 Dateigröße:  21.78 MB
 Heruntergeladen:  579 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.06.2015, 21:30     Titel:
  Antworten mit Zitat      
Hier mal ein etwas übersichtlicheres Skript, bei dem man einfacher die Größe und Anzahl der Segmente ändern kann bzw. es ist deutlich übersichtlicher.

Code:

clear;
load Auswurf_4_04.03.15-04.14.37.mat;

x = double(Signal_01);
offset = 3800000; % Signal beginnt bei Messwert Nr.


fa = 50000; % Abtastfrequenz
fn = fa/2; % Nyquistfrequenz
nfft = 2^15; % gewünschte FFT-Länge (N=2^x, sonst wird der DFT-Algorithmus verwendet!)

k = 64; % Anzahl Segmente

signal = x(offset:offset+nfft*k);
n = length(signal);

t = offset/fa : 1/fa : (n-1)/fa + (offset/fa); % Zeitvektor
% Zeitbereich:
hFig = figure('Name','Zeitbereich','Visible','on');
hAx = axes('nextplot', 'new');
plot(hAx,t,signal);
grid on;  
xlabel('Time (Seconds)');
ylabel('Amplitude');

% Frequenzspektrum jedes Segments berechnen
mag_dB = zeros(k,nfft/2+1);
for i=1:k
    [~, mag_dB(i,:), fv] = FFT_betragsspektrum( signal(nfft*(i-1)+1:nfft*i), nfft, fa, 1, 0) ;    
end
% Ausgabe in Plot
hFig = figure('Name','Frequenzspektrum','Visible','on');
hAx = axes('nextplot', 'add');
plot(hAx,fv,mag_dB);
grid on;  
colormap(lines);
xlabel('Frequenz in Hz');
ylabel('Amplitude dB');

% Spektrogramm
hFig = figure('Name','Spektrogramm','Visible','on');
hAx = axes('nextplot', 'new');
[S,F,T,P] = spectrogram(signal(1:nfft*k),nfft,nfft/2,nfft,fa);
surf(hAx,T+(offset/fa),F,20*log10(P),'edgecolor','none'); axis tight;
view(0,90);
colorbar;
xlabel('Time (Seconds)'); ylabel('Frequenz in Hz');
zlabel(hAx,'Amplitude dB');
 


Allerdings sehe ich hier nicht wirklich eine Änderung im Signal. Auch nicht im Spektrogramm. Lediglich die Peaks sind auch dann im Spektrogramm zu den Zeitpunkten deutlich sichtbar. Ansonsten sind eigentlich kaum Änderungen in Frequenz oder Amplitude zu erkennen. Ich nutze die Funktion aus meinem letzten Post. Je kleiner du die Segmente machst, desto höher wird die Frequenzauflösung und so geringer die Zeitauflösung. Je größer die Segmente desto besser die Zeitauflösung.
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.