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

Interpolation/Downsampling

 

Student1989

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2011, 08:37     Titel: Interpolation/Downsampling
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein echtes Poblem. Ich befinde mich geradean einer Sudienarbeit, bei der ich ein Programm zur Auswertung eines Winkelsensor schreiben soll. Dazu habe ich die Variablen dataRef und dataSensor. In der ersten Spalte sind jeweils die Zeitwerte abgespeichert, in der zweiten Spalte die Position in Grad. dataRef enthält die Daten eines Referenzgebers. Es ist nun ein Bereich von etwas mehr als 360° abgegelegt. Mein Ziel ist jedoch einen genauen Bereich von 360° zu erreichen. Ich habe mir dabei folgende Befehle ausgedacht:


value = linspace(0,360,180000);
value = value';
sensor = interp1(dataRef(:,2),dataSensor(:,2),value,'linear');


Allerdings erhalte ich dann Werte in sensor von 0 bis 360,1° und nicht bis 360°. Kann mir jemand helfen dieses Problem zu lösen????[/math]


Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 22.07.2011, 11:22     Titel:
  Antworten mit Zitat      
Hallo,

mir ist nicht ganz klar, was Du interpolieren willst? Wenn z.B.
Code:
dataRef = [350;360];
dataSensor = [350;370];
interp1(dataRef, dataSensor, 360)
ans =
   370
 

Die 370 sind genau der Wert von dataSensor da, wo dataRef=360 ist. Was genau möchtest Du denn vergleichen?

Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
Student1989

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2011, 11:51     Titel:
  Antworten mit Zitat      
Hallo Titus,

danke für den Hinweis der Uverständlichkeit. Ich versuche es nun ausführlicher zu beschreiben. Es gibt wie gesagt zwei Datensätze einer für den Sensor und einer für den Referenzgeber. Beide sind an einer Welle befestigt die sich um 380° dreht. Ich möchte nun aus diesen Bereich genau einen Bereich rausfiltern der genau 360° umfasst (von 10° bis 370°). Dazu habe ich mir eine Funktion geschrieben, welche mir den Index der Position liefert, die die nächste unterhalbder 10° ist und den Index der Position die als erstes über den 360°. Es sind ca 227.000 Position im gültigen Bereich der nun etwas mehr als 360° umfasst.

Mein Auftraggebermöchte aber, dass eine Bereich genau 3600000° umfasst und aus 180.000 Werten beteht. Ich dachte mir dabei, dass ich als erstes mit linspace 180.000 gleichverteilte Werte zwischen 0° und 360° erzeugen lasse. Danach möchte ich mit interp1 die dazugehörigen Indizes (i.d.R. Kommaindizes) berechnen lassen, damit ich diese Verwenden kann, den 360° Bereich auch aus dem Winkelsensor rauszufiltern.

Ist dir meine Probematiknun klar?
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 22.07.2011, 18:34     Titel:
  Antworten mit Zitat      
Meiner Meinung nach müsstest du so interpolieren.

Ist x die Gradachse und y der Sensorwert?

Code:

format long % damit man mehr Stellen sieht
gewünschte Schrittweite = 360/(180000-1) = 0.00200001111117 = dx_i
xi = 0:dx_i:360 % ergibt einen Vektor mit 180000 Werten
% deine Schrittweite 360.1/227000 = 0.00158634361233 = dx
x = 0:dx:360.1
% Y = Sensorwert
yi = interp1(x,Y,xi); % Dann erhältst du jetzt die interpolierten Werte mit der neuen Schrittweite.
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Student1989
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 22.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2011, 08:52     Titel:
  Antworten mit Zitat      
Hallo Titus,

dass ist leider nicht ganz, das was ich suche. Nochmal zum Verständnis: Die Daten des Referenzgebers und des Senors sind jeweils in einem Vektor aus zwei Spalten abgelegt (dataRef und dataCtr). In der ersten Spalte befindet sich eine ganz normaler Laufindex, in der zweiten Spalte befindet sich die Position in Grad. Damit lässt sich die Aussage machen, dass der Sensor z.B. bei Index 1 (also Position 1) eine Strecke von z.B. 0,001° zurückgelegt hat, bei Index 2 lautet die entsprechende Position 0,002°.

Wie gesagt, lsst sich anhand dieser Daten kein exakter Bereich von 360° rausfiltern, was aber gefordert wird. Nun habe ich mir gedacht, dass ich die Position des Referenzgebers als X-Achse mit 180.000 Werte festlege. Damit wäre ja ein genauer Bereich von 360° abgedeckt. Über die Interpolation möchte ich nun die dazugehörigen Indizes (Y-Werte) des Referenzgebers bestimmen, welches in der Regel Kommaindizes sind (z.B. Index 0,9 entspricht dann genau 0°).

Sind dann diese Indizes vorhanden, lässt sich dann mit diesen Indizes ebenfalls einen genauen 360° Bereich aus dem Datensatz des Sensors filtern.
_________________

--------------
C'est la vie!
--------------
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: 25.07.2011, 09:43     Titel:
  Antworten mit Zitat      
Und was fängst du dann mit den Kommaindices an? Damit kannst du doch nicht auf dataCtr zugreifen. Mir ist erst nachher bewusst geworden, dass ich das Gleiche angegeben habe, wie du schon in deinem ersten Post.

Allerdings schlage ich immer noch vor, das xi auf die extakten Werte zu beziehen. Du musst letztendlich aus dem vorhandenen Vektor die Anzahl und den genauen Gradbereich bestimmen. Du hast ja geschrieben, du suchst den Index zwischen nächster unter 10 und nächster über 360 Grad. Kannst du diesen Gradbereich exakt bestimmen?

Was mir noch nicht klar ist, wie nun dataRef und dataCtr zusammenhängen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Student1989
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 22.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2011, 09:58     Titel:
  Antworten mit Zitat      
Referenzgeber und Sensor sind an einer gemeinsamen Welle angebracht, welche sich dreht d.h. theoretisch müssten beide zu jeder Position den gleichen Index aufweisen (bzw. die gleich Position in ° haben). Wenn ich jetzt de Kommindizes habe, welche den genauen 360° angeben, könnte ich mir ebenfalls über die Interpolation die zugehörigen Positionen in Grad zu den Indizes berechnen. Ich könnte demnach untersuchen, was für eine Abweichung zwischen Sensor und Referenzgeber besteht. Der genaue 360° Bereich ist gefordert, da man dadurch mehrer Zyklen addieren und mittlen kann. Damit würde man die Ungenauigkeit über eine größere Anzahl an Zyklen erhalten.

Ist dir nun die Problemstellung klar?
_________________

--------------
C'est la vie!
--------------
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: 25.07.2011, 10:03     Titel:
  Antworten mit Zitat      
ok...aber hast du denn mal meinen Vorschlag ausprobiert? Eben nicht den Ref-Vektor zu verwenden, sondern die Einteilung von x an Hand der Werte von dataCtr....wie ich es bei meinem Codebsp. gemacht habe.
Private Nachricht senden Benutzer-Profile anzeigen
 
Student1989
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 22.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2011, 10:43     Titel:
  Antworten mit Zitat      
Ja, hab ich ausprobiert allerdings erhalte ich dann für yi Werte zwischen 0 und 360 und nicht die Indzies. Wenn ich allerdings für y die Ganzzahlindizes einsetze, erhalte ich ein verrutschtes Ergebnis. Ich vermute dann, dass der letzte Wert an erstes Stelle geschrieben wird. Warum weiß ich nicht.
_________________

--------------
C'est la vie!
--------------
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: 25.07.2011, 10:50     Titel:
  Antworten mit Zitat      
An die Indices wirst du damit auch nicht kommen. Jetzt kannst du doch aber dataRef und dataCtr miteinandern an jeder Stelle vergleichen. Oder ist dataRef nicht von 0...360 mit 180.000 Messwerten?

Edit: Habs gerade gelesen...ist wie der original dataCtr aufgebaut. Dann interpoliere DataRef doch genauso, wie auch schon dataCtr.
Private Nachricht senden Benutzer-Profile anzeigen
 
Student1989
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 22.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2011, 11:22     Titel:
  Antworten mit Zitat      
180.000 Messwerte habe ich zwar ich keinen exakten Bereich von 0° bis 360° sondern von -0,00087° bis 359,9055 ich brauche aber einen exakten Bereich von 0° bis 360° damit eine Mittleung über Mehrer Zyklen erfolgen kann. Diese kann ich nur addieren und mittlen, wenn der Bereich jedesmal exakt gleich groß ist.
_________________

--------------
C'est la vie!
--------------
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: 25.07.2011, 11:25     Titel:
  Antworten mit Zitat      
Du hast doch aber in deinem vorherigen Post geschrieben, dass yi die interpolierten Werte zwischen 0 und 360 Grad enthält. Nun jetzt doch nicht...ich bin etwas verwirrt ?
Private Nachricht senden Benutzer-Profile anzeigen
 
Student1989
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 22.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2011, 11:44     Titel:
  Antworten mit Zitat      
Wenn ich das hab dann war das ein Fehler meinerseits um den ich um Verzeihung bitte.

yi soll eigentlich die Indizes (Kommaindizes) enthalte, die zu dem Bereich von 0° bis 360° mit der Schrittweite 0,002 (pos = linspace(0,360,180000) gehören.
_________________

--------------
C'est la vie!
--------------
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: 25.07.2011, 13:45     Titel:
  Antworten mit Zitat      
Probier das mal:

Code:

format long;
dg = linspace(9.8,370.1,227000)';
dgi = linspace(0,360,180000)';
data = 1:1:227000;
data_i = interp1(dg,data,dgi,'linear');
plot(dgi,data_i);
 


Jetzt hast du in data_i(4901:180000) = 1.03....220636.7 meines Erachtens krumme Indices ...vorher nur NaN. Aber ich verstehe das mit den Kommaindices immer noch nicht. Was machst du dann damit? Du brauchst ja auch dann den interpolierten Gradwert dazu...den hast du doch auch nicht.

Edit:
Das hier ist besser...dann verschwinden auch die NaN. Index von 120.00...226936.99
Code:
dgi = linspace(10,370,180000)';
Private Nachricht senden Benutzer-Profile anzeigen
 
Student1989
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 22.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2011, 14:13     Titel:
  Antworten mit Zitat      
Über diese Art habe ich es auch schon versucht. Ich erhalte auc gnz plausible Werte. Allerdings tritt da ein Problem auf, mit welchem ich mich seit letzten Mittwoch rum schlage:

Der erste Eintrag schein mir totalt falsch, ich glaube dass dies der letzte Index sein müsste. Der Anfang der Tabelle sieht nun bei mir so aus:
+------------------+
| Index | Position|
+------------------+
|221973| 0° |
+------------------+
| 0 | 0,002° |
+------------------+
|1,1765| 0,004° |
+-------------------+

....

Woher die 221973 kommen ist mir völlig unklar. Sie müssten eigentlich in der letzten Zeile stehen.
_________________

--------------
C'est la vie!
--------------
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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 - 2025 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.