quadratischer mittelwert

Gast #427723
Lesenswert?

Hallo

Ich möchte mit einem DSP den koninuierlichen quadratischen mittelwert 
eines eingangs signales berechnen.
d.h.

ich habe einen ad wander der mit 10kHz sample frequenz läuft. nun möchte 
ich mit diesem kontinuierlichen eingangsstrom von analog werten den 
laufenden quadratischen mittelwert berechnen. ich möchte nicht z.b. 1024 
sample einlesen und dann in einer schlaufe den rms wert berechnen.

kann mir hier jemand auf die sprünge helfen?
#427770
Lesenswert?

Hallo,

kontinuierlich das qaudratische Mittel der Wandlerwerte berechnen. Wenn 
x(k+1) der neue Wandlerwert ist, dann berechnest Du 
y(k+1)=((n-1)*y(k)+x(k+1)*x(k+1))/n .y(k+1) folgt dann dem Mittelwert 
der Quadrate von x, je größer n ist, umso langsamer. Nach Wuzelziehen 
und Umskalieren kommt hast Du dann RMS.

Cheers
Detlef
#427905
Lesenswert?

Hallo,

wenn ich das richtig verstanden habe, kommen kontinuierlich Werte von 
Deinem AD Wandler und Du möchtest laufend den quadratischen Mittelwert 
berechnen. Ich schlage vor,das folgendermaßen zu machen:

Die Werte von Deinem AD-Wandler nenne ich x(k). Zunächst brauchst Du für 
den RMS das durchschnittliche Quadrat der x(k). Also berechnest Du 
x(k)*x(k); Die einfachste Möglichkeit, einen laufenden Durchschnitt der 
x(k)*x(k) zu bilden ist die Anwendung folgender Formel:

y(k+1)=((n-1)*y(k)+x(k+1)*x(k+1))/n

Die Folge der y(k) folgt dann langsam dem mittleren Quadrat der x(k). Je 
größer n ist, umso 'träger' folgt y(k) den x(k)*x(k). Das neue y(k+1) 
ist ja die Summe aus dem alten y(k) mit dem Vorfaktor(n-1)/n und dem 
neuen x(k)*x(k) mit dem Vorfaktor 1/n. In der Summe geben die 
Vorfaktoren den Wert 1. Signalverarbeitungstechnisch ist die Rechnung 
nen Tiefpaß erster Ordnung, je größer n ist umso größer ist dessen 
Zeitkonstante.

RMS bekommst Du, indem Du die Wurzel aus den y(k) ziehst.  Für eine 
Integerrechnung ist es immer günstig n als Potenz von 2 zu wählen weil 
dann die Division einfach wird. Vorsicht auch bei Integerrechnung mit 
dem Zahlenbereich, 10 Bit AD Werte haben nach der Multiplikation 20Bit, 
für den Vorfaktor auch noch genügend Raum lassen, mit 32 Bit rechnen.

Cheers
Detlef
#427910
Lesenswert?

Ähm, Gerhard hat natürlich Recht, ich bin bei meiner Einlassung davon 
ausgegangen, daß der AD-Wandler 'DC-freie' Werte liefert, also z.B -1023 
für -1V, 0 für 0V und 1023 für 1V. Falls der AD Wandler das anders 
macht, brauchst Du nicht nur das quadratische Mittel sondern auch den 
laufenden Mittelwert Deiner Eingangsfolge, den Du dann subtrahierst.

Cheers
Detlef
Gast #428197
Lesenswert?

hallo Detlef

Noch eine letzte Frage, gerne würde ich wissen wie die mathematische 
herleitung deiner berechnung funktioniert, ebenso wie ich n zur cutoff 
frequenz des filters setze.

hast du gute lieteratur oder links?

gruss
tobias
#428313
Lesenswert?

Mit den einfachen x(k) als Eingangswerte lautet die Differenzengleichung 
für dieses IIR-Filter 1. Ordnung
y(k+1)=((n-1)y(k)+x(k))/n =((n-1)/n)*y(k) +x(k)/n

Die z-Übertragungsfunktion davon lautet:
H(z)=(1/n)/(z-(n-1)/n)

für z=exp(j*w) bekommt man den Frequenzgang des Filters, hier mal für n 
von 2 bis 100 gezeichnet, Matlab script hängt auch hinten dran.

Literatur/links: Digitale Filtertheorie ist nen weites Feld, da gibts 
unendlich viel Zeug.

Mein Handbuch aufm Schreibtisch ist
Lacroix, A.: Digitale Filter, Oldenburg Verlag München Wien 1996
Standard ist auch:
Oppenheim; Schafer: Zeitdiskrete Signalverarbeitung,Oldenburg Verlag 
München Wien 1992

Cheers
Detlef

clear
nn=(2:5:100);
HH=[];

for(k=1:length(nn))
n=nn(k);
H=freqz(1/n,[1 -(n-1)/n],256);
HH=[HH H];
end;
semilogx((0:255)/256,20*log10(abs(HH)))
grid

title('IIR 1. Ordnung')
xlabel('f/f_N_y_q_u_i_s_t')
ylabel('Dämpfung [dB]')

return
Angehängte Dateien:
Gast #429231
Lesenswert?

Hallo detlef

Kannst du mir sagen wie du von

y(k+1)=((n-1)y(k)+x(k))/n =((n-1)/n)*y(k) +x(k)/n auf
H(z)=(1/n)/(z-(n-1)/n) kommst?

Ich kenne mich nur mit laplace aus, leider nicht mit der 
z-transformation

danke,
gruss tobias
#429505
Lesenswert?

Normalerweise schlage ich die z-Übertragungsfunktionen der 
Filterstrukturen in der angegebenen Literatur nach. Herleitung explizit: 
Für die angegebene Differenzengleichung lautet die Anwortfolge auf einen 
Einheitsimpuls (eine 1, danach nur noch Nullen)

h(k)= (1/n)*((n-1)/n)^k

Die z-Transformierte dieser Impulsantwort ist die Übertragungsfkt. des 
Filters. Die Tansformierte lautete (siehe Definition der 
z-Transformation)

H(z)= (1/n)*(Summe k=0 bis unendlich) (((n-1)/n)^k*z(^-1)))
     =(1/n)*(Summe k=0 bis unendlich) (((n-1)/(z*n))^k)

Mein Bronstein/Semendjajew Mathehandbuch sagt dazu:

H(z) = (1/n)/(1-((n-1)/(z*n))
H(z) = (z/n)/(z-(n-1)/n)

Dieses H(z) ist um den Faktor z unterschiedlich zu dem von mir oben 
angegebenen, die zugehörigen Folgen sind um einen Wert gegeneinander 
verzögert (siehe dazu auch Verschiebungsatz der z-Tranformation). Das 
spielt keine wesentliche Rolle, einmal ist der Ausgang des Filters 'vor 
dem Summierer', einmal dahinter.

Danke für die interessante Frage, Antwort war Spaß.

Cheers
Detlef
Gast #433410
Lesenswert?

Hallo Delef_a

Wie kann ich in deinem Matlab beispiel vom ausgelegten filter
mit hilfe matlab die sprungantwort berechnen, und die pole und 
nullstellen berechnen.

für die step response kenne ich den befehl step(sys). nur ist mir hier 
nicht klar wie ich sys bekomme.

gruss tobias
#433449
Lesenswert?

Hi,

die Nullstellen des Filters sind die Nullstellen des Zählerpolynoms, die 
Polstellen sind die Nullstellen des Nennerpolynoms.
Für H(z) = (z/n)/(z-(n-1)/n) also denkbar schlicht Nullstelle bei z=0 
und Polstelle bei z= (n-1)/n. Die Nullstellen von Polynomen berechnest 
Du bei Matlab mit dem Befehls 'roots'.

'step' berechnet anscheinend die Sprungantwort, 'impulse' berechnet die 
Impulsantwort. Die beiden Befehle kenne ich nicht, die gehören zu 
irgendeiner toolbox oder zu Simulink. Das geht aber viel einfacher mit 
dem Befehl 'filter', der berechnet digitale filter, mal in dessen 
Beschreibung reinkucken.

Also (für n=100):
impulsantwort= filter([ 0 1/100],[1 -99/100],[1 zeros(1,1000)]);
sprungantwort= filter([ 0 1/100],[1 -99/100],[   ones(1,1000)]);

Impulsantwort springt auf 1/100 und geht dann exponentiell gegen 0, 
Sprungantwort geht exponentiell gegen 1, muß sie ja auch, als 
Mittelwertbildner.

Cheers
Detlef

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren