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

Fensterung

 

Karolinchen
Forum-Anfänger

Forum-Anfänger


Beiträge: 45
Anmeldedatum: 08.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2015, 09:06     Titel: Fensterung
  Antworten mit Zitat      
Hallo,

Ich habe aus meinen ganzen Daten nun endlich eine FFT (Absolutwerte, logarithmisch) drüberlaufen lassen (siehe angehängte Dateien). In dieser Darstellung lässt sich auch der erhoffte Peak bei 4 Hz. erkennen, was auch die Erwartung war. Also der Erreger hat mit 4 Hz. erregt und im Boden ist das so auch angekommen.
Nun dachte ich mir es macht Evtl Sinn das Signal vor der FFT zu fenstern. Kann mir da jemand helfen was die Fensterung angeht? Ehrlich gesagt kenne ich mich damit gar nicht aus... :-/
Ich weiß, dass dadurch die Werte am Anfang und Ende auf Null gesetzt werden und dazwischen steigt die Funktion an und fällt wieder ab. Aber wie gehe ich da vor? Was muss ich ändern? Ist es hilfreich ein Hann-Fenster zu nutzen?!

ax_15_28.png
 Beschreibung:

Download
 Dateiname:  ax_15_28.png
 Dateigröße:  69.96 KB
 Heruntergeladen:  453 mal
ax_5_28.png
 Beschreibung:

Download
 Dateiname:  ax_5_28.png
 Dateigröße:  54.41 KB
 Heruntergeladen:  471 mal
ax_1_28.png
 Beschreibung:

Download
 Dateiname:  ax_1_28.png
 Dateigröße:  51.76 KB
 Heruntergeladen:  456 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: 17.09.2015, 16:37     Titel:
  Antworten mit Zitat      
Hallo,

ich habe dir doch in diesem Thread bereits eine Funktion zur Erstellung des Amplitudenspektrums als m-file gepostet. Diese Funktion kann auch eine Fensterung mit Hanning durchführen, so fern man den 3. Inputparameter auf 1 setzt. Also...

Code:
[mag, mag_dB, fv] = FFT_betragsspektrum( signal, nfft, Fs, 1, 0) ; % Funktionsaufruf


bzw in der Funtkion selbst, lässt sich der Code nachlesen Wink

Code:

% Fensterung
if window == 1
    win = hann(nfft); % Hanning Fensterfunktion
    sig_win = sig .* win * nfft / sum(win); % Fensterung mit Amplitudenkorrektur
    sig = sig_win;
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Karolinchen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 45
Anmeldedatum: 08.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2015, 10:42     Titel:
  Antworten mit Zitat      
Ja danke. Ich hatte es dann auch gefunden und so gemacht Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Karolinchen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 45
Anmeldedatum: 08.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2015, 14:26     Titel:
  Antworten mit Zitat      
Hab jetzt trotzdem nochmal ein Problem.Und zwar habe ich mir das automatisiert, also so dass ich für meine verschiedenen Sensoren (16) und die verschiedenen Erregerstufen (2Cool meine FFT durchläuft. Und er mir dann die Bilder abspeichert.
Jetzt würde ich jedoch gerne immer 3 miteinander vergleichen. Kann ich darunter einen subplot reinbauen? Ich kriege das nicht wirklich hin.. :-/ Kann mir evtl jmd helfen? Tipp geben oder nen Link?!

Code:
close all
clear all
clc

scrsz = get(0,'ScreenSize');

plist={'D:\WesterMeerWind\Matlab\Forum'};

lenplist=length(plist);
for np=1:lenplist;% Bearbeitungsschleife über mehrere Unterordner??
pfad=plist{np};
cd (pfad);
list=dir(strcat(pfad, '\','*.mat'));% schreibt alle uff Dateien in eine Liste

fname={list.name};
N=length(list);% Anzahl von Dateinamen

for NR=1:N;% Bearbeitungsschleife über alle Dateien
A=fname{NR};
dat=strrep(A,'.mat', '');
load (A);
str = ['xx = ',dat,';'];
evalin('base',str);


% newfolder=['Auswertung ' num2str(dat)];
% f1=fullfile(pfad,newfolder);
% if (exist(f1) == 0)
%    mkdir (f1);
% end
% Zeit ermitteln

LL=length(xx);            


fs=1000;
ts=1/fs;
t=(0:LL-1)*ts;


% -------------------------------------------------------------------------
% FFT berechnen Einzelsignal
%1.Spalte gekürzt
%NFFT = 2^nextpow2(LL); % Next power of 2 from length of y
%Y = fft(xx,NFFT)/LL;    
%fff = fs/2*linspace(0,1,NFFT/2+1);
%ampl = 2*abs(Y(1:NFFT/2+1));

%y=xx;
%FS=1000;
%L=length(y);
%fft_tmp=fft(y); %fft-Ergebnis ist ein Array aus komplexen Zahlen, wobei der Realteil die Amplitude und der Imaginärteil die Phase darstellt
%fft_ampl=2*abs(fft_tmp(1:L/2+1))/L; %Phase interessiert nicht und komplexe Zahlen lassen sich schwer darstellen, deswegen wird der Absolutwert(Realteil) bestimmt und dann noch normiert
%fff=linspace(0,FS/2,L/2+1);
%semilogx(fff,fft_ampl);

y=xx;
Fs = 1000; % Abtastfrequenz in Hz
nfft = length(y); % Anzahl Messwerte

[mag, mag_dB, fv] = FFT_betragsspektrum( y, nfft, Fs, 1, 0) ; % Funktionsaufruf

% Plot3
fig=figure('Position',[1 1 scrsz(3) scrsz(4)],'Name',pfad,'NumberTitle','off');
plot(fv,mag,'b');title(['Amplitudenspektrum',num2str(dat)],'Interpreter','none');xlabel('Frequency [Hz]', 'Fontsize', 10);ylabel('Amplitude', 'Fontsize', 10);
xlim([0 20]);
ylim([0 1]);
grid on;

saveas(fig,[num2str(dat),'.emf']);

close
end
end
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.09.2015, 08:31     Titel:
  Antworten mit Zitat      
Hallo,

du könntest z.B. mit einer Schleife arbeiten, die immer von 3 Signalen das Spektrum erstellt und dann plottet

Code:

clear
Fs = 1000; % Abtastfrequenz in Hz
T = 1/Fs;             % Sampling period
L = 1000;             % Length of signal
t = (0:L-1)*T;        % Time vector

% Testsignals
signal_1 = 1*sin(2*pi*4*t);
signal_2 = 2*sin(2*pi*5*t);
signal_3 = 3*sin(2*pi*6*t);

y(1,:) = signal_1;
y(2,:) = signal_2;
y(3,:) = signal_3;

for i=1:3
    nfft = length(y(i,:)); % Anzahl Messwerte
    [mag, mag_dB, fv] = FFT_betragsspektrum( y(i,:), nfft, Fs, 1, 0) ; % Funktionsaufruf

    % Plot3
    subplot(3,1,i)
    %fig=figure('Position',[1 1 scrsz(3) scrsz(4)],'Name',pfad,'NumberTitle','off');
    plot(fv,mag,'b');
    %title(['Amplitudenspektrum',num2str(dat)],'Interpreter','none');xlabel('Frequency [Hz]', 'Fontsize', 10);ylabel('Amplitude', 'Fontsize', 10);
    %xlim([0 20]);
    %ylim([0 1]);
    grid on;
end
 


Wolltest du aber nicht ein gemitteltes Signal aus deinen ganzen Messungen erstellen um dort dann besser Auffälligkeiten zu finden?
Private Nachricht senden Benutzer-Profile anzeigen
 
Karolinchen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 45
Anmeldedatum: 08.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2015, 08:40     Titel:
  Antworten mit Zitat      
Danke erstmal, ich probiere das gleich mal aus.

Und ja das wollte ich. Aaaaaber mir wurde vor einiger Zeit gesagt, dass es wichtig ist die kleinen Sequenzen zunächst auszuschneiden und dort den Peak, der erwartet wird rauszusuchen mittels einer FFT.
Es wurde ja mit kleinen Frequenzen angeregt. Also es wurde in 28 Schritten von 1 Hz auf 4 Hz erregt. Und die erwarten und hoffen, dass sich diese Peaks auch im Boden wiederfinden und vielleicht sogar ein gewisses Muster (linear/nichtlinear) wiederfindet. Deswegen bin ich derzeit dabei alle Zeitsequenzen rauszuschneiden und jeweils eine FFT darüber laufen zu lassen. Und jetzt würde ich einfach gerne einige miteinander vergleichen und sehen ob da so schon mal etwas zu erkennen ist....
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.09.2015, 09:00     Titel:
  Antworten mit Zitat      
Wäre es dann aber nicht sinnvoller die Spektren in einen plot zu legen und jeder Messung eine andere Farbe zu geben? So in etwa...

Code:

clear
Fs = 1000; % Abtastfrequenz in Hz
T = 1/Fs;             % Sampling period
L = 1000;             % Length of signal
t = (0:L-1)*T;        % Time vector
signal_1 = 1*sin(2*pi*4*t);
signal_2 = 2*sin(2*pi*5*t);
signal_3 = 3*sin(2*pi*6*t);

y(1,:) = signal_1;
y(2,:) = signal_2;
y(3,:) = signal_3;

% preallocate
mag = zeros(L/2+1,3);
mag_dB = mag;
fv = mag;

for i=1:3
    nfft = length(y(i,:)); % Anzahl Messwerte
    [mag(:,i), mag_dB(:,i), fv(:,i)] = FFT_betragsspektrum( y(i,:), nfft, Fs, 1, 0) ; % Funktionsaufruf  
end

plot(fv,mag);
xlabel('Frequenz in Hz')
ylabel('Magnitude')
legend('Signal 1', 'Signal 2', 'Signal 3')
grid on;
colormap(lines);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Karolinchen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 45
Anmeldedatum: 08.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2015, 09:07     Titel:
  Antworten mit Zitat      
Ja stimmt ist vielleicht sogar besser.... Danke Smile

Das erste Skript hat auch schon geklappt gerade.... Leider sind halt manche Sensoren hin und zeigen nicht das Erwünschte. Aber jedenfalls danke für deine Tipps Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Karolinchen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 45
Anmeldedatum: 08.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2015, 09:32     Titel:
  Antworten mit Zitat      
Nur leider funktioniert das zweite skript nicht so wie ich will :-/
Ich bekomme folgende Fehlermeldung:

Subscripted assignment dimension mismatch.

Weißt du woran das liegen kann?!
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.09.2015, 09:49     Titel:
  Antworten mit Zitat      
Ehrlich gesagt, nein. Bei mir funktioniert der Code. Steht bei dir in der ersten Zeile auch das clear , so dass das Workspace vor dem Ausführen gelöscht wird? Auf welche Codezeile bezieht sich denn die Fehlermeldung? So etwas bitte immer möglichst genau angeben Wink

Evtl. legst du deinen Daten nicht als Zeilenvektor wie hier an
Code:
y(1,:) = signal_1;
sondern als Spaltenvektor wenn du deine eigenen Daten nutzt. Oder nutzt du mein Testsignal?
Private Nachricht senden Benutzer-Profile anzeigen
 
Karolinchen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 45
Anmeldedatum: 08.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2015, 12:30     Titel:
  Antworten mit Zitat      
Aber ich muss doch in meinem Workspace zumindest die Signale haben oder nicht? Also die drei sensoren mit den jeweiligen Messwerten.
Deswegen habe ich das clear rausgenommen. Sonst habe ich nichts verändert....
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.09.2015, 12:41     Titel:
  Antworten mit Zitat      
Also entweder du testest den Code wie oben mit dem Testsignal oder du musst eben deine Signale entsprechend umwandeln. Der Fehler kommt bestimmt daher, dass y ein Spalten und kein Zahlenvektor ist, wie in meinem Bsp.


Also entweder änderst du den Code...siehe y(i)

Code:

nfft = length(y(:,i)); % Anzahl Messwerte
    [mag(:,i), mag_dB(:,i), fv(:,i)] = FFT_betragsspektrum( y(:,i), nfft, Fs, 1, 0) ; % Funktionsaufruf
 


oder du wandelst dein Signal vor der Schleife entsprechend um.

Code:

y = 1:100;
y = y(:) % erzeugt aus Zeilenvektor einen Spaltenvektor


Und bitte gib in Zunkunft deine genaue Fehlermeldung an und was du an gegebenen Codebsp. selbst geändert hast. So hätte ich mir schon einige Fragen sparen können Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Karolinchen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 45
Anmeldedatum: 08.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2015, 12:52     Titel:
  Antworten mit Zitat      
Es tut mir leid für die Umstände :-/ War nicht meine Absicht... Bin halt echt etwas unwissend und noch nicht so lange mit Matlab und dem Forum beschäftigt. Ich merke mir das Smile

Ich probiere gleich mal rum...
Private Nachricht senden Benutzer-Profile anzeigen
 
Karolinchen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 45
Anmeldedatum: 08.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.09.2015, 16:47     Titel:
  Antworten mit Zitat      
Also bis jetzt hat alles soweit ganz gut geklappt. Zumindest für eine Zeitsequenz von mir Soeben wollte ich eine andere Sequenz beginnen und mit der Spektren-Funktion von dir meine Plots erstellen.
Code:
%% az
clear
load az_6_18
load az_7_18
load az_16_18


Fs = 1000; % Abtastfrequenz in Hz
T = 1/Fs;             % Sampling period
L = 1000;             % Length of signal
t = (0:L-1)*T;        % Time vector

% Testsignals
signal_1 = az_6_18;
signal_2 = az_7_18;
signal_3 = az_16_18;

y(1,:) = signal_1;
y(2,:) = signal_2;
y(3,:) = signal_3;

titel_array = {'Spectrum az 6','Spectrum az 7','Spectrum az 16'}
   
for i=1:3
    nfft = length(y(i,:)); % Anzahl Messwerte
    [mag, mag_dB, fv] = FFT_betragsspektrum( y(i,:), nfft, Fs, 1, 0) ; % Funktionsaufruf

    figure=gcf;
    subplot(3,1,i)
    plot(fv,mag,'b');
    suptitle('Amplitude spectrum for az, z = 6,0 m, load level 18');
    title(titel_array{i},'Interpreter','none');
    xlabel('Frequency [Hz]', 'Fontsize', 8);ylabel('Amplitude', 'Fontsize', 8);
    xlim([0 20]);
    ylim([0 0.45]);
    grid on;
   
end

saveas(gcf,'Amplitude spectrum for az z 6 m load level 28','fig')



und in dem Bereich
Code:
for i=1:3
    nfft = length(y(i,:)); % Anzahl Messwerte
    [mag, mag_dB, fv] = FFT_betragsspektrum( y(i,:), nfft, Fs, 1, 0) ; % Funktionsaufruf

    figure=gcf;
    subplot(3,1,i)
    plot(fv,mag,'b');
    suptitle('Amplitude spectrum for az, z = 6,0 m, load level 18');
    title(titel_array{i},'Interpreter','none');
    xlabel('Frequency [Hz]', 'Fontsize', 8);ylabel('Amplitude', 'Fontsize', 8);
    xlim([0 20]);
    ylim([0 0.45]);
    grid on;
   
end


Kam die folgende Fehlermeldung in Bezug auf das Funktionsskript was ich auf folgend reinstelle:

Error using .*
Matrix dimensions must agree.

Error in FFT_betragsspektrum (line 32)
sig_win = sig .* win * nfft / sum(win); % Fensterung mit Amplitudenkorrektur

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: 1 =  Fensterung mit Hanning 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)
 


Versteh das irgendwie nicht so ganz.. Kann mir da evtl jmd helfen?!
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: 24.09.2015, 17:18     Titel:
  Antworten mit Zitat      
Ohne die Daten ist das schwer nachvollziehbar. Welche Dimensionen haben die Arrays mit den Messwerten?

Arbeite am besten mit dem Debugger. Setze einen Breakpoint genau in die Zeile, wo der Fehler ist und schaue dir dann beim angehaltenen Programm die Dimensionen von sig und win im workspace an. Es müssten jeweils Spalten- oder zwei Zeilenvektoren gleicher Länge sein, damit die elementweise Multiplikation sig .* win ausgeführt wird. Vermutlich liegt da der Fehler.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

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.