goMatlab - Mein MATLAB Forum

Mein MATLAB Forum

 
Login  | Registrieren
Bücher:

Gewöhnliche Differentialgleichungen

Studierende:
Sensorlose BLDC-Ansteuerung einer PSM für elektronisch mechanische Stellantriebe
Kfz-Zulieferindustrie
ZF Friedrichshafen AG - Friedrichshafen

Abschlussarbeit Entwicklung von Leistungselektronik (Simulation mit Matlab / Simulink)
Energieversorgung
SMA Solar Technology AG - Niestetal

Abschlussarbeit Entwicklung neuer Technologien für die Photovoltaik-Systemtechnik
Elektrotechnik / Automatisierungstechnik
SMA Solar Technology AG - Kassel

Praktikum im Bereich Softwareentwicklung
Kfz-Zulieferindustrie
Continental AG - Schwalbach

Abschlussarbeit Software zur Integration unserer Produkte an zukünftige Energiemarktplätze
Solartechnik
SMA Solar Technology AG - Niestetal

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: 847
Anmeldedatum: 28.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2011, 15: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: 3879
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 6.5, 2009a
     Beitrag Verfasst am: 19.07.2011, 18: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: 847
Anmeldedatum: 28.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2011, 18: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: 3879
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 6.5, 2009a
     Beitrag Verfasst am: 20.07.2011, 13: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: 847
Anmeldedatum: 28.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2011, 13: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: 847
Anmeldedatum: 28.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2011, 20: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: 847
Anmeldedatum: 28.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.08.2011, 16: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:  42 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Options and Permissions
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  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2012 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.