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

Echtzeit Filter / Fir-Filter / MA-Filter

 

Signal_Neuling
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 11.05.20
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 11.05.2020, 13:48     Titel: Echtzeit Filter / Fir-Filter / MA-Filter
  Antworten mit Zitat      
Hallo an alle,

ich bin neu hier im Forum und daher weiß ich leider nicht ob ich hier richtig bin :/

Zu meinem Problem.
Ich soll als Aufgabe einen Echtzeit Fir-Filter in MatLab realisieren.

Ich habe mir natürlich schon viel Gednaken darüber gemacht und stundenlang den Kopf zerbrochen. Irgendwo muss ich einen Denkfehler haben, da das Ergebnis was ich von meiner Funktion zurückgegeben bekomme nicht der Erwartung entspricht.

Hier erstmal das .m-file mit der Funktion myFIR_1810811
Code:


%   Ergebnis : y = b0*x[k] + b1*x[k-1] + b2*x[k-2] + b3*x[k-3] + ... + bn*x[k-n]      
%   --
%   Übergabe Parameter :
%                    --> b  ist ein Vektor der transversalen Filterkoeffizienten !
%                    --> x  ist aktueller Eingangssignal-Wert x[k]
%                    --> zi ist Vektor / initialer Verzögerungspuffer mit Eingangssignal-Werten der Vergangenheit => zi = ( x[k-1], x[k-2], x[k-3], ... , x[k-(N-1)] )
%  RückgabeWerte :
%                    --> y  ist AusgangsSignal
%                    --> zf ist Vektor. Diskrete Eingangssignal-Werte => zf = ( x[k], x[k-1], x[k-2], ... , x[k-(N-2)] )                                                        
%                    
function [y, zf] = myFIR_1810811(b, x, zi)

 y = b .* [x, zi]';             %%%   .* -Operator anstatt  * -Operator
 zf = [ x, zi(1:end-1)];

end

%   Unit-Test
%   Folgende Beispiele wurden getestet und Anschauungsmaterial befindet
%   sich im Ordner Anhang.  Im folgenden bedeutet '^^' soviel wie 'und / mit'        
%   --
%   Beispiel 1. b = [ 1 1 ]       ^^ x = [ 1 2 3 ]  --> Ergebnis y = [ 1 3 5 3 ]

 



Hier der Funktionsaufruf.
Vielleicht ( Hoffentlich, trifft wohl eher zu Very Happy ) findet jemand meinen Denkfehler Razz

Code:

b = [ 1 1 ];  x = [ 1 2 3 ];
len = length(b) + length(x) - 1;
oldVal = length(b);

for a = 1 : len-1
   
   [y, z] = myFIR_1810811(b, x(a), oldVal);
   oldVal(a) = x(a);
 
end
 


Grüße und schonmal ein herzliches Danke an alle die sich mit dem Post beschäftigen Smile
Private Nachricht senden Benutzer-Profile anzeigen


Signal_Neuling
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 11.05.20
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 15.05.2020, 17:48     Titel:
  Antworten mit Zitat      
Also bin etwas Weiter gekommen..

ein paar Fälle funktionieren. z.B.
x = [ 1 2 3 ] gefalten mit b = [ 1 1 ] = [ 1 3 5 3 ]

vielleicht kann mit jemand Tipps geben wie ich den code verbessern kann. Smile

Code:

function [y, x_puf] = meinFIR(b, x, x_puf)

x_cur = cat(2, x, x_puf(1 : end-1));
y = 0;

for a = 1 : length(b)
    y(length(b) +1 -a) = y(a) + (b(a) * x_cur(a));
end
x_puf = [x, x_puf(1 : end-1)];

end
 


Code:
close all; clear; clc;
b = [ 1 1 ];  x = [ 1 2 3 ];
len = length(b) + length(x) - 1;
y = (len-1);
oldVal = zeros(length(b)); y_end = (len-1);

for a = 1 : len-1
   
   [y, oldVal] = meinFIR(b, x(a), oldVal);
   y_end = cat(2, y_end(1 : end-1), y);
   
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Marius0104
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 08.11.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.11.2021, 15:55     Titel:
  Antworten mit Zitat      
Hallo,

ich habe gerade auf Deinen Beitrag gestoßen, da ich Infos zum Echtzeitfilterprogrammierung suche.
Meine Aufgabe lautet: "Programmieren Sie ein echtzeitfähiges FIR-Filter und ein Hauptprogramm zum Testen der Funktion."

Konntest Du deine Programmierung des Echtzeitfilters erfolgreich realisieren? Hat es geklappt?
Ich wäre Dir sehr dankbar, für einige Infos oder Deine Lösung.
Dies wird mir sicherlich bei Bearbeitung meiner Aufgabe weiterhelfen.

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Signal_Neuling
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 11.05.20
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 08.11.2021, 18:44     Titel:
  Antworten mit Zitat      
Hi,

habe es damals noch mehr oder weniger hinbekommen.
Leider habe ich nicht mehr die Lösung, aber sollte ungefähr so gewesen sein:

% Übergabe Parameter :
% --> b ist ein Vektor mit N transversalen Filterkoeffizienten !
% --> x ist aktueller Eingangssignal-Wert x[k]
% --> zi ist Vektor / initialer Verzögerungspuffer mit Eingangssignal-Werten der Vergangenheit => zi = ( x[k-1], x[k-2], x[k-3], ... , x[k-(N-1)] ). ( Das sind insgesamt N-1 Werte).

% RückgabeWerte :
% --> y ist AusgangsSignal
% --> zf ist Vektor. Diskrete Eingangssignal-Werte => zf = ( x[k], x[k-1], x[k-2], ... , x[k-(N-2)] ) ´. Sozusagen der Buffer nach dem Filtern.

if length(b) > 1
y=[x,zi]*b'; % Hier wird gefiltert
zi=[xk,zi(1:end-1)]; % Hier wird der neue Buffer initialisiert.
zf = zi;
else
y = xk*b;
end;




Probier mal einen einfachen Differenzierer aus. also b=[1 -1]; und einen EingangsVektor = [ 0 0 0 0 1 1 1 1 1 0 0 0 0 ];
Der sollte die 0 1 bzw. 1 0 Übergänge erkennen und wenn du ein subplot mit stem machst sollte ein positiver und ein negativer Dirac als Ergebnis heraus kommen.

Hoffe ich konnte dir helfen.
Viel Erfolg bei deiner Aufgabe
Private Nachricht senden Benutzer-Profile anzeigen
 
Marius0104
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 08.11.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2021, 12:50     Titel:
  Antworten mit Zitat      
Hi,
danke für die hilfreichen Hinweise! Mein echtzeitfähiges FIR-Filter funktioniert.
Ich habe jetzt ein adaptives FIR-Filter realisiert.
Weiß du, wie man ein Programm zum Testen erstellen kann?

function [y,e,w] = LMSFilter(w, v, s, x); % e-Fehlersignal, w-Filterkoeffizienten, v-Verzögerung, s-Schrittweite

y = zeros(size(x));
e = [];
N = length(w);
d = [zeros(1, N+v-1), x]; % desired Signal
w = fliplr(w);
for k = 1:length(x)
xk = d(k:k+(N-1));
y(k) = w * xk';
e(k) = x(k) - y(k);
w = w + s * e(k) * xk;
end

Wünsche noch eine gute und gesunde Woche!
Viele Grüße
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.