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

Filter

 

ping
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.08.2012, 15:20     Titel: Filter
  Antworten mit Zitat      
Hallo,
ich bin neu hier und habe zwei Fragen
Die erste handelt davon, dass ich ein Signal filtern möchte. Den Filter habe ich mir bereits gebaut nur leider verstärkt er mein Signal. Im fvtool sieht man, dass die Magnitude nicht auf 0 sondern auf 131 dB liegt. Gibt es eine Möglichkeit mit Hilfe eines Skalierungsfaktors die Magnitude auf 0 zu bekommen, sodass es nicht verstärkt. Hier mein Quellcode:
[code]
fD = 2000;
fS = 2800;
fA = 20000;
Wp = 2*fD/fA;
Ws = 2*fS/fA;
Rp = 1;
Rs = 30;

x = fdesign.lowpass(Wp,Ws,Rp,Rs);
xl = design(x,'butter');
sos.Matrix = [xl.sosMatrix];
sosl = sos.Matrix;
[b,a] = sos2tf(sosl);
fvtool(b,a)
[/code]


Die zweite Frage ist eher eine Verständnisfrage, Ich möchte mit einem zeitsignal eine FFT durchführen. Also muss ich es vorher fenstern um den Leak-Effekt zu vermeiden. Vorzugsweise mit einem Hanning-Fenster. Jetzt möchte ich aber nicht das ganze Signal einer FFT unterzeihen sondern nur einen Ausschnitt, also wäre es doch angebracht vorher mit einem Rechtecktfenster den gewünschten Zeitabschnitt herauszufenstern. Wäre dass dann eigentlich doppelt gemoppelt oder ist das eine mögliche lösung für mein problem? Das Rechteckfenster ist eigentlich eine Funktion, die mir die jeweiligen Samples in eine neue Matrix schreibt um damit weiterzuarbeiten.

Vielen Dank für eure Hilfe
ping[code][/code]
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: 09.08.2012, 16:23     Titel:
  Antworten mit Zitat      
Der Fehler beim Filterdesign scheint wohl hier zu liegen..

Code:

xl = design(x,'butter');
% bzw. in auch in der weiteren Umwandlung
sos.Matrix = [xl.sosMatrix];
sosl = sos.Matrix;
[b,a] = sos2tf(sosl);
fvtool(b,a)
 


Ich habe folgendes getestet, was auch das richtige Filterverhalten liefert

Code:

match = 'stopband'; % hier wäre auch 'passband' möglich
Hd = butter(x, 'MatchExactly', match);
fvtool(Hd);
 


Du hast hier jetzt allerdings ein Filterobjekt Hd. Die SOS Matrix ist schon zwischen Hd und xl verschieden. Aber von Hd die SOS Matrix abspeichern und dann die Koeff. a und b erstellen, liefert bei fvtool(a,b) ein falsches Ergebnis. Nachvollziehen konnte ich es aber noch nicht.

Zur 2. Frage: Beim Rechteckfenster ändert sich doch nichts (w(1:N) = 1)...also kannst du doch auch einfach so den gewünschten Bereich aus dem Signal per Indices herausnehmen. Anschließend kannst du dann die Fensterung mit dem Hann-Fenster durchführen.
Private Nachricht senden Benutzer-Profile anzeigen
 
ping
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.08.2012, 16:42     Titel:
  Antworten mit Zitat      
Hallo und vielen Dank für die schnelle Antwort, sehr nett!
Ich bin jetzt unsicher, kann ich mir aus meinem Filterobjekt Hd jetzt die Filterkoeffizienten a und b generieren oder tritt dort immer wieder ein Fehler auf? Ich wollte mein Signal gern nach diesem Vorgehen (siehe Code) filtern.

[code]y=filtfilt(b,a,Signal);[/code]

Vielen Dank für die Hilfe.
Achja, zur zweiten Frage bin ich schon ein Stück weitergekommen...wichtig ist die Amplitudenkorrektur nach der Fensterung mit dem Faktor [code]N/sum(window) [/code]
Private Nachricht senden Benutzer-Profile anzeigen
 
ping
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.08.2012, 17:06     Titel:
  Antworten mit Zitat      
Hallo und vielen Dank für die schnelle Antwort, sehr nett!
Ich bin jetzt unsicher, kann ich mir aus meinem Filterobjekt Hd jetzt die Filterkoeffizienten a und b generieren oder tritt dort immer wieder ein Fehler auf? Ich wollte mein Signal gern nach diesem Vorgehen (siehe Code) filtern.

Code:
y=filtfilt(b,a,Signal);


Vielen Dank für die Hilfe.
Achja, zur zweiten Frage bin ich schon ein Stück weitergekommen...wichtig ist die Amplitudenkorrektur nach der Fensterung mit dem Faktor
Code:
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: 09.08.2012, 17:07     Titel:
  Antworten mit Zitat      
Leider habe ich bisher noch nicht herausfinden können, wie man b und a richtig erstellt. Es gibt in dem Filterobjekt Hd ja noch die ScaleValues

Wenn ich diese aber bei sos2tf(Hd.sosMatrix,Hd.ScaleValues) mit übergebe, gibts ein Problem beim Multiplizieren...sosMatrix.*ScaleValues funktioniert nicht. sosMatrix ist 6x6 und ScaleValues 7x1...das kann also nicht gehen. Wozu die Werte allerdings sind weiß ich auch nicht.

Nur die sosMatrix zu verwenden, liefert jedenfalls falsche Koeffs.

Zum Thema FFT kann ich dir auch dieses Skript empfehlen...

http://www.gomatlab.de/fft-umfassendes-beispiel-t777.html
Private Nachricht senden Benutzer-Profile anzeigen
 
ping
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.08.2012, 17:13     Titel:
  Antworten mit Zitat      
schade, gibt es einen Befehl mit dem Filterobjekt an sich zu Filtern?

[code]Filter(Hd,Signal) [/code]gibt es ja als Befehl, aber mit [code]filtfilt [/code](also vor und rückwärts filtern) habe ich noch keinen Befehl gefunden. Vllt kann man ja das generieren der Filterkoeffizienten so umgehen.
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: 09.08.2012, 17:23     Titel:
  Antworten mit Zitat      
Und wenn du das Filter erstmal so erstellst

Code:

order = 12; % gleich zu dem anderen Filterentwurf
Wn = 2*2000/fA; % normierte Grenzfreq.
[b,a] = butter(order,Wn);
 


Soweit ich das gesehen habe, unterscheiden sich die beiden Filter erstmal nur im Sperrbereich über 7000 Hz. Aber das war nun kein qualitativer Vergleich. Die Grenzfreq. passt aber.
Private Nachricht senden Benutzer-Profile anzeigen
 
ping
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.08.2012, 17:48     Titel:
  Antworten mit Zitat      
OK. Vielen Dank erstmal. Wenn ich noch eine Möglichkeit finde die Sache anders zu beheben melde ich mich.
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.