Aerodynamik/Rolltest

Das ist ja phantastisch !
hier sieht man ganz gut, dass die Parameter noch nicht optimal sind, man aber den Geschwindigkeitsverlauf sehen kann.
Man sieht sogar die kleinen Unregelmäßigkeiten im Bereich 7-11 Sekunden, welche man auch hören kann.
Lediglich der Ausreißer nach oben bei 27,75s scheint mir auf den Auswerte-Algorithmus zurückzuführen sein.
Ab 33s habe ich von Hand abgestoppt und dann den Summer nochmal piepsen lassen, damit man ihn auch als Dauersignal mal hört.
 
Dann könnte ja statt der Batterie eine Tonsignalquelle (Multivibrator zB Sägezahn mit 10KHz) angelegt werden. Wenn Reed geschlossen, dann ist zuverlässig das Signal auf Null und keine Fremdgeräusche da.
Habe jetzt ganz primitiv einen kleinen Reed-Kontakt, welchen ich herumliegen hatte am Durchgangspiepser eines Digital-Multimeter angeschlossen und aufgenommen. Der Vorteil ist, dass nur ein winziger Mess-Strom die Kontakte belastet und die Aufzeichnung sauberer ist (hoffentlich).

Kann das mal jemand mit OKTAVE auswerten:
 

Anhänge

  • Reed-Kontakt mit DMM.zip
    1,7 MB · Aufrufe: 108
Kann das mal jemand mit OKTAVE auswerten:
Code:
close all;
[data,fs]=wavread('Reed-Kontakt mit DMM.wav');
eventlength=550;
ww = eventlength/3;
if mod(ww/2,2) ~= 0
   ww = ww -1;
end
absdata=abs(data);
w=[zeros(1,ww) ones(1,ww)./ww];
c=conv(absdata,w);
t=[1:length(absdata)]./fs;
c=c(floor(0.5*length(w)):end-floor(0.5*length(w)));
tevt=t(absdata./c >7.5);
tevt([0 diff(tevt)<ww/fs]>0)=[];
figure();
plot(t,absdata,'b-',t,c,'c-',tevt,0,'r*')

figure();
U=1.5; % Reifenumfang
v=U./diff(tevt)*3.6;
tv=zeros(length(v),1);
for i=1:length(tevt)-1
  tv(i) = mean(tevt(i:i+1));
end
plot(tv,v);
xlabel('Zeit [s]');ylabel('Geschwindigkeit [km/h]');

vt.png

Ich habe etwas an den Parametern gedreht, aber besser krieg ich es jetzt sponntan nicht hin.
Am Anfang und am Ende sind wieder Störungen drin.

raw05.png raw.png

Viele Grüße,
Nepomuk
 
Ich habe etwas an den Parametern gedreht, aber besser krieg ich es jetzt sponntan nicht hin.
Am Anfang und am Ende sind wieder Störungen drin.
Ja, du hast einiges an dem Auswerteprogramm verändert.
Aber ohne sich in die Programmiersprache einzulesen, ist es kaum nachvollziehbar.
Wieso wird in deinem Auswerte-Diagramm die Kontaktierung bei drei Sekunden nicht erkannt?

Ich habe mal diesen und die beiden benachbarten Kontaktierungen mit 'Audacity' herausgezogen:
Reed-Kontakt mit DMM bei 3 Sek.png

Wieso wird die Kontaktierung bei 2,98s nicht erkannt und die beiden benachbarten schon?
Beim Abhören ist diese Stelle auch völlig unauffällig. Eine Frequenzanalyse bringt mir auch keine Erkenntnis.
Das einzige was mir noch einfällt, ist, dass mir das Aufnahmeprogramm bei 44,1kHz Aufnahmefehler anzeigt. Ob ich es nochmals mit geringerer Abtastfrequenz wiederholen sollte?
 
Das Rauschen anstatt sauberes Nullsignal kommt von der Aufnahme übers Mikrofon. Man muss über eine Steckverbindung aufnehmen. Stromkreis aus Signalgererator, 1KOhm Widerstand und Reedkontakt bilden. Vom 1KOhm Widerstand die beiden Drähte zum Steckverbinder.

Gruß Leonardi
 
Man muss über eine Steckverbindung aufnehmen. Stromkreis aus Signalgererator, 1KOhm Widerstand und Reedkontakt bilden.
Ziel sollte halt auch sein, dass es jeder mit einfachsten Mitteln nachmachen kann.
Wahrscheinlich ist es einfach zu spät: - aber welches Aufnahmegerät soll während der Fahrt an die Steckverbindung angeschlossen sein?
 
Wieso wird die Kontaktierung bei 2,98s nicht erkannt und die beiden benachbarten schon?
raw3.png
Hier ist der Auschnitt. Man erkennt das vor dem eigentlichen Event etwas stärkeres Rauschen ist, wo die hellblaue Kurve schon ansteigt, das ist vor den anderen Events nicht so gewesen. Das müsste mit einem breiteren Fenster (stärkere Filterung) besser gehen. *ausprobier*
vt.png
Sieht doch schon besser aus.

Ja, du hast einiges an dem Auswerteprogramm verändert.
Aber ohne sich in die Programmiersprache einzulesen, ist es kaum nachvollziehbar.

Ok ich versuche den Code mal zu erklären.

Erstmal allgemeine Syntaxgrundlagen.
Mit einem Semikolen hinter einem Befehl kann der Output unterdrückt werden und ein Prozentzeichen leitet einen Kommentar ein. Hilfe zu einem Befehl bekommt man schnell mit help <Befehlname>.

Code:
close all; % alle Plot-Fenster schließen
[data,fs]=wavread('Reed-Kontakt mit DMM.wav'); % in data steckt das Signal, fs ist die Abtastrate

U=1.5; % Reifenumfang in Metern
s=6.5; % Schwellwert für die Erkennung der Events
Um die Peaks zu erkennen, muss man den Grundpegel kennen. Dafür verwende ich einen laufenden Mittelwert. Das Fenster darf dabei nicht zu breit sein, damit es nicht mehrere Peaks beinhaltet. Es sollte aber auch nicht zu kurz sein, da Rauschen sonst eine größere Rolle spielt. Ursprünglich hatte ich die Länge eines Events als orientierung genommen, damit ich auch zwei Events, die kurz hintereinander kommen, erkennen kann. Da das Event selbst ein abklingenden Verlauf hat, sollte man sogar zwei direkt aufeinander folgende Events erkennen können. Das ist allerdings fern jeder Praxis, da wir so hohe Geschwindigkeiten nicht messen werden. Also habe ich mal eine maximale Geschwindigkeit von 200km/h angesetzt (ich habs auch mal auf 60 gesetzt, das war aber zu viel des guten und 200 resultierte in guten Ergebnissen ... ;) )

Code:
vmax=200; % theoretische maximale erkennbare Geschwindigkeit

eventlength=U*fs/vmax*3.6;
ww = eventlength/2; %Fensterbreite

Bei 200km/h und der aktuellen Abtastrate würde man alle U*fs/vmax*3.6 Datenpunkte einen Peak erwarten. Für das Fenster nehme ich daher die halbe Anzahl an Datenpunkten.
Code:
if mod(ww/2,2) ~= 0
   ww = ww -1;
end
Das Fenster soll eine gerade Anzahl an Datenpunkten haben. Das ist im weiteren Verlauf wichtig.
Code:
absdata=abs(data); % Betrag des Signals
w=[zeros(1,ww) ones(1,ww)./ww]; % Fenster
c=conv(absdata,w); % Berechnung des laufenden Mittelwerts
conv steht für convolution und bietet mir die Möglichkeit den laufenden Mittelwert schnell zu berechnen. Dabei wird das Fenster quasi über das Signal geschoben und die Summe der Produkte gebildet. Wir interessieren uns nur für die Vergangenheit, deswegen besteht das Fenster zur Hälfte aus Nullen und wir wollen den Mittelwert haben, deswegen ist die Summe der einzelnen Fenstereinträge gleich eins.
Code:
t=[1:length(absdata)]./fs; % Zeitvektor generieren
c=c(floor(0.5*length(w)):end-floor(0.5*length(w)));
Durch die Berechnung mit conv wird der Ergebnisvektor länger als das ausgangssignal (Das Fenster wird über den Anfang und das Ende Hinaus geschoben.) Diese zusätlichen Werte interessieren uns nicht und werden mit dem c=c(... hier entsorgt.
Code:
tevt=t(absdata./c >6.5); % Eventerkennung
Ok hier steckt tatsächlich sehr viel drin ;)
t ist der Zeitvektor und mit t(1) kann ich mir den ersten Wert ansehen (mit t(end) den letzten und mit t(20:30) die 11 Werte 20,21,...,30).
./ ist ein Elementoperator, dafür müssen die beiden Argumente (hier absdata und c) die gleiche Länge haben. Es wird hier also jedes Element von absdata durch das entsprechende Element von c geteilt. Also t(1)/c(1) und t(10)/c(10) und so weiter.
Wenn das Signal in absdata nun größer ist als das 6.5 fache von c wird der dazugehörige Zeitpunkt aus t in tevt geschrieben.
Code:
tevt([0 diff(tevt)<ww/fs]>0)=[];
Da da ein Event nicht nur aus einer halben Sinuswelle besteht sondern aus vielen abklingenden. Wird zwangsläufig hier und da ein Event quasi doppelt erkannt. Da wir aber wissen, dass innerhalb eines Fensters nur ein Event sein kann (So haben wir das Fenster schließlich entworfen.), können wir die falschen Events erkennen.
diff(tevt) Berechnet die Abstände der erkannten Events. Wenn diese Abstände kleiner als die Fensterbreite sind löschen wir den späteren Wert.
diff(tevt) gibt also einen Vektor zurück der ein Element weniger hat als tevt. durch [0 diff(tevt)] erhalten wir einen Vektor mit der gleichen Länge. Der Vektor "diff(tevt)<ww/fs" besteht nur aus Nullen und Einsen die für Falsch und Wahr entsprechend der kleiner als Bedingung stehen. Durch das Erweitern des Vektors mit der Null am Anfang wird immer der zweite Wert gelöscht, denn wir Wollen ja den Anfang des Events erkennen.
Code:
figure();
plot(t,absdata,'b-',t,c,'c-',tevt,0,'r*')

figure();
v=U./diff(tevt)*3.6;
tv=zeros(length(v),1);
for i=1:length(tevt)-1
  tv(i) = mean(tevt(i:i+1));
end
plot(tv,v);
xlabel('Zeit [s]');ylabel('Geschwindigkeit [km/h]');
Wenn ich die Geschwindigkeit durch zwei Zeitpunkte und den in dieser Zeit zurückgelegten Weg berechne, ist das eine Durchschnitsgeschwindigkeit und der dazugehörige Zeitpunkt liegt genau zwischen den beiden Zeitpunkten. Das mache ich mit der for-Schleife. Sonst wird hier der Kram nur dargestellt.

Man kann jeden Befehl einfach so in Oktave eingeben oder das Skript mit dem Skriptnamen aufrufen, wenn es sich um Suchpfad befindet.

Einfach einbisschen rumspielen und ausprobieren. Und bei Fragen weiß google eigentlich immer weiter. Ein bisschen weiter weiß Google, wenn man nicht nach octave sondern nach matlab und dem entsprechenden Befehl oder der gewünschten Funktionalität sucht und erst im Anschluss schaut, ob der Befehl auch bei octave funktioniert oder was für eine Alternative es gibt.

Viele Grüße,
Nepomuk
 

Anhänge

  • reed.txt
    650 Bytes · Aufrufe: 108
Code:
if mod(ww/2,2) ~= 0
   ww = ww -1;
end
Das Fenster soll eine gerade Anzahl an Datenpunkten haben. Das ist im weiteren Verlauf wichtig.

Der Test testet aber auf Teilbarkeit durch 4, oder? Wenn Rest von ww/2 durch 2 ungleich 0 ist substrahiere 1.
0->0
1->0
2->1
3->2
4->4
5->4
6->5
7->6
8->8


denn wir Wollen ja den Anfang des Events erkennen.
Eine Erkennung des Peaks (arithmetisches Mittel zwischen ansteigender und abfallender Flanke) wäre genauer, aber geschenkt. (Fehler ist Hälfte der Differenz der Peaklängen durch Peakabstand)

Gruß,

Tim
 
Der Test testet aber auf Teilbarkeit durch 4, oder? Wenn Rest von ww/2 durch 2 ungleich 0 ist substrahiere 1.
völlig richtig. Da habe ich die iseven funktion aus matlab etwas zu hastig ersetzt ;)
also einfach das /2 entfernen.

Eine Erkennung des Peaks (arithmetisches Mittel zwischen ansteigender und abfallender Flanke) wäre genauer, aber geschenkt. (Fehler ist Hälfte der Differenz der Peaklängen durch Peakabstand)

Würden wir an den absoluten Zeitwerten interessiert sein, hätte das einen Einfluss, da wir nur die Differenz wissen möchten, dürfte es gar keinen Einfluss geben.
Davon mal abgesehen ist meine Methode weder die einzige noch die beste, nur die erste die mir mit begrenztem Zeitaufwand umsetzbar schien.

Am besten wäre eigenltich einen alten kabelgebundenen Speichensensor an einen Datenlogger zu packen, aber so einen Datenlogger hat ja nicht jeder (und kann auch verdammt teuer werden, musste ich gerade feststellen :eek:).

Viele Grüße,
Nepomuk
 
Einfach einbisschen rumspielen und ausprobieren.
Donnerwetter ! - soviel Gehirnschmalz steckt in den paar Zeilen. Kein Wunder, dass ich davon kaum was verstanden habe :cry:
Man erkennt das vor dem eigentlichen Event etwas stärkeres Rauschen ist, wo die hellblaue Kurve schon ansteigt, das ist vor den anderen Events nicht so gewesen. Das müsste mit einem breiteren Fenster (stärkere Filterung) besser gehen. *ausprobier*
Sieht doch schon besser aus.
Das war ja jetzt eine Aufnahme zwar im Freien, aber unter den Idealbedingungen eines auslaufenden Laufrads eines liegenden VM. Im Gerumpel beim Fahren schaut das mit dem "Rauschen" natürlich anders aus. Meinst du man kann das 3-kHz-Piepsen trotzdem aus der Aufzeichnung herausholen?
 
da wir nur die Differenz wissen möchten, dürfte es gar keinen Einfluss geben.
Durch unterschiedliche Rauschlevel werden die Peaks unterschiedlich lang erkannt. Wenn ein Peak in der Länge abweicht, ändern sich die Geschwindigkeiten der Bereiche davor und dahinter. Ein Tiefpassfilter über 2 Bereiche eliminiert den Fehler, deswegen vernachlässigbar.


Meinst du man kann das 3-kHz-Piepsen trotzdem aus der Aufzeichnung herausholen?

Wenn man die 3 khz mit einer Frequenzanalyse erkennt und das Ergebnis durch obige Analyse jagt, sollte das recht sicher funktionieren. Die Peaks werden dabei aber weiter verschliffen.

Gruß,

Tim
 
ber so einen Datenlogger hat ja nicht jeder
Mit einem Arduino wäre man wohl recht günstig dabei.
http://www.maxpie.de/Data Logging Shield Testmessungen.pdf

Ant+ Sensoren kann man mit einem Android Smartphone mit 4Hz Abtasten. Mit diversen Speichenmagneten (zb an jeder vierten Speiche) hat man doch für langsame Ausrollversuche schon eine gute Genauigkeit. (Darum geht es doch eigentlich oder?)

Viele Grüße,
Nepomuk

PS.: Signal filtern in octave am besten mit filtfilt und dem signal package.
 
Ant+ Sensoren kann man mit einem Android Smartphone mit 4Hz Abtasten. Mit diversen Speichenmagneten (zb an jeder vierten Speiche) hat man doch für langsame Ausrollversuche schon eine gute Genauigkeit. (Darum geht es doch eigentlich oder?)
Nein, es geht insbesondere darum Geschwindigkeiten um die 80km/h sehr genau aufzulösen - natürlich sollte es bei 20km/h noch ausreichen.
Mit der Reed-Piepser-Methode könnte man immerhin 20 mal pro Sekunde die Impulsdauer messen!

Das mit ANT+ wurde ab hier diskutiert mit m.E. unbefriedigendem Ergebnis.
 
Habe die waw-Datei mit Audiacity bearbeitet, normalisert und Rauschunterdrückung - nur mal als Test für meinen Anwendungzweck zur Bestimmung des Trägheitsmomentes. Das ist einfacher als das ich einen Funktionsgenerator raushole, mit Reedkontakt verbinde und das Signal drahtgebunden in digitales Aufzeichungsgerät stecke (habe noch ein gutes dig.Diktiergerät, welches auch Musik mit hoher Abtastrate aufzeichnet), versuche mich gerade in Oktave einzuarbeiten.

ohne Rauschen normalisiert.jpg

@Nepomuk, kannst Du mir das Programm folgendermaßen verändern, das wäre mir eine sehr große Hilfe:
ich möchte die Zeitabstände in Geschwindigkeit (Reifenumfang 1,48m) umgerechnet, immer dann wenn die Amplitude des Signals >0,1 wird.
und die v(t) und t Werte sollen am Ende in einer Datei ausgegeben werden, welche ich mit Excel einlesen kann.

Auch wieder auf 200Km/h begrenzt.

Gruß Leonardi

hier die rauschunterdrückte normalisierte waw von labella "ohne Rauschen normalisiert.zip" um testen ob es funktioniert:
 

Anhänge

  • mit DMM Rauschentf.zip
    1,4 MB · Aufrufe: 112
hier die rauschunterdrückte normalisierte waw von labella "ohne Rauschen normalisiert.zip" um testen ob es funktioniert:
Hm - in der Frequenzanalyse finden sich immer noch jede Menge Frequenzen, welche eigentlich nicht interessieren.
Wäre es nicht einfacher gewesen mittels eines Hochpasses die Frequenzen oberhalb 3000Hz durchzulassen und zusätzlich mittels eines Tiefpasses die Frequenzen oberhalb 3600Hz zu unterdrücken?
 
Hm - in der Frequenzanalyse finden sich immer noch jede Menge Frequenzen, welche eigentlich nicht interessieren.
Wäre es nicht einfacher gewesen mittels eines Hochpasses die Frequenzen oberhalb 3000Hz durchzulassen und zusätzlich mittels eines Tiefpasses die Frequenzen oberhalb 3600Hz zu unterdrücken?

Man kann alles mögliche machen, aber es wird nicht annähernd so gut werden wie ich vorhabe. Idealer Sinus, Sägezan oder Rechteck wenn der Reed Kontakt gibt und sonst Null, wie aus dem Bilderbuch. Mein alter Funktionsgenerator geht von 10Hz-1MHz; +5 Volt Amplitude und Offest mit Potis einstellbar, ich nehme mal 15 KHz, weiß noch nicht ob Rechteck oder Sägezahn am besten.

Gruß Leonardi
 
ich möchte die Zeitabstände in Geschwindigkeit (Reifenumfang 1,48m) umgerechnet, immer dann wenn die Amplitude des Signals >0,1 wird.
und die v(t) und t Werte sollen am Ende in einer Datei ausgegeben werden, welche ich mit Excel einlesen kann.

Für die andere Eventerkennung muss man in der Zeile
Code:
tevt=t(absdata./c >s);
nur das ./c entfernen.

Für das speichern in einer Datei gibt es den Befehl
Code:
save('Dateiname.csv','tv','v','-ascii');

Mit dem Schwellwert von 0.1 erhält man dann folgenden vt-Verlauf:
vt1.png

Da das Frequenzband tatsächlich noch recht breit war, habe ich auch mal etwas gefiltert und das Skript gleich in eine Funktion umgeschrieben. Das sowohl mit als auch ohne Filter funktioniert.

Mit dem Funktionsaufruf reed('mit DMM Rauschentf.wav','reed.csv',0.1,1.48,200); hat man die Funktionalität, die du oben beschrieben hast.
Mit dem Funktionsaufruf reed('Reed-Kontakt mit DMM.wav','reed.csv',0.5,1.48,200,1); wird zusätzlich noch gefiltert (mit vordefinierten Grenzfrequenzen von 3.2kHz und 3.5kHz (ja sehr eng ich weiß)) und mit reed('Reed-Kontakt mit DMM.wav','reed.csv',0.5,1.48,200,1e3,5e3); wird entsprechend mit den Grenzfrequenzen 1kHz und 5kHz gefiltert. Am Ende werden die Vektoren v und tv in die reed.csv geschrieben.

reed('Reed-Kontakt mit DMM.wav','reed.csv',0.5,1.48,200,1); fürt dann zu diesem vt-Verlauf
vt2.png
In der reed.zip ist auch die csv Datei mit drin.

Und natürlich der Code
Code:
function [v,tv] = reed(wavfile,csvfile,s,U,vmax,varargin)
% [v,tv] = reed(wavfile,csvfile,s,U,vmax) gibt den Geschwindigkeitsvektor v und
% den dazugehörigen Zeitvektor tv zurück. wavfile ist der Pfad zur
% .wav-Datei; csvfile ist der Pfad zur Ausgabedatei; s ist der
% Schwellenwert ab dem ein Peak erkannt werden soll; U ist der
% Radumfang; vmax ist die theoretisch maximale erkennbare Geschwindigkeit
% Es findet keine Filterung der Daten statt.
%
% [v,tv] = reed(...,dofilter) ist dofilter > 0 wird ein
% Bandpass mit den Grenzfrequenzen 3.2kHz und 3.5kHz angewendet.
%
% [v,tv] = reed(...,F3dB1,F3dB2) die Variablen F3dB1 und
% F3dB2 sind die untere bzw. die obere Grenzfrequenz für den Bandpass.

[data,fs]=wavread(wavfile);


dataUF = data;
if length(varargin)>0 && varargin{1}>0
  F3dB1 = 3.2e3;
  F3dB2 = 3.5e3;
  if length(varargin)==2
  F3dB1 = varargin{1};
  F3dB2 = varargin{2};
  end
  D = fdesign.bandpass('N,F3dB1,F3dB2',2,F3dB1,F3dB2,fs);
  Hd= design(D);
  [B,A] = sos2tf(Hd.sosMatrix);
  data = filtfilt(B,A,data).*Hd.ScaleValues(1);
end

eventlength=U*fs/vmax*3.6;
ww = eventlength/2;
if mod(ww,2) ~= 0
   ww = ww -1;
end
absdata=abs(data);
t=[1:length(absdata)]./fs;
tevt=t(absdata >s);
tevt([0 diff(tevt)<ww/fs]>0)=[];



figure();
if isempty(tevt)
  plot(t,absdata,'b-')
else
  plot(t,absdata,'b-',tevt,0,'r*')
end

figure();
v=U./diff(tevt)*3.6;
tv=zeros(length(v),1);
for i=1:length(tevt)-1
  tv(i) = mean(tevt(i:i+1));
end
plot(tv,v);
xlabel('Zeit [s]');ylabel('Geschwindigkeit [km/h]');
if ~isempty(csvfile)
  save(csvfile,'tv','v','-ascii')
end

Ich habe den Laufendenmittelwert raus genommen, den braucht man nach der Filterung nicht mehr. Außerdem musste ich für den ersten Plot eine Abfrage einführen, ob überhaupt ein Event erkannt wurde, da der Plot sonst nicht gezeichnet werden würde.

Für die Filterung in Octave muss das signal Package installiert sein. Ist es nicht installiert funktioniert die Funktion dennoch, allerdings nur ohne Filterung (also es gibt einen Fehler, wenn man versucht zu filtern und keinen, wenn man nicht filtern will).

Viele Grüße,
Nepomuk
 

Anhänge

  • reed.zip
    3,1 MB · Aufrufe: 106
Bei einseitig aufgehangenem Rad, eine 19er Nuss (Zündkerzen) über Verlängerung in den Akkuschrauber spannen, evtl. eine Gummischeibe zwischen Zündkerzennuss und Laufrad legen, Akkuschrauber Stufe II kommst Du gut auf 90 Km/h. Ventoux macht es genau so, macht auch keinen Lärm.

Mit Bohrmaschine geht es bestimmt bis >200 Km/h, pass auf das Dir nichts um die Ohren fliegt.

Gruß Leonardi
 
Zurück
Oben Unten