Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
Praktikant Toolentwicklung Matlab (m/w)
Branche: Beratung, Expertise, Fahrzeugtechnik, Fahrzeugteile, Technische Dienstleistungen
MBtech Group GmbH & Co. KGaA - Fellbach

Abschlussarbeit / Praktikum: Entwicklung Matlab (m/w)
Branche: Informationstechnologie, Elektrotechnik, Elektronik
GIGATRONIK Technologies GmbH - Ulm

Studentischer Mitarbeiter (m/w) - DevOps / Toolentwicklung
Branche: mehrere
IAV GmbH - Ingenieurgesellschaft Auto und Verkehr - Berlin

Praktikant (m/w) Bereich Konzernvorausentwicklung - Aktoren sicherheitsrelevanter Anwendungen
Branche: Fahrzeugtechnik, Fahrzeugteile, Maschinentechnik, Industrietechnik
MAHLE International GmbH - Stuttgart

Praktikum - Softwareentwicklung Java
Branche: mehrere
IAV GmbH - Ingenieurgesellschaft Auto und Verkehr - Dresden, Gifhorn

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Fensterfunktion - Hamming, Hann u. Blackman

 

DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.07.2011, 14:24     Titel: Fensterfunktion - Hamming, Hann u. Blackman
  Antworten mit Zitat      
Hallo zusammen,

wer nicht über die Signal Processing Toolbox verfügt, kann sich mit Hilfe dieser Funktion 3 verschiedene Fenstertypen beliebiger Länge erstellen.

Code:

function [output] = Fenster(window_size,window_typ) ;
% Input der Funktion:
% window_size = Fensterlänge
% window_typ = 0,1 oder 2

 N = window_size; % Fensterlänge
 output = zeros(N,1); % Init

if (window_typ ~= 0)&&(window_typ ~= 1)&&(window_typ ~= 2)
     disp('falsches Window ausgewählt: 0 = Hamming, 1 = Hann, 2 = Blackman');
else
     if mod(N,2)==0 % N gerade
         m = fix(N/2);
         n = m;
     else % N ungerade
         m = fix((N/2))+1;
         n = m-1;
     end
     
     window = zeros(m,1); % Init

     for i = 0:m
         if(window_typ == 0)
             window(i+1) = 0.54 - 0.46*cos(2*pi*i/(N-1));% Hamming Window
         elseif(window_typ == 1)
             window(i+1) = 0.50 - 0.50*cos(2*pi*i/(N-1));% Hann Window
         else
             window(i+1) = 0.42 - 0.50*cos(2*pi*i/(N-1))+ 0.08*cos(4*pi*i/(N-1));% Blackman Window
         end
     end
     % Ergebnisvektor
     output = [window(1:m); fliplr(window(1:n)')'];
end
 


Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 10.481
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.07.2011, 17:29     Titel: Re: Fensterfunktion - Hamming, Hann u. Blackman
  Antworten mit Zitat      
Hallo DSP,

Das ist sehr hilfreich, denn es gibt viele Nutzer, die die Signal Processing Toolbox nicht installiert haben.

Wie kann man diese Fenster nun ohne SPT anwenden?

Noch ein paar kleine Vereinfachungen:
Code:
function output = Fenster(window_size, window_type)
% Input der Funktion:
% window_size = Fensterlänge
% window_typ = 'Hamming', 'Hann', 'Blackman'

N = window_size; % Fensterlänge
output = zeros(N, 1); % Init
if mod(N, 2) == 0 % N gerade
   m = fix(N / 2);
   n = m;
else % N ungerade
   m = fix(N / 2)+1;
   n = m-1;
end
     
switch lower(window_type)
  case 'hamming'
     window = 0.54 - 0.46 * cos(2*pi*(0:m) / (N-1));
  case 'hann'
     window = 0.50 - 0.50 * cos(2*pi*(0:m) / (N-1));
  case 'blackman'
     window = 0.42 - 0.50 * cos(2*pi*(0:m) / (N-1)) +  ...
                  0.08 * cos(4*pi* (0:m) / (N-1));
  otherwise
     error(['Unknown window type: ', window_type]);
end

% Ergebnisvektor
output = transpose([window(1:m); window(n:-1:1)]);
 

Anmerkungen:
1. "fliplr(window(1:n)')'" ist so einfacher: "flipud(window(1:n))" oder "window(n:-1:1)".
2. Ich habe den Vektor aus der FOR-Schleife einfach in die Formel gezogen. Das sieht einfacher aus und ist schneller.
3. Ich habe statt 0, 1, 2 die Namen gewählt, weil man sich die leichter merken kann.
4. Alleine hätte ich das übrigens nicht schreiben können, weil ich von Signal-Processing keine Ahnung habe.

Vielen Dank, Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.07.2011, 17:53     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank!! Wo es dir an Wissen über Signalverarbeitung fehlt, fehlen mir die Kenntnisse über Matlab. Deine Fragen will ich auch noch gleich beantworten, da das ja dazu gehört.

Die Fensterung benutzt man z.B. um den Leakage-Effekt eines Frequenzspektrums zu minimieren, das mittels DFT/FFT erstellt wird. Eine weitere Anwendung wäre im Bereich digitaler Filterung, z.B. zur Erstellung eines Window-Sinc FIR Filter.

Code:

% Zur Fensterung des Frequenzspektrums
% N = Anzahl der Messwerte
% Signal(N) = das abgetastete Signal mit N Messwerten

% Fensterung erfolgt im Zeitbereich
window = Fenster(N,'Hann'); % erstellt ein Hann Fenster mit der Länge N
Signal_win = Signal .* window; % Multiplikation von Signal und Fenster
% Frequenzspektrum berechnen
Y = fft(Signal_win,N);
 


Gruß, DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.481
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.07.2011, 12:18     Titel:
  Antworten mit Zitat      
Hallo DSP,

Danke für das Auffinden des Bugs! In der letzten Zeile muss das Semicolon gegen ein Komma getauscht werden:
Code:
% WRONG: ... [window(1:m); window(n:-1:1)] ...
output = transpose([window(1:m), window(n:-1:1)]);

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 20.07.2011, 12:37     Titel:
  Antworten mit Zitat      
Noch als Ergänzung für die Fensterung des Zeitsignals...die Normierung für die Amplitude.

Code:

% Zur Fensterung des Frequenzspektrums
% N = Anzahl der Messwerte
% Signal(N) = das abgetastete Signal mit N Messwerten

% Fensterung erfolgt im Zeitbereich
 window = Fenster(N,'Hann'); % erstellt ein Hann Fenster mit der Länge N
% Multiplikation von Signal und Fenster  
 Signal_win = Signal .* window; % Fensterung ohne Amplitudenkorrektur
 Signal_win = Signal .* window * N / sum(window); % Fensterung mit Amplitudenkorrektur
% Frequenzspektrum berechnen
 Y = fft(Signal_win,N);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 24.07.2011, 19:29     Titel:
  Antworten mit Zitat      
Habe noch ein Blackman Harris Fenster hinzugefügt.

Code:

function output = Fenster(window_size, window_type)
% Input der Funktion:
% window_size = Fensterlänge
% window_typ = 'Hamming', 'Hann', 'Blackman', 'Blackman-Harris'

N = window_size; % Fensterlänge
output = zeros(N, 1); % Init
if mod(N, 2) == 0 % N gerade
    m = fix(N / 2);
    n = m;
else % N ungerade
    m = fix(N / 2)+1;
    n = m-1;
end
   
switch lower(window_type)
   case 'hamming'
      window = 0.54 - 0.46 * cos(2*pi*(0:m) / (N-1));
   case 'hann'
      window = 0.50 - 0.50 * cos(2*pi*(0:m) / (N-1));
   case 'blackman'
      window = 0.42 - 0.50 * cos(2*pi*(0:m) / (N-1)) +  ...
                   0.08 * cos(4*pi* (0:m) / (N-1));
   case 'blackmanharris'
      window = 0.35875 - 0.48829 * cos(2*pi*(0:m) / (N-1)) +  ...
                   0.14128 * cos(4*pi* (0:m) / (N-1)) - ...
                   0.01168 * cos(6*pi* (0:m) / (N-1));
   otherwise
      error(['Unknown window type: ', window_type]);
end

% Ergebnisvektor
output = transpose([window(1:m),window(n:-1:1)]);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 08.08.2011, 15:41     Titel:
  Antworten mit Zitat      
weiteres Fenster hinzugefügt...

- Flattop Window: geeignet um die Amplitudentreue des Frequenzspektrums bei einem Leakage Effekt zu erhöhen.

Code:

function output = Fenster(window_size, window_type)
% Input der Funktion:
% window_size = Fensterlänge
% window_typ = 'Hamming', 'Hann', 'Blackman', 'Blackman-Harris', 'Flattop'

N = window_size; % Fensterlänge
output = zeros(N, 1); % Init
if mod(N, 2) == 0 % N gerade
    m = fix(N / 2);
    n = m;
else % N ungerade
    m = fix(N / 2)+1;
    n = m-1;
end
   
switch lower(window_type)
   case 'hamming'
      window = 0.54 - 0.46 * cos(2*pi*(0:m) / (N-1));
   case 'hann'
      window = 0.50 - 0.50 * cos(2*pi*(0:m) / (N-1));
   case 'blackman'
      window = 0.42 - 0.50 * cos(2*pi*(0:m) / (N-1)) +  ...
                   0.08 * cos(4*pi* (0:m) / (N-1));
   case 'blackmanharris'
      window = 0.35875 - 0.48829 * cos(2*pi*(0:m) / (N-1)) +  ...
                   0.14128 * cos(4*pi* (0:m) / (N-1)) - ...
                   0.01168 * cos(6*pi* (0:m) / (N-1));
   case 'flattop'
      window = 0.2156 - 0.4160 * cos(2*pi*(0:m) / (N-1)) +  ...
                   0.2781 * cos(4*pi* (0:m) / (N-1)) - ...
                   0.0836 * cos(6*pi* (0:m) / (N-1)) + ...
                   0.0069 * cos(8*pi* (0:m) / (N-1));  
   
   otherwise
      error(['Unknown window type: ', window_type]);
end

% Ergebnisvektor
output = transpose([window(1:m),window(n:-1:1)]);
 


Fenster.m
 Beschreibung:

Download
 Dateiname:  Fenster.m
 Dateigröße:  1.3 KB
 Heruntergeladen:  500 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Brian S.

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2017, 09:04     Titel: Frage zum Korrekturfaktor
  Antworten mit Zitat      
Hallo DSP,
der Thread ist ja leider schon etwas älter, jedoch hoffe ich doch auf eine Antwort.

Meine Frage betrifft den Korrekturfaktor (N / sum(window)). Dieser erscheint mir sinnvoll ich würde aber gerne wissen wie man darauf kommt.

Ich habe schon in vielen Foren nach dem Korrekturfaktor gesucht, aber oft wird der einfach weggelassen oder was ich auch schon gesehen habe ist einfach ein konstanter Faktor von z.B. 2.
Literatur dazu habe ich noch nicht durchstöbert dafür bin ich im Alltag zu weit weg von dem Thema Signalverarbeitung, wäre aber für Referenzen sehr dankbar.

Vielen Dank im Voraus,
[/quote]Gruß Brian
 
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2017 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.