Schon. Aber dann brauche ich wieder Platz für noch einen Monitor, noch eine Tastatur und noch eine Mouse. Von daher.
Druckbare Version
Schon. Aber dann brauche ich wieder Platz für noch einen Monitor, noch eine Tastatur und noch eine Mouse. Von daher.
nachdem wir mit den Vorarbeiten eigentlich soweit sind -
hast du dir das hier jetzt mal genauer angesehen...?
http://dsp.stackexchange.com/questio...es-are-similar
So. Code eingebaut, etwas angepasst, ausprobiert. Läuft!
Rauscht noch ein wenig, aber ich denke es ist schon um einiges besser!Code:#include <iostream>
#include <vector>
#include <fstream>
#include <stdio.h>
#include <limits.h>
#include <math.h>
#include "diaSound.hpp"
bool debug = false;
bool ausgabe = true;
void filtern(int32_t *array)
{
int32_t sbuf[128];
int32_t bias, minr, maxr, baseline,
maximum, minimum, maxpos, minpos,
signalstart, signalend;
uint16_t i;
// dynamics: min, max
maximum = array[0];
minimum = array[0];
for(i=0;i<SHRT_MAX; ++i)
{
if(array[i] > maximum)
{
maximum = array[i];
maxpos = i;
}
if(array[i] < minimum)
{
minimum = array[i];
minpos = i;
}
}
// calculate baseline from last 100 array cells:
// init vars
baseline=(array[minpos] + array[maxpos]) / 2; // init baseline by (min+max)/2
minr=baseline - 1;
maxr=baseline + 1;
// auto-adjust:
for(i=SHRT_MAX-100; i<SHRT_MAX; ++i)
{
// mean baseline
baseline = round((0.5*(float)array[i] + 0.5*(float)baseline)) ;
// smoothed out max noise
if(array[i] >= baseline) maxr = round((0.6*(float)array[i] + 0.4*(float)maxr)) +1 ;
// smoothed out min noise
if(array[i] <= baseline) minr = round((0.6*(float)array[i] + 0.4*(float)minr)) -1 ;
}
bias = max(baseline-minr, maxr-baseline) +1;
// noise reduction start/end
// drop small noise
for(i=0;i<SHRT_MAX;++i)
{
if((array[i]>baseline) && (array[i] <= baseline + bias)) array[i] = baseline ; // little higher value => drop to baseline
else
if((array[i]<baseline) && (array[i] >= baseline - bias)) array[i] = baseline ; // little lower value => rise to baseline
}
// signalstart, signalend: threshold = bias + (bias/2)
signalstart = 0;
i = 0;
while((array[i]<=baseline + 4 * bias/3) && (i<SHRT_MAX-1)) ++i;
signalstart = i;
if(i > 0) signalstart -= 1;
signalend=SHRT_MAX-1;
i=SHRT_MAX-1;
while((array[i]<=baseline + + 4*bias/3) && (i>signalstart)) --i;
signalend = i;
if(i<SHRT_MAX-1) signalstart +=1;
}
void analyse(int32_t *waveBuffer)
{
int32_t maximum = waveBuffer[0];
int32_t minimum = waveBuffer[0];
int32_t maxpos, minpos;
int32_t i;
for(i=0;i<SHRT_MAX;i++)
{
if(waveBuffer[i] > maximum)
{
maximum = waveBuffer[i];
maxpos = i;
}
if(waveBuffer[i] < minimum)
{
minimum = waveBuffer[i];
minpos = i;
}
}
filtern(waveBuffer);
}
int main()
{
fstream datei;
int32_t input[SHRT_MAX], waveBuffer[SHRT_MAX];
int32_t i;
audioCapture(input, SHRT_MAX, "plughw:1,0", 1, 12000, 8);
if(debug) datei.open("test.csv", ios::out);
for(i=0;i<SHRT_MAX;i++)
{
waveBuffer[SHRT_MAX] = input[i] & 0x00ff;
if(debug) cout << i << " -> " << input[i] << endl;
if(debug) datei << input[i] << endl;
}
analyse(waveBuffer);
if(debug) datei.close();
if(ausgabe)
{
uint8_t *wave;
wave = (uint8_t *) malloc(SHRT_MAX+1);
for(i=0;i<SHRT_MAX;i++) wave[i] = input[i] & 0x00ff;
playCaptured(wave, SHRT_MAX, "plughw:1,0", 1, 12000, 8);
free(wave);
}
return 1;
}
Kannst du es noch nicht testen?
- - - Aktualisiert - - -
HALT! Kommando zurück!
Ich dussel habe vergessen die richtige Variable an playCaptured zu schicken :-(.
Umbauen und testen!
- - - Aktualisiert - - -
Gerade versucht. Gibt nur zwei kurze Knacken :(
was ist, wenn du die Zeile
analyse(waveBuffer);
auskommentierst?
Dann bleibt ja der Sound in waveBuffer unverändert und müsste genau wie das Original klingen.
Spiel dafür zum Vergleich kurz mal hintereinander
a) input und
b) wavebuffer
über playCaptured ab.
zum selber ausprobieren:
ich habe keine Idee, wie ich diene csv datei in das Raspi programm als array reinbekommen soll, und ich habe ja auch keine line in Buchse um selber etwas aufzunehmen.
hilfreich wäre auch, einen wave-Plot zu sehen, so wie bei meinen Arduino-array-Plots:
a) input
b) wavebuffer ohne analyse
c) wavebuffer mit analyse
- - - Aktualisiert - - -
ps,
außerdem wäre es IMO sinnvoller, wenn die filter-Algorithmen direkt in analyse() drinstehen, nicht als extra filter Prozedur, und zwar wegen aller dort deklarierten lokalen Variablen.
Ich bastel dir eine Funktion mir der du die Daten einlesen kannst. Das ist das kleinste Problem ;). Dachte das du vielleicht mittlerweile die Karte bekommen hast.
Gut, Analyse baue ich um, kein Problem.
Ich habe schon input und wavebuffer hintereinander abgespielt. input geht, wavebuffer nicht.
Plots mache ich nachher.
geht wavebuffer auch ohne analyse() nicht oder nur mit analyse() nicht ?
Habe ich auch schon versucht. Das bringt das selber Ergebnis.
wenn es mit Input geht, mit wavebuffer nach dem Kopieren aber nicht, heißt das aber, dass plötzlich schon das simple rüberkopieren der Werte nicht mehr abspielbar ist...?!
Hat es nicht früher schon mal funktioniert?
- - - Aktualisiert - - -
Fehler gefunden!
for(i=0;i<SHRT_MAX;i++) {
waveBuffer[SHRT_MAX] = (int32_t) input[i] & 0x00ff; <<<< hier ist ein Fehler!
// richtig:
for(i=0;i<SHRT_MAX;++i) {
waveBuffer[i] = input[i] & 0x00ff; <<<< richtig !
wenn es dann geht:
lass dir bitte mal anzeigen:
bias
maximal
minimal
signalstart
signalend
Wo du recht hast ;). Ist mir aber auch schon aufgefallen, damit geht es natürlich.Code:for(i=0;i<SHRT_MAX;i++) {
waveBuffer[SHRT_MAX] = (int32_t) input[i] & 0x00ff; <<<< hier ist ein Fehler!
// richtig:
for(i=0;i<SHRT_MAX;++i) {
waveBuffer[i] = input[i] & 0x00ff; <<<< richtig !
Die Bias... Ausgabe habe ich auch schon eingebaut, genau so wie im Falle eines Debug das Speichern von input und waveBuffer sowie die Möglichkeit eine gespeicherte Datei wieder zu laden.
Mit letzterem habe ich allerdings noch ein paar Schwierigkeiten.
Filtern ist auch in Analyse integriert.
Sobald das Laden funktioniert bau ich den Code hier ein.
- - - Aktualisiert - - -
Sooooo. 200x den Fehler übersehen. Dann doch gefunden ;)
Jetzt bist du auch in der Lage eine vom programm erstellte Datei wieder zu laden abspielen zu lassen. Gib einfach hinter dem Programmnamen den Namen der Datei ein. Fertig. Dann umgeht er die Aufnahme und nimmt stattdessen den Input der Datei,Code:#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <stdio.h>
#include <limits.h>
#include <math.h>
#include "diaSound.hpp"
bool debug = false;
bool ausgabe = true;
void analyse(int32_t *waveBuffer)
{
int32_t sbuf[128];
int32_t bias, minr, maxr, baseline,
signalstart, signalend;
int32_t maximum = waveBuffer[0];
int32_t minimum = waveBuffer[0];
int32_t maxpos, minpos;
int32_t i;
for(i=0;i<SHRT_MAX;i++)
{
if(waveBuffer[i] > maximum)
{
maximum = waveBuffer[i];
maxpos = i;
}
if(waveBuffer[i] < minimum)
{
minimum = waveBuffer[i];
minpos = i;
}
}
maximum = waveBuffer[0];
minimum = waveBuffer[0];
for(i=0;i<SHRT_MAX; ++i)
{
if(waveBuffer[i] > maximum)
{
maximum = waveBuffer[i];
maxpos = i;
}
if(waveBuffer[i] < minimum)
{
minimum = waveBuffer[i];
minpos = i;
}
}
// calculate baseline from last 100 waveBuffer cells:
// init vars
baseline=(waveBuffer[minpos] + waveBuffer[maxpos]) / 2; // init baseline by (min+max)/2
minr=baseline - 1;
maxr=baseline + 1;
// auto-adjust:
for(i=SHRT_MAX-100; i<SHRT_MAX; ++i)
{
// mean baseline
baseline = round((0.5*(float)waveBuffer[i] + 0.5*(float)baseline)) ;
// smoothed out max noise
if(waveBuffer[i] >= baseline) maxr = round((0.6*(float)waveBuffer[i] + 0.4*(float)maxr)) +1 ;
// smoothed out min noise
if(waveBuffer[i] <= baseline) minr = round((0.6*(float)waveBuffer[i] + 0.4*(float)minr)) -1 ;
}
bias = max(baseline-minr, maxr-baseline) +1;
// noise reduction start/end
// drop small noise
for(i=0;i<SHRT_MAX;++i)
{
if((waveBuffer[i]>baseline) && (waveBuffer[i] <= baseline + bias)) waveBuffer[i] = baseline ; // little higher value => drop to baseline
else
if((waveBuffer[i]<baseline) && (waveBuffer[i] >= baseline - bias)) waveBuffer[i] = baseline ; // little lower value => rise to baseline
}
// signalstart, signalend: threshold = bias + (bias/2)
signalstart = 0;
i = 0;
while((waveBuffer[i]<=baseline + 4 * bias/3) && (i<SHRT_MAX-1)) ++i;
signalstart = i;
if(i > 0) signalstart -= 1;
signalend=SHRT_MAX-1;
i=SHRT_MAX-1;
while((waveBuffer[i]<=baseline + + 4*bias/3) && (i>signalstart)) --i;
signalend = i;
if(i<SHRT_MAX-1) signalstart +=1;
if(ausgabe)
{
cout << "Bias: " << bias << endl;
cout << "Maximal: " << maximum << endl;
cout << "Minimal: " << minimum << endl;
cout << "Signalstart: " << signalstart << endl;
cout << "Signalende: " << signalend << endl;
}
}
int main(int argc, char *argv[])
{
fstream datei;
int32_t input[SHRT_MAX], waveBuffer[SHRT_MAX];
int32_t i;
if(argc <= 1) audioCapture(input, SHRT_MAX, "plughw:1,0", 1, 12000, 8);
else
{
datei.open(argv[1], ios::in);
for(i=0;i<SHRT_MAX;++i)
{
datei >> input[i];
}
datei.close();
}
if(debug) datei.open("input.csv", ios::out);
for(i=0;i<SHRT_MAX;i++)
{
waveBuffer[i] = input[i] & 0x00ff;
cout << i << " -> " << input[i] << endl;
if(debug) datei << input[i] << endl;
}
if(debug) datei.close();
analyse(waveBuffer);
if(debug)
{
datei.open("waveBuffer.csv", ios::out);
for(i=0;i<SHRT_MAX;i++) datei << waveBuffer[i] << endl;
datei.close();
}
if(ausgabe)
{
uint8_t *wave;
wave = (uint8_t *) malloc(SHRT_MAX+1);
for(i=0;i<SHRT_MAX;i++) wave[i] = waveBuffer[i];
playCaptured(wave, SHRT_MAX, "plughw:1,0", 1, 12000, 8);
free(wave);
}
return 1;
}
- - - Aktualisiert - - -
Plotten kannst du, wenn du selbst experimentierst dann jetzt auch. Geh einfach auf http;//sound.projekt-hirnfrei.de/index.php, lade die Datei hoch und warte kurz. Schon wird dir das Ergebnis angezeigt.
danke, dann mach ich mich mal dran ("ASAP"). ;)
Jetzt am Wochenende bin ich unterwegs und kann wenig mit nem Pi machen, ich nehme ihn trotzdem mit inkl. was zum bedienen dazu gehört.
- Mich interessiert nun, wie es jetzt klingt,
- was misst du an "bias", .. (blödes Wort, ich hatte es zuerst für eine Schwelle benutzt, jetzt eigentlich besser: "noise"),
- Wie groß sind max und min Ausschlag des Wortes,
- welchen Bereich hat er als "Wort" markiert (signal start/end) ?
- und kann man dein Originalwort unverstümmelt (!) noch genau so erkennen wie vorher, nur jetzt eben ohne Rausch- Vor- und Nachspann?
Fürs Plotten muss noch openVG in dein Programm rein, damit man die Plots von Dateien und allen möglichen Arrays direkt auf dem Raspi-Screen anschauen kann, während der Programmierung, zum Debuggen, zur laufenden Kontrolle, und zur Optimierung von Filtern:
http://www.mindstormsforum.de/viewto...p=67838#p67774
on-line zu plotten macht nur ausnahmsweise mal Sinn, wenn alles andere versagt.
Wir brauchen dann demnächst die Plot-Möglichkeit (einfach senkrechte Linien nebeneinander setzen) vor allem auch für die Graphen der FFT.
(wie das openVG dann mit ssh funktioniert, weiß ich allerdings nicht)
Für die Initialisierung des openVG-Fensters würde ich in mindestens (BxH) 640x480 oder sogar 1024x600 nehmen, dann kann man Koordinatensysteme in 512er Breite (evtl. sogar 1024) darstellen, eben entsprechend "gestaucht" (vgl. Arduino-Plots).
OpenVG benötigt folgende Befehls-Wrapper um die eigentliche Grafik-Ausgabe herum:
Code:#include "VG/openvg.h"
#include "VG/vgu.h"
#include "fontinfo.h"
#include "shapes.h"
int width, height;
initWindowSize(20, 20, 640, 480);
init(&width, &height); // Graphics initialization, cut away overhead
WindowOpacity(220); // define window opacity (0...255)
Background(0, 0, 0); // Black background
Start(width, height); // Start the picture
// >>>> hier kommt der Plot- Code rein fürs aktuelle Bild
Fill(255, 255, 255, 1); // White text (eigentlich besser: "TextColor()" )
StrokeWidth(1.0); // Zeichenstift-Breite (eigentlich besser: "BrushWidth()" )
Stroke(255, 255, 255, 1.0); // Zeichenstift-Farbe (eigentlich besser: "BrushColor()" )
// ... // ( ... more code for graphics)
End(); // Put the picture to the screen (eigentlich: "showPicture()" )
// <<<< Ende des aktuellen Bildes
finish(); // Graphics cleanup (end of program)
Hab ich ganz vergessen sorry.Code:Bias: 3
Maximal: 155
Minimal: 91
Signalstart: 4946
Signalende: 15557
Ich schaue mir dann mal das openvg an. Denke das wird sich realisieren lassen. Über ssh ist auch kein Problem, macht der Raspi das Fenster einfach auf meinem Desktop auf. Das ist ja das Schöne an ssh. Geany macht er ja auch auf meinem Rechner auf. Ich häng dir mal ein Bild an wie das bei mir auf dem Desktop aussieht.
Ich muss nachher aber an meiner Stromversorgung noch was machen. Habe gestern zwei Akkus auf unter 2V entladen. Nicht gut! Ist zwar schön zu sehen wie viel Spannung noch in den Akkus ist, aber wenn ich grade andere Sachen am Machen bin und nicht sehe was da angezeigt wird dann nutzt das nichts. Ich programmiere das nachher um so das der Raspi sich runter fährt wenn eine Zelle unter 2,6V fällt. Das ist aber kein grosses Problem.
ok, sehr schön!
Von der Aussteuerung ist ja noch etwas Platz nach oben (bis 255), aber nachdem das Rauschen nur etwa 3 ist, entspricht es nur ~ 2%: das ist perfekt!
Wenn allerdings später im Betrieb auch Motoren laufen... die machen teilweise ganz schönen Krach.
Aber dann kann man immer noch was dran drehen.
Und wie klingt jetzt der veränderte Array im Vergleich zum Original?
Hör es dir am Besten selbst an
http://sound.projekt-hirnfrei.de/input.csv
http://sound.projekt-hirnfrei.de/waveBuffer.csv
Ich habe auch mal krass rum experimentiert und einfach mal in analyse() waveBuffer komplett auf 0 gesetzt um zu sehen ob es auch so wieder in main raus kommt. Also das klappt prima!
Jetzt auf ein Geburtstag, dann mach ich mich an OpenVG.
Wenn ich mir das mit den ganzen Libs die es so gibt überlege ist Programmieren auch nichts anderes wie Lego ^^
super, dann kann man jetzt den Code vereinfachen und beschleunigen....
Road-Map:
Dazu brauchen wir eine andere Programm-Struktur, und dazu muss alles mit "debug" raus.
Das macht den Code auch überschaubarer.
1.) Muster-Erstellung
a) du nimmst eine Reihe von Wort-Samples auf:
JA.wav
NEIN.wav
STOPP.wav
b) der Micro- bzw. file- input[] array wird als Plot angezeigt
und dann direkt nach analyse geschickt und noise und Wort-Grenzen ermittelt.
c) jetzt wird NUR das Wort innerhalb der Wort-Grenzen nach wavbuffer kopiert
d) Der wave-Puffer startet jetzt an Stelle 0 mit dem wav-Wortsignal, der Rest bleibt 0.Code:memset(wavebuffer, 0, sizeof(wavebuffer) );
memcpy(wavebuffer, input+(signalstart*sizeof(char)), (signalend-signalstart)*sizeof(int32_t) );
// ich hoffe, ich habe mich jetzt mit memcpy nicht verhauen
// ansonsten soll das rauskommen:
// for (i=0; i<(signalend-signalstart); ++i) wavebuffer[i]=input[i+signalstart];
Der neue wav-Puffer wird ebenfalls als Plot angezeigt.
e) dann wird das "neue" wavebuffer-Muster als .wav Datei gespeichert.
JA_opt.wav
NEIN_opt.wav
STOPP_opt.wav
Das Plot-Programm könnte so aussehen:
Code:
int main() {
// Request a window size of 640*480 with top-left at 20,20
initWindowSize(20, 20, 640, 480);
init(&width, &height); // Graphics initialization
Start(width, height); // Start the picture
Background(0, 0, 0); // Black background
WindowOpacity(220); // Make the window little opaque
// ...
Finish(); // clean up graph window
}
void plotArray(int32_t * array, int32_t arrlength ) {
Fill(255, 255, 255, 1); // White text
StrokeWidth(1.0); // brush width
WindowClear();
Stroke(255, 255, 255, 1.0); // white lines
Line(10, 10, 10+255, 10); // ordinate
Line(10, 10, 10, 512); // abszisse
Stroke(0, 255, 0, 1.0); // green lines: wave pattern
for(uint32_t i=0; i<arrlength; ++i) {
Line(10+(i/64), 10, 10+(i/64), 10+(array[i]) ); // i=len=32768/64=512, array[i]_hi=255
}
End(); // End = paint the the picture
}
Wenn du das hast, lade doch bitte die 6 wav files mal hoch, dass ich sie kontrollieren kann (evtl. zum nachbessern).
wenn alles OK ist, kommt:
2.) Experimente mit der FFT und der cross correlation
- - - Aktualisiert - - -
3.) späteres Anwendungs-Programm:
a) später bekommen die wav-Muster-Files nur durchgehende Nummern plus einen Namenseintrag in einer Extra-Datei, in der Nummer und Namen miteinander verbunden werden, sodass man danach suchen kann, z.B.
0 (reserviert)
1 ja
2 nein
3 stopp
4 vorwärts
5 rückwärts
6 seitwarts
7 ran
...
;)
b) Das abschließende lauffähige Wort-Erkennungs-Programm kann sich von seinem Aufbau her im Prinzip an diesem NXC-Programm orientieren:
http://www.mindstormsforum.de/viewto...p=53924#p53924
aber vorher müssen noch etliche FFT-Tests laufen....
1.1 Für die Bearbeitung von wave-arrays und wave-files brauchen wir dann 5 Funktionen:
Code:
a) record_wave(int32_t * array, int32_t length); // Aufnahme von Tönen über Soundkarte => input-array
ähnlich wie audioCapture(input, SHRT_MAX, "plughw:1,0", 1, 12000, 8 );
b) save_wave2file(int32_t * array, char * filename); // speichern eines arrays als .wav File mit header
=> fehlt noch ?
c) wavefile2Array(int32_t * array, char * filename); // lesen von einem .wav File => in input-array
(extrahiert ohne header, nur data, ohne audio-Wiedergabe über Soundkarte)
d) play_waveArray(int32_t * array, int32_t length); // abspielen eines arrays mit festen Parametern
ähnlich wie playCaptured(wave, SHRT_MAX, "plughw:1,0", 1, 12000, 8 );
e) play_waveFile(char * filename); // abspielen eines wav-files mit Parametern laut Header-Daten,
ohne kopieren in einen temporären Array, ähnlich wie playwave(string waveDatei, string name)
Soundkarten-Daten getrennt konfigurieren
In die Sound-Lib sollte man dann noch zusätzlich aufnehmen diese 2 globalen #defines für Soundkarten:
#define SoundCard_Intern "plughw:0,0"
#define SoundCard_Extern "plughw:1,0"
diese Funktionen müssten dann genau so in deine wav-lib mit rein.
einverstanden?
Hilf mir mal... ich kriege openvg nicht installiert.
du bist doch auf dieser Seite...?
https://github.com/paeryn/openvg/
HALT STOPP !
- - - Aktualisiert - - -
dies ist der richtige Installationsbefehl, es wurde von Paeryn vlt nicht aktualisiert!
Code:sudo apt-get install libjpeg8-dev indent libfreetype6-dev ttf-dejavu-core
git clone git://github.com/paeryn/openvg
cd openvg
make
make library
sudo make install
Demo-Programm:
cd openvg
cd client
make test
- - - Aktualisiert - - -
falls das nicht klappt, schreib mal hier rein:
https://www.raspberrypi.org/forums/viewforum.php?f=69
ich habe meine Installation ja schon vor 1/2 Jahr gemacht, vielleicht wurde was verändert, aber nicht dokumentiert!
(Die Pi docus sind echt manchmal zum Kot***
Ok?
Ich hatte es von da geclont -> git clone git://github.com/ajstarks/openvg
Das könnte das erklären ;)
Vielleicht auch nicht :(
da scheint sich kein openvg.h dabei zu befinden.Code:pi@raspi:~/Entwicklung/openvg $ sudo make install
install -m 755 -p font2openvg /usr/bin/
install -m 755 -p libshapes.so /usr/lib/libshapes.so.1.0.0
strip --strip-unneeded /usr/lib/libshapes.so.1.0.0
ln -f -s /usr/lib/libshapes.so.1.0.0 /usr/lib/libshapes.so
ln -f -s /usr/lib/libshapes.so.1.0.0 /usr/lib/libshapes.so.1
ln -f -s /usr/lib/libshapes.so.1.0.0 /usr/lib/libshapes.so.1.0
install -m 644 -p shapes.h /usr/include/
install -m 644 -p fontinfo.h /usr/include/
pi@raspi:~/Entwicklung/openvg $
ja, so wars früher!
- - - Aktualisiert - - -
kannst du alle deinstallieren und von Paeryn neu installieren?
KEINE PFADE ÄNDERN!
Zitat:
sudo apt-get install libjpeg8-dev indent libfreetype6-dev ttf-dejavu-core
git clone git://github.com/paeryn/openvg
cd openvg
make
make library
sudo make install
wenns nicht geht:
im raspi.org Forum/openvg nachfragen!
https://www.raspberrypi.org/forums/viewforum.php?f=69
Habe ich schon. Habe es danach genau so wie du geschrieben hast installiert, dabei kam genau das raus.
wie gesagt, poste es mal hier, und schreibe @Paeryn drüber ;)
https://www.raspberrypi.org/forums/viewforum.php?f=69
Interessant. Der installiert das in:
Code:#include "/opt/vc/include/VG/openvg.h"
und geht's denn jetzt?
Natürlich nicht weil es kein bekannter Pfad ist. Andere Header finden es immer noch nicht. Ich muss schauen das muss ich wo anders hin kopieren.
So okay so hat er es jetzt wohl gefunden. Habe einfach den Inhalt von /opt/vc/include nach /usr/include kopiert.
- - - Aktualisiert - - -
Allerdings klappt das Linken jetzt nicht :(
hast du richtig gelinkt?
gcc -I/opt/vc/include -I/opt/vc/include/interface/vmcs_host/linux -I/opt/vc/include/interface/vcos/pthreads anysource.c -o anysource -lshapes
./anysource
entsprechende Settings für Geany - bisherige Einstellungen abändern! - :
Geany settings for compile:
g++ -Wall -pthread -I/opt/vc/include -I/opt/vc/include/interface/vmcs_host/linux -I/opt/vc/include/interface/vcos/pthreads -c "%f" -lshapes -lwiringPi -lrt
Geany settings for make/build:
g++ -Wall -pthread -I/opt/vc/include -I/opt/vc/include/interface/vmcs_host/linux -I/opt/vc/include/interface/vcos/pthreads -o "%e" "%f" -lshapes -L/opt/vc/lib -lOpenVG -lEGL -lwiringPi -lrt
Hast du eine Ahnung was
bedeutet? Das tritt auf nach init(&width, &height);Code:main: oglinit.c:123: oglinit: Assertion `success >= 0' failed.
hallo,
keine Ahnung, hatte ich noch nie. Ich hatte überhaupt noch nie Installationsprobleme auf meinen Pi 2, ich habe es 4 oder 5 mal auf verschiedenen SDs für meine Pis einfach exakt nach Vorschrift installiert - und dann liefs (direkt, ohne ssh), ohne irgendwas an den voreingestellten Pfaden vorher oder hinterher zu ändern.
Hast du vorher apt-get update/upgrade gemacht?
Hast du als Basis-Verzeichnis für die Installation /home/pi/ ?
Im Raspi-org Forum sind aber auch Paeryn und AjStarks selber dabei, um Fragen dazu zu beantworten.
- - - Aktualisiert - - -
hier habe ih im Github-Dschungel eine aktuelle Anleitung gefunden:
https://github.com/paeryn/openvg/tree/windowsave
Zitat:
pi@raspberrypi ~ $ sudo apt-get install libjpeg8-dev indent libfreetype6-dev ttf-dejavu-core libfontconfig1-dev
Next, build the library and test:
pi@raspberrypi ~ $ git clone git://github.com/paeryn/openvg
pi@raspberrypi ~ $ git checkout newfonts
pi@raspberrypi ~ $ cd openvg
pi@raspberrypi ~/openvg $ make
./shapedemo demo 10 # run through the demo, pausing 10 seconds between each one; contemplate the awesome.
To install the shapes library as a system-wide shared library
pi@raspberrypi ~/openvg $ make library
pi@raspberrypi ~/openvg $ sudo make install
Warum hackst du immer auf ssh rum? Ich benutze ssh auf vielen verschiedenen Rechnern seit Jahren aktiv ohne das es jemals Probleme gemacht hat!
Mein Problem war nicht die Installation sondern die Einträge in Geany. Compilieren geht ja prima, nur eben oben genannter Fehler tritt auf.
die letzten Infos die ich von dir hatte, waren:
Zitat:
Hilf mir mal... ich kriege openvg nicht installiert.
da scheint sich kein openvg.h dabei zu befinden.
Habe einfach den Inhalt von /opt/vc/include nach /usr/include kopiert
Allerdings klappt das Linken jetzt nicht
main: oglinit.c:123: oglinit: Assertion `success >= 0' failed.- bedeutet? Das tritt auf nach init(&width, &height);
Nachdem ich dir die Geany settings kopiert habe, die bei mir schon ewig ohne probs funktionieren, kann es nur an Unterschieden zwischen unseren Setups liegen:
Pi 3 statt 2
ssh statt lokal
dabei installiert von /home/pi ?
Pfade verändert?
shapes library als system-wide shared library installiert?
openvg lib / fork identisch?
Jessie identisch geupdated?
Einer dieser Punkte muss es sein, und ssh ist lediglich einer von ihnen, allerdings einer, den ich (ebenso wie Pi3, im Gegensatz zu den anderen) nicht kontrollieren kann, auf mehr wollte ich nicht hinweisen.
Letzter Stand für mich also hieß:
es funktionert immer noch nicht bei dir.
Außerdem habe ich auch nichts gefunden, wo du die Fehler im Raspi.org Forum angefragt hättest.
Gehen wir das mal durch:
Pi 3 statt 2 <- Möglich, aber halte ich für unwahrscheinlich
ssh statt lokal <- Geprüft, fällt ebenfalls raus
dabei installiert von /home/pi ? <- Ja, aber das dürfte prinzipiell keinen Unterschied machen
Pfade verändert? <- nein
shapes library als system-wide shared library installiert? <- nehme ich doch mal an, da ich es genau so installiert habe wie du sagtest
openvg lib / fork identisch? <- habe exakt das genommen wo du sagtest
Jessie identisch geupdated? <- ist aktuell
WIe gesagt, compilieren funktioniert ohne Fehler, aber dann kommt eben diese Meldung
OT
Benutzt du ausser dem Raspi noch andere Rechner mit Linux und falls nein, benutzt du den von Rasbian vorgegebenen LXDE als Desktop?
es wird ein Unter-Verzeichnis relativ zum Startverzeichnis des Benutzers angelegt, von dem aus die Installtion erfolgt,
also bei Installationsbeginn von
/home/pi/
jetzt ein Verzeichnis
/home/pi/openvg
heißt also:
anderes Startverzeichnis => Pfade sind anders
Systemweit freischalten, heißt dann
pi@raspberrypi ~/openvg $ make library
pi@raspberrypi ~/openvg $ sudo make install
ok?
Ich habe übrigens nicht die allerneueste openvg Version, meine ist 6 Monate alt und seitdem nicht neu installiert (ist mir zuviel Aufwand mit allem und jedem).
Auch Jessie ist VOR 2016-Apr-10, weil danach einige Libs nicht mehr liefen. Schei** Linux.
außer meinen Pi 2 habe ich (gottseidank) keine weiteren Linux Rechner, und auf allen Pis läuft der Jessie Standard-GUI-Desktop, wie auch immer der heißen mag :-/
Bitte poste deine Fage zur Fehlermeldung mal im Raspi.org Forum, und zwar im englischen openvg-Unterforum, denn v.a. dort guckt auch Paeryn ab und zu.
Werde ich tun.
Wenn die Installation wirklich abhängig vom Ordner ist, dann hat sich da aber einer nicht wirklich Mühe gegeben. Normalerweise werden sollte Ding automatisch von / ab also dem absoluten Wurzelordner installiert. Da ist es egal wo du die Installationsdatei hin legst. Aber habe ich in meinem Home Verzeichnis gemacht, daran liegt es also auch nicht.
Auch make library und install habe ich gemacht.
Aber wenn du wirklich den Desktop von Raspbian als Massstab anlegst wundert es mich nicht das du Windows besser findest :). Habe eben ne halbe Stunde dran gearbeitet und neeee. Direkt Mate installiert. Das flitzt genau so schnell und ist um Klassen besser!
Der Desktop ist gar nicht sooo schlecht.
Mein Problem mit Linux ist, dass ich nichts mit Kommandozeilen zu tun haben will und nichts mit dem editieren von irgendwelchen config-Files und dem schauderhaften "sudo nano", sondern alles mit grafischen benutzerfreundlichen Menüs direkt über Links und Menüs vom Desktop aus erledigen will.
Ein Programm will ich installieren können, indem ich irgendwo auf ein "install.exe" doppelklicke, und ich will es wieder loswerden per Doppelklick auf "uninstall.exe".
Und vor allem will ich auch nichts mehr mit dem grauenhaften "sudo" zu tun haben müssen. Aber das ist eben Linux pur.
Egal.
Kannst du jetzt einen wave-array per openvg plotten? (mein Code dazu siehe weiter oben!)
Nein noch nicht. Ich sag bescheid wenns klappt.
Das ist Linux pur? Dann scheine ich ein anderes OS zu haben ^^.
- - - Aktualisiert - - -
Muhaha ich hab den Fehler!
Ich hatte den experimentellen GL Treiber aktiv!
ach du schei***.
Und du hast Linux ohne Kommandozeile, ohne Terminalfenster und ohne sudo?
Super, das will ich auch.
Ich glaube, das heißt aber anders... Mac oder XP oder so... ;)
So ich hab jetzt noch was zu erledigen, dann schaue ich mir das mit dem Plotten an.
Ohne sudo ja. Aber Gentoo ist ganz sicher nichts für dich ^^.
Meine Frau hat Linux Mint und die hat noch nie den Terminal oder irgendeine Kommandozeile gesehen.
hat deine Frau jemals config- oder andere Systemfiles ändern, löschen oder verschieben müssen/können ohne sudo?
Und wie installiert sie Programmier-Libs mit git-clone oder apt-get ohne Terminal?
Wie führt sie gpio-Zugriffe aus ohne sudo (Hardware-pwm, i2c-0 freischalten)?
Wie ändert sie die HDMI-Anzeige, indem sie bestimmte Auflösungen "erzwingt", und das ohne Neustart?
hat deine Frau jemals config- oder andere Systemfiles ändern, löschen oder verschieben müssen/können ohne sudo?
Nein. Alles mit GUI
Und wie installiert sie Programmier-Libs mit git-clone oder apt-get ohne Terminal?
Synaptic Packetverwaltung. Ebenfalls alles GUI.
Wie führt sie gpio-Zugriffe aus ohne sudo (Hardware-pwm, i2c-0 freischalten)?
Gar nicht, sowas macht sie nicht.
Wie ändert sie die HDMI-Anzeige, indem sie bestimmte Auflösungen "erzwingt", und das ohne Neustart?
Neustart? Was ist das? Indem sie entsprechende Auflösung im entsprechenden Fenster anwählt. Aber ich glaube seit der Installation musste sie das nicht mehr.
da scheint es ja immerhin Linux zu geben, das dem Jessie ein wenig vorraus hat. Wahrscheinlich läuft es aber dann doch nicht mit dem device tree, den man für wiringPi und die kernel-kontrollierten gpios braucht. Die Auflösung ändern muss ich halt öfters für meine 5, 7, 10 und 24" HDMIs, und auf den kleinen läuft nichts automatisch richtig - immer muss man erst wieder /boot/config.txt patchen, mit sudo-Rechten ntl.
Egal: zurück zum wav-Problem 8-)
Geiler Scheiss, wenn ich das so sagen darf...
Komme heim, mein Computer aus. Ich will ihn starten, geht er kurz an und sofort wieder aus und seither macht er nichts mehr anderes. Super! Aus Mangel an Ersatz muss jetzt der Raspi als Desktop herhalten bis ich nen Neuen hab :(
herzliches Beileid!
:cry: