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?
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
Hallo, Kannst du das ein bisschen näher ausführen, damit ich das auch mathematisch verstehe? Wie wird n festgelegt? Gruss Tobias
Hallo Tobias da ist noch ein Punkt: Was hast du für einen A/D-Wandler ? Ist das ein externer bipolarer A/D-Wandler, der ein vorzeichenbehaftetes Ergebnis liefert, oder ist das ein unipolarer A/D-Wandler ? Gerhard
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
Ä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
Hallo Detlef Mein AD Wandler zahlenformat ist signed integer. Nun habe ich das ganze vestanden. besten dank, werde das mal programmieren. gruss tobias
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
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
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
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
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
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.