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 - Hann-Fenster in for-Schleife - plotten

 

raupid1
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 04.06.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 04.06.2020, 19:54     Titel: FFT - Hann-Fenster in for-Schleife - plotten
  Antworten mit Zitat      
Hallo,

ich habe in diesem Forum viele nützliche Informationen erhalten und gesammelt. Jedoch bin ich jetzt mit meinem Rat am Ende und habe mich dazu entschlossen mich hier nun anzumelden und meine Fehlermeldung zu erläutern.

Ich habe einen piezoelektrischen Beschleunigungssensor der alle drei Messachsen (x-y- und z-Achse) misst. Zusätzlich verwende ich noch ein Mikrofon.

Mein MATLAB-Code mit den Parametern sieht wie folgt aus:

Code:

% Rechendaten
% -----------
xa = x/1.011;% Umrechnungsfaktor lt. Kalibrierzertifikat (1,011 mV/(m/s^2))
ya = y/1.006;% Umrechnungsfaktor lt. Kalibrierzertifikat (1,006 mV/(m/s^2))
za = z/0.988;% Umrechnungsfaktor lt. Kalibrierzertifikat (0,988 mV/(m/s^2))
micp = mic/50.2;% Umrechnungsfaktor lt. Kalibrierzertifikat (50,2 mV/Pa)

% Parameter
% ---------
fs = 50000;% Anzahl Messpunkte pro Sekunde (Abtastfrequenz 50.000 Hz)
n = length(x);% Anzahl der gesamten Messpunkte (Signallänge)
nfft = 16384;% Sampels für die Frequenzauflösung, (n = 2^12)
fn = fs/2;% Nyquist-Frequenz
t = (0:n-1)/fs;% Messzeit
dt = 1/fs;% Zeitschritt
df = fs/nfft;% Frequenzauflösung
x_fn = 0 : df : fn-df;% Nyquist-Frequenzvektor
x_fs = 0 : df : fs-df;% Abtast-Frequenzvektor
 


Danach möchte ich gerne eine FFT-Analyse machen. Da es sich hierbei um eine 10 sekündige Messung handelt, habe ich eine Signallänge von insgesamt 500.000 Werten. Daher muss ich die Fensterfunktion in eine Schleife packen, damit mein Rechner nicht überlastet wird. Da es sich um drei Achsen handelt, muss dies ebenfalls drei mal gemacht werden. Ich hab es so realisiert:

Code:

%% Fensterfunktion
% ----------------
% Anzahl der Segmente bestimmen
k_x = round(n/nfft);% k Segmente der Länge nfft transformieren
H_x = zeros(nfft,1);% Zeropadding, fehlende Daten werden mit Nullen aufgefüllt
Hpos0_x = zeros(nfft,k_x);
m = 1;
win = hann(nfft);
for i=1:k_x
    % Fensterung mit Hann
    x_win = xa(m:nfft+m-1).*win;
    H_x = fft(x_win, nfft);
    % Betrag bilden und positiven Frequenzbereich speichern
    H_pos0_x(1:(nfft/2)+1,i) = abs(H_x(1:(nfft/2)+1));
    % nächstes Segment
    m = m + nfft;
end

k_y = round(n/nfft);% k Segmente der Länge nfft transformieren
H_y = zeros(nfft,1);% Zeropadding, fehlende Daten werden mit Nullen aufgefüllt
Hpos0_y = zeros(nfft,k_y);
m = 1;
win_y = hann(nfft);
for i_y=1:k_y
    % Fensterung mit Hann
    y_win = ya(m:nfft+m-1).*win_y;% Multiplikation von Signal und Fenster
    H_y = fft(y_win, nfft);
    % Betrag bilden und positiven Frequenzbereich speichern
    H_pos0_y(1:(nfft/2)+1,i_y) = abs(H_y(1:(nfft/2)+1));
    % nächstes Segment
    m = m + nfft;
end

k_z = round(n/nfft);% k Segmente der Länge nfft transformieren
H_z = zeros(nfft,1);% Zeropadding, fehlende Daten werden mit Nullen aufgefüllt
Hpos0_z = zeros(nfft,k_z);
m = 1;
win_z = hann(nfft);
for i_z=1:k_z
    % Fensterung mit Hann
    z_win = za(m:nfft+m-1).*win_z;% Multiplikation von Signal und Fenster
    H_z = fft(z_win, nfft);
    % Betrag bilden und positiven Frequenzbereich speichern
    H_pos0_z(1:(nfft/2)+1,i_z) = abs(H_z(1:(nfft/2)+1));
    % nächstes Segment
    m = m + nfft;
end
 


Bei x_win beginnt dann der Fehler mit:

Code:

Index exceeds the number of array elements (500000).

Error in pcb_1 (line 173)
    x_win = xa(m:nfft+m-1).*win;
 


Anschließend wollte ich die Signale (Spektrum) plotten

Code:

%% Bildbereich/Frequenzbereich/FFT
% --------------------------------
X = fft(x_win, nfft);% FFT mit Fensterfunktion
Xabs = abs(X);% Absolutzahlen
Xfin = fftshift(Xabs/nfft);% Verschiebung der Null-Frequenz-Komponente
                        % zur Mitte des Spektrums
Y = fft(y_win, nfft);% FFT mit Fensterfunktion
Yabs = abs(Y);% Absolutzahlen
Yfin = fftshift(Yabs/nfft);% Verschiebung der Null-Frequenz-Komponente
                        % zur Mitte des Spektrums
Z = fft(z_win, nfft);% FFT mit Fensterfunktion
Zabs = abs(Z);% Absolutzahlen
Zfin = fftshift(Zabs/nfft);% Verschiebung der Null-Frequenz-Komponente
                        % zur Mitte des Spektrums

% Achsenskalierung
% ----------------
FTsignalx = fft(xa - mean(xa))/length(xa);
[maxpeakx] = max(abs(FTsignalx)*2);
FTsignaly = fft(ya - mean(ya))/length(ya);
[maxpeaky] = max(abs(FTsignaly)*2);
FTsignalz = fft(za - mean(za))/length(za);
[maxpeakz] = max(abs(FTsignalz)*2);

if (maxpeakx >= maxpeaky)
    maxpeak = maxpeakx;
elseif (maxpeaky >= maxpeakz)
    maxpeak = maxpeaky;
else
    maxpeak = maxpeakz;
end

% Graphische Darstellungen
% ------------------------
% Ausgabe in m/s^2
% ----------------
subplot(3,1,2);% Bild mit drei Einzelbildern (mittleres Bild)
plot(x_fs-fn, Xfin, 'b');%
hold on;% in gleiches Bild plotten
plot(x_fs-fn, Yfin, 'r');%
plot(x_fs-fn, Zfin, 'g');%
axis([0 fn 0 (maxpeak+0.01)]);% Skalierung der x- und y-Achse
title(['Frequenzbereich (Auflösung: ',num2str(df),' Hz)']);% Titel
xlabel('Frequenz in Hz');% Beschriftung x-Achse
ylabel('Amplitude in m/s^2');% Beschriftung y-Achse
legend('x-Achse','y-Achse','z-Achse');% Legende
grid on;% Gitternetzlinie
hold off;% nicht mehr in gleiches Bild plotten

% Ausgabe in dB
% -------------
subplot(3,1,3);% Bild mit drei Einzelbildern (unteres Bild)
plot(x_fs-fn, mag2db(Xfin + eps),'b');% mag2db = 20*log10(x), eps = kleine Konstante zur Vermeidung von log10(0)
hold on;% in gleiches Bild plotten
plot(x_fs-fn, mag2db(Yfin + eps),'r');% mag2db = 20*log10(y), eps = kleine Konstante zur Vermeidung von log10(0)
plot(x_fs-fn, mag2db(Zfin + eps),'g');% mag2db = 20*log10(z), eps = kleine Konstante zur Vermeidung von log10(0)
axis([0 fn -100 20*log10(maxpeak/2)+3]);% Skalierung der x- und y-Achse
title(['Frequenzbereich (Auflösung: ',num2str(df),' Hz)']);% Titel
xlabel('Frequenz in Hz');% Beschriftung x-Achse
ylabel('Amplitude in dB');% Beschriftung y-Achse
legend('x-Achse','y-Achse','z-Achse');% Legende
grid on;% Gitternetzlinie
hold off;% nicht mehr in gleiches Bild plotten
 


Ich hoffe doch sehr, dass sich hier irgendwo ein schlaues Köpfchen befindet, der mir hier weiter helfen kann.

Wenn ihr zur Lösung mehr Informationen benötigt, einfach Fragen. Ich bin für jede kreative Antwort dankbar.

Vorab vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.06.2020, 22:03     Titel:
  Antworten mit Zitat      
Hallo,

schau dir die Länge von xa an und nfft+m-1. Das sollte das Problem sein.
Vielleicht wird m zu oft erhöht. Statt
Code:
k_x = round(n/nfft)

würde ich eher
Code:
k_x = floor(n/nfft)

wählen, damit es nicht zu viele Iterationen werden, falls die Division nicht aufgeht.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
raupid1
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 04.06.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 06.06.2020, 11:51     Titel:
  Antworten mit Zitat      
Hallo Harald,

es scheint wohl so, dass du mein schlaues Köpfchen bist Smile

Vielen Dank für die Information, nach der Änderung von
Code:
zu
Code:
lief das Programm ohne Probleme Cool

Dankeschön

Mit freundlichen Grüßen

raupid1
Private Nachricht senden Benutzer-Profile anzeigen
 
raupid1
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 04.06.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 15.06.2020, 18:37     Titel:
  Antworten mit Zitat      
Hallo liebe fleißige Community,
lieber Harald,

heute habe ich den ganzen Tag versucht, die Daten richtig zu plotten. Bin jedoch auf keinen grünen Zweig gekommen. Mein Problem ist nämlich, dass so wie ich es bisher im Code verwendet habe, nur einmal 16384x1 geplottet (stem) wird und nicht 30mal (16384x30).

Kann mir hier jemand eine Hilfestellung geben, denn ich weiß nicht, wie ich die Schleife in den plot einbeziehen kann.

Vorab Vielen Dank für Eure Hilfe

Gruß

raupid1
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.06.2020, 22:03     Titel:
  Antworten mit Zitat      
Hallo,

der Code ist leider recht unübersichtlich, insbesondere weiß man nicht, wie die Codeschnipsel zusammenhängen. Vor allem aber nutzt du stem doch nirgends? So ist mir leider nicht klar, wie man dir helfen kann.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
raupid1
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 04.06.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 16.06.2020, 11:20     Titel:
  Antworten mit Zitat      
Hallo Harald,

da hast du natürlich recht. Ich hab noch den alten plot Befehl hier im Forum gehabt. Inzwischen habe ich den Befehl stem verwendet, da er sich für die graphische Darstellung des Spektrums besser eignet.

Ich habe jetzt exemplarisch mal jeweils eine Messdatei sowie mein Matlab-Programm angehängt.

Ich nehme mit einem Schalldruckpegelmessgerät 10 Sekunden auf und bekomme mit der dazugehörigen Software eine Spektrum. Über die 10 Sekunden Messzeit wird ein Gesamtsummenpegel (LZeq) in dB gemittelt. Mit dem Gesamtsummenpegel soll ermittelt werden, ob eine störende Frequenz bei bestimmten Betriebszuständen eines bspw. Lüfters mit einem defekten (manipulierten) Lüfters entstehen.

Fast Gleichzeitig läuft die Messung über einen Triaxialen Beschleunigungssensor sowie einem externen Mikrofon (Mikrofon soll zur Kontrolle der Messdaten dienen) statt. Diese Messdaten werden mit einem Oszilloskop aufgenommen und später in .mat Dateien umgewandelt. Diese Messungen laufen ebenfalls für 10 Sekunden. Hierbei hab ich eine Abtastfrequenz von 50 kHz eingestellt, damit ich im interessierendem Hörbereich (20 Hz bis 20 kHz) agieren kann.

Mir wurde Empfohlen eine FFT mit einem Hann Fenster zu machen mit einer Auflösung von ca. 3 Hz. Somit habe ich ein nfft von 2^14 (16384), da sonst eine dft durchgeführt werden würde. Hiermit erhalte ich eine Auflösung von 3,05... Hz und sollte ausreichend sein.

Für die 10 Sekunden Messzeit habe ich eine gesamte Samplezahl von 500000. 500000/16384 = 30,51... also ca. 30 Durchläufe. Ich möchte gerne diese 30 Durchläufe mitteln und graphisch plotten, damit ich dieses Spektrum mit dem Spektrum des Schalldruckpegelmessgerätes vergleichen kann. Die 10 Sekunden Messzeit und die Mittelung der Daten ist denke ich vorteilhaft, damit alle aufkommenden Geräusche aufgenommen werden können bei einem bestimmten Betriebszustand des Lüfters.

Harald, ich habe gesehen, dass du dich sehr gut mit diesem Thema auskennst. Was sagst du denn allgemein dazu? Sollte ich die 30 Durchläufe mitteln und dann plotten oder ist es ausreichend eben nur einen Durchgang zu plotten?

pcb_I_Luefter_PWM100_hochlauf.m
 Beschreibung:
Matlab Programm

Download
 Dateiname:  pcb_I_Luefter_PWM100_hochlauf.m
 Dateigröße:  24 KB
 Heruntergeladen:  231 mal
I_PWM100_Speed5720_hochlauf_01.mat
 Beschreibung:
Messdaten Triaxial-Sensor und Mikrofon des standard Lüfters. Es sind jedoch weitere 9.mat Dateien vorhanden, deswegen werden alle 10 Daten im Matlab Programm eingelesen.

Download
 Dateiname:  I_PWM100_Speed5720_hochlauf_01.mat
 Dateigröße:  781.59 KB
 Heruntergeladen:  244 mal
I_M_PWM100_Speed5830_hochlauf_01.mat
 Beschreibung:
Messdaten Triaxial-Sensor und Mikrofon des defekten (manipulierten) Lüfters. Es sind jedoch weitere 9.mat Dateien vorhanden, deswegen werden alle 10 Daten im Matlab Programm eingelesen.

Download
 Dateiname:  I_M_PWM100_Speed5830_hochlauf_01.mat
 Dateigröße:  781.59 KB
 Heruntergeladen:  242 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.06.2020, 11:43     Titel:
  Antworten mit Zitat      
Hallo,

bitte helfe mir, dir zu helfen. ;)
Das sind jetzt gute 500 Zeilen Code, die ich nicht ausführen kann, weil mir ein Großteil der Dateien fehlt. Mal ganz davon abgesehen, dass du Pfade hart kodiert hast.

Zitat:
Harald, ich habe gesehen, dass du dich sehr gut mit diesem Thema auskennst.

Mit Signalverarbeitung kenne ich mich eher wenig aus. Da sich im Forum nur wenige "Fragenbeantworter" aufhalten, versuche ich da auch nach Möglichkeit zu helfen.

Zitat:
Sollte ich die 30 Durchläufe mitteln und dann plotten oder ist es ausreichend eben nur einen Durchgang zu plotten?

Das musst letztlich du aus der Anwendung heraus entscheiden.
Für mich ist beides begrenzt aussagekräftig. Was ich mir z.B. vorstellen kann ist neben dem Mittelwert auch Minimum und Maximum oder Quantile zu plotten, um eine Vorstellung von der Streuung der Messungen zu bekommen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
raupid1
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 04.06.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 16.06.2020, 14:47     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich kenne mich mit Matlab nicht so gut aus und wusste nicht besser, wie ich den ganzen Code hätte etwas luftiger gestallten können, damit er nicht so hart kodiert ist. Hätte gerne die Daten in einer Art Schleife eingelesen aber das hab ich nicht hin bekommen. Ist für jetzt auch egal Wink

Zitat:
Das sind jetzt gute 500 Zeilen Code, die ich nicht ausführen kann, weil mir ein Großteil der Dateien fehlt. Mal ganz davon abgesehen, dass du Pfade hart kodiert hast.


-> Ja ich wollte nicht alle 20 Messdaten hochladen, aber wenn es dich interessiert, kann ich das gerne noch machen. Ich weiß halt nur nicht, wie viel MB ich hier hochladen kann, möchte das Forum nicht zumüllen.

Vielen Dank Harald, mit dem Hinweis der Quantile Smile . Dem werde ich mal nachgehen. Ich hab nochmals bezüglich der FFT recherchiert und eine interessante und verständliche (zumindest in meinen Augen) Homepage gefunden.

So wie ich das hieraus verstanden habe, reicht meine Abtastfrequenz von 50 kHz aus, da ich nach dem Abtasttheorem (Nyquist-Frequenz 25 kHz) mit dieser Abtastfrequenz eine vernünftige Anzahl (>2) habe, um das Signal verlustfrei zu rekonstruieren.

Ich mach mich jetzt an das Werk und versuch mich an bspw. der Mittelwertbildung usw. von den Signalen.

Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.06.2020, 14:54     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Hätte gerne die Daten in einer Art Schleife eingelesen aber das hab ich nicht hin bekommen.

Das wäre jetzt eine Frage, bei der man ggf. recht gut unterstützen kann.

Zitat:
Ja ich wollte nicht alle 20 Messdaten hochladen, aber wenn es dich interessiert, kann ich das gerne noch machen. Ich weiß halt nur nicht, wie viel MB ich hier hochladen kann, möchte das Forum nicht zumüllen.

Ich würde eher den umgekehrten Weg gehen: den Code vorübergehend so anpassen, dass er mit einer Datei funktioniert.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
raupid1
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 04.06.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 16.06.2020, 15:22     Titel:
  Antworten mit Zitat      
Hallo,

das mit der Dateneinleserei hat wahrscheinlich nicht funktioniert, da ich die Messdaten nicht in dem Ordner gespeichert habe, indem auch der Matlab-Code gespeichert wird.

-> bin aber für jede Hilfe diesbezüglich dankbar, denn es ist sehr mühsam die ganzen Pfade manuell zu kopieren und einzufügen. Eine Verschiebung der Messdaten oder ähnliches ist machbar.

Ich hab jetzt mal noch eine Testversion hochgeladen, die mit den zwei hochgeladenen Messdaten funktionieren sollte.

Wie im Workspace zu erkennen gibt es 3 Segmente für die FFT (16384x3 bzw. 8192x3). Der plot (stem) der Frequenzspektrums ist lediglich bei 16384x1, daher wird das Spektrum nur einmal anstatt dreimal geplottet.
Jedoch versuche ich mich gerade daran, in dieser verkürzten Version, den Mittelwert der drei Spektren zu bekommen und diesen dann zu plotten. Denn ich habe mich dazu entschieden, den Mittelwert zu verwenden, da mit großer Sicherheit bei jedem einzelnen der drei Spektren etwas anderes raus kommt.

Hast du Harald mir hierfür eine kleine Hilfestellung? Ich weis nämlich nicht, wie ich auf die anderen beiden Spektren kommen kann um überhaupt mit einer Mittelwertsberechnung anzufangen und zu plotten.

Vielen Dank

Gruß

raupid

Gomatlab_Testversion.m
 Beschreibung:
Testversion, die mit einer bzw. den beiden Messdaten funktioniert

Download
 Dateiname:  Gomatlab_Testversion.m
 Dateigröße:  17.83 KB
 Heruntergeladen:  245 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.06.2020, 16:45     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
das mit der Dateneinleserei hat wahrscheinlich nicht funktioniert, da ich die Messdaten nicht in dem Ordner gespeichert habe, indem auch der Matlab-Code gespeichert wird.

Das sollte kein Problem sein. Bei dir kannst du ein Verzeichnis mit angeben.

Zitat:
Ich hab jetzt mal noch eine Testversion hochgeladen, die mit den zwei hochgeladenen Messdaten funktionieren sollte.

Jep, läuft.

Zitat:
Wie im Workspace zu erkennen gibt es 3 Segmente für die FFT (16384x3 bzw. 8192x3).

Du erzeugst viele Variablen mit diesen Dimensionen. Um welche geht es denn?

Zitat:
Jedoch versuche ich mich gerade daran, in dieser verkürzten Version, den Mittelwert der drei Spektren zu bekommen und diesen dann zu plotten.

Du willst also den zeilenweisen Mittelwert einer Matrix mit 3 Spalten? Das wäre
Code:


Generell: je kleiner und kompakter das Beispiel, desto leichter ist es, die Frage zu verstehen. Wenn wie bei dir über 100 Variablen und 6 Plots erzeugt werden, muss man ja erst mal herausfinden, worum es überhaupt geht.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
raupid1
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 04.06.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 25.06.2020, 17:14     Titel:
  Antworten mit Zitat      
Hey,

ich hab es mit einer anderen Vorgehensweise gelöst.


Mit diesem Code, kann jedes einzelne Signal mit der Blocklänge nfft ausgegeben werden:

Code:

%% Fensterfunktion Hann
% ---------------------
windowHanning = window(@hann,nfft);% erzeugt einen Hanning Window Vektor mit der Größe/Länge von nfft

% x-Achse - standard Lüfter
% -------------------------
xb = buffer(xa,nfft);% Unterteilung der Signals xa in Blöcke der Größe/Länge von nfft

nan_xb = find(isnan(xb));% sucht im Signal xb nach NaN
inf_xb = find(isinf(xb));% sucht im Signal xb nach +/- inf

xb(isnan(xb)) = 0;% ersetzt alle NaN mit der Zahl Null
xb(isinf(xb)) = 0;% ersetzt alle +/- inf mit der Zahl Null

nan_xb_neu = find(isnan(xb));% Kontrolle
inf_xb_neu = find(isinf(xb));% Kontrolle

xb_win = xb.*repmat(windowHanning,1,size(xb,2));% Fensterung der einzelnen Blöcke
 


Im Anschluss die FFT durchführen und bei Bedarf noch mitteln, so wie es bei mir notwendig war:

Code:

%% Beschleunigungssensor - Darstellung im Bildbereich
% ---------------------------------------------------
% x-Achse - standard Lüfter
% -------------------------
X = fft(xb_win, nfft);% FFT mit Fensterfunktion Signal xa
Xabs = abs(X);% Absolutzahlen von xa
Xfin = fftshift(Xabs/nfft);% Verschiebung der Null-Frequenz-Komponente zur Mitte des Spektrums

Xfin_mean = mean(Xfin,2);
 


Gruß

raupid1
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.