- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 241

Thema: wav Dateien: Programieren von Wiedergabe und Aufnahme

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    moin!
    ich schätze die C-Syntax sehr, weil sie ungeheuer mächtig und perfekt prozedural strukturierbar ist, aber ich bin Hobby-Programmierer und IDEs und USB-p'n'p gewöhnt (wie bei der Arduino IDE oder der Lego BricxCC IDE), und ich würde mich niemals als "typischen" C-Programmierer bezeichnen (C++ beherrsche ich selber gar nicht). Mit der ganzen Linkerei und make, makefile, .so files, logins und IPs will ich nichts zu tun haben, auch nichts mit Terminals (außer automatisch per USB verbinden ohne weitere Einstellungen wie bei Arduino und Serial).
    IDE komplett installieren per setup.exe etc.
    Programm schreiben in einer IDE
    Compilieren per Tastendruck
    Hochladen per Tastendruck (falls nötig)
    Starten per Doppelklick oder Tastendruck
    - so einfach muss Hobbyprogrammieren gehen, das ist mein Level, und genau so funktioniert ja auch Arduino.

    was die Anzeige angeht: so wie bei meinem Code-Voschlag oben wäre es eigentlich perfekt, da auch auf kleinen Screens (5", 7") dann skalierbar und gut erkennbar.
    Code:
    void plotArray((int32_t *array, int32_t  arrlength, int y0) {
    
       float xscale=1.0, border=100.0;   // border anpassen !
       xscale =  (float) (arrlength-border)/_width_;  // Ausschöpfung der gesamten openVG-Window-Breite width samt Rand!
    
       Fill( CYAN, 1 );      
       for(i=0;i<arrlength;i++)
       {		
          Line((VGfloat)xscale*i, (VGfloat) y0, (VGfloat)xscale*i, (VGfloat)(y0+input[i]) );
       }
       End();  
    }

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Du teilst falsch. Du musst die Bildbreite durch die array Länge teilen, nicht umgekehrt.

    Code:
    #include <iostream>
    #include <vector>
    #include <fstream>
    #include <string>
    
    #include <stdio.h>
    #include <limits.h>
    #include <math.h>
    
    #include <VG/openvg.h>
    #include <VG/vgu.h>
    #include <fontinfo.h>
    #include <shapes.h>
    
    #include "diaSound.hpp"
    
    #define BLACK     0,   0,   0
    #define WHITE   255, 255, 255
    #define MAGENTA 255,   0, 255
    #define RED     255,   0,   0
    #define YELLOW  255, 255,   0
    #define LIME      0, 255,   0
    #define GREEN     0, 128,   0
    #define CYAN      0, 255, 255
    #define AQUA    102, 204, 204
    #define BLUE      0,   0, 255
    
    int   _width_=1024, _height_=600;
    int   _fontsize_ = 10;
    
    
    
    bool ausgabe = true;
    
    void initOpenVG() 
    {
    	initWindowSize(0, 0, _width_, _height_);
    	init(&_width_, &_height_);               
    	Start(_width_, _height_);                   
    	Background(0, 0, 0);                             
    	StrokeWidth(1.0);
    	WindowClear();
    }
    
    void plotArray(int32_t *array, int32_t arrlength, int y0) 
    {
    	float xscale=1.0, border=100.0;
    	xscale = _width_ / (float) (arrlength-border);
    
    	int i;
    
     	Fill(CYAN, 1); 
    	Stroke(0, 255, 255, 1);
    	     
    	for(i=0;i<arrlength;i++)
    	{		
    		Line((VGfloat)xscale*i, (VGfloat) y0, (VGfloat)xscale*i, (VGfloat)(y0+array[i]));
    	}
    	End();  
    }
    
    void analyse(int32_t *array, int32_t arrlength)
    {
    	int32_t     sbuf[128];
    	int32_t     bias, minr, maxr, baseline, 
    				signalstart, signalend;
    
    	int32_t maximum = array[0];
    	int32_t minimum = array[0];
    	
    	int32_t maxpos, minpos;
    	
    	int32_t i;
    
    	for(i=0;i<arrlength;i++)
    	{
    		if(array[i] > maximum)
    		{
    			maximum = array[i];
    			
    			maxpos = i;
    		}
    
    		if(array[i] < minimum)
    		{
    			minimum = array[i];
    			
    			minpos = i;
    		}
    	}
    	
    	maximum = array[0];
    	minimum = array[0]; 
    
    	for(i=0;i<arrlength; ++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=arrlength-100; i<arrlength; ++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<arrlength;++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=arrlength-1;
    
    	i=arrlength-1;
    
    	while((array[i]<=baseline + + 4*bias/3) && (i>signalstart)) --i;
    
    	signalend = i;
    
    	if(i<arrlength-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 waveBuffer[SHRT_MAX];
    
    	int32_t i;
    
    	char s[3];
    
    	initOpenVG();
    
    	if(argc <= 1) audioCapture(waveBuffer, SHRT_MAX, "plughw:1,0", 1, 12000, 8);
    	else
    	{
    		datei.open(argv[1], ios::in);
    		
    		for(i=0;i<SHRT_MAX;++i)
    		{
    			datei >> waveBuffer[i];
    		}
    		
    		datei.close();
    	}
    	
    	for(i=0;i<SHRT_MAX;i++)
    	{
    		waveBuffer[i] = waveBuffer[i] & 0x00ff;
    	} 
    	
    	plotArray(waveBuffer, SHRT_MAX, 0);
    
    	analyse(waveBuffer, SHRT_MAX);
    
    	plotArray(waveBuffer, SHRT_MAX, 255);
    
    	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);
    	}
    
    	fgets(s, 2, stdin);
    
    	SaveEnd("plott.raw");
    
    	finish();
    	
    	return 1;
    }
    sind noch weitere Änderungen im Code drin.

  3. #3
    HaWe
    Gast
    klar, stimmt ntl mit dem Teilen! :rolleyes:
    (das ist der Nachteil vom offline Programmieren ;) )

    mit dem if (ausgabe) und dem if(argc) komme ich allerdings nicht klar, denn ich starte ja aus geany heraus und nie von der Kommandozeile aus.

    Vielleicht könnten wir später ein Menü einbauen, im Moment ist es aber eh nicht wichtig, denn die nächsten Schritte wären ja laut
    https://www.roboternetz.de/community...l=1#post628055

    a) du nimmst eine Reihe von Wort-Samples auf:
    JA_raw.wav
    NEIN_raw.wav
    STOPP_raw.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
    Code:

    memset(wavebuffer, 0, sizeof(wavebuffer) );
    memcpy(wavebuffer, input+(signalstart*sizeof(char)), (signalend-signalstart)*sizeof(int32_t) );

    d) Der wave-Puffer startet jetzt an Stelle 0 mit dem wav-Wortsignal, der Rest bleibt 0.
    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
    da wir das Plotten ja inzwischen mit variabler Basislinie machen können, könnte man alle 2-3 Plots für den Anfang immer untereinander im selben Fenster anzeigen:
    a) unverändert: y0=300-400
    b) ent-rauscht: y0=200 (kann entfallen)
    c) geschnitten: y0=1

    Das dient zur in-Prozess-Kontrolle bei den vorhergehenden und den folgenden Schritten...
    denn dann käme ja als nächstes eine kleine Erweiterung der alsa-API mit den vereinfachten Funktionen zum schnelleren abspielen, aufnehmen und um-kopieren von files und arrays nacheinander und ineinander:

    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"
    Geändert von HaWe (13.06.2016 um 16:49 Uhr)

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Du bist echt stur mit deinem Geany . Lieber ein Menü rein stricken wie ein Terminal öffnen ^^

    Ich bau dir was.

    Warum willst du das Ganze als Wave mit Header speichern??

  5. #5
    HaWe
    Gast


    wenn man als Menüpunkt/Aktion wählt "aufnehmen", dann nimmt man einen Sound ja über die Soundkarte als reinen Array auf.

    Wenn man ihn jetzt als Muster später wieder benutzen will, muss man ihn ja als .wav speichern.

    JA.wav
    NEIN.wav
    STOPP.wav

    Nur dann kann man ja später auch aktuelle Wörter mit allen bekannten gespeicherten Mustern vergleichen, um festzustellen, wie denn das Wort nun heißen mag...

    und wenn nichts annähernd identisches vorhanden ist an Mustern, z.B. bei
    VORWÄRTS!
    dann kann man es gleich als neues .wav Muster speichern, für künftige Vergleiche.
    VORWAERTS.wav

    und somit hat man dann ein weiteres, neues Wort in seinem Wortschatz.
    Und man kann jetzt auch direkt einzelne Wörter seines Wortschatzes abhören, wie sie klingen, und ob sie ggf. noch etwas von der Qualität her verbessert werden können/müssen.




    nach jeder Aktion im Programm könnte man also zum Menü zurückkehren:

    Kommando-Center:
    ==============
    0 Soundfile *.csv in Programm öffnen / laden (FileOpenDialog)
    1 Soundfile *.wav in Programm öffnen / laden (FileOpenDialog)
    2 Soundfile *.wav öffnen / abspielen + Plot (FileOpenDialog)
    3 Sound aufnehmen per Micro / SoundCard
    4 akt. Sound (Array im RAM) abspielen + Plot
    5 akt. Sound optimieren (noise/cut)
    6 akt. Sound (im RAM) als File speichern unter... (FileSaveDialog)
    7 akt. Sound an FFT + Plot
    8 akt. Sound cross correlation mit 1 wav File (FileOpenDialog)
    9 akt. Sound cross correlation mit allen *.wav Files (auto)
    ...
    Geändert von HaWe (16.06.2016 um 08:58 Uhr) Grund: opt.

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Hier erstmal das Menü.

    Code:
    #include <iostream>
    #include <vector>
    #include <fstream>
    #include <string>
    
    #include <stdio.h>
    #include <limits.h>
    #include <math.h>
    
    #include <VG/openvg.h>
    #include <VG/vgu.h>
    #include <fontinfo.h>
    #include <shapes.h>
    
    #include "diaSound.hpp"
    
    #define BLACK     0,   0,   0
    #define WHITE   255, 255, 255
    #define MAGENTA 255,   0, 255
    #define RED     255,   0,   0
    #define YELLOW  255, 255,   0
    #define LIME      0, 255,   0
    #define GREEN     0, 128,   0
    #define CYAN      0, 255, 255
    #define AQUA    102, 204, 204
    #define BLUE      0,   0, 255
    
    int   _width_=1024, _height_=600;
    int   _fontsize_ = 10;
    
    string version = "2.0";
    
    bool ausgabe = true;
    
    void initOpenVG() 
    {
    	initWindowSize(0, 0, _width_, _height_);
    	init(&_width_, &_height_);               
    	Start(_width_, _height_);                   
    	Background(0, 0, 0);                             
    	StrokeWidth(1.0);
    	WindowClear();
    }
    
    void plotArray(int32_t *array, int32_t arrlength, int y0) 
    {
    	float xscale=1.0, border=100.0;
    	xscale = _width_ / (float) (arrlength-border);
    
    	int i;
    
     	Fill(CYAN, 1); 
    	Stroke(0, 255, 255, 1);
    	     
    	for(i=0;i<arrlength;i++)
    	{		
    		Line((VGfloat)xscale*i, (VGfloat) y0, (VGfloat)xscale*i, (VGfloat)(y0+array[i]));
    	}
    	End();  
    }
    
    void analyse(int32_t *array, int32_t arrlength)
    {
    	int32_t     sbuf[128];
    	int32_t     bias, minr, maxr, baseline, 
    				signalstart, signalend;
    
    	int32_t maximum = array[0];
    	int32_t minimum = array[0];
    	
    	int32_t maxpos, minpos;
    	
    	int32_t i;
    
    	for(i=0;i<arrlength;i++)
    	{
    		if(array[i] > maximum)
    		{
    			maximum = array[i];
    			
    			maxpos = i;
    		}
    
    		if(array[i] < minimum)
    		{
    			minimum = array[i];
    			
    			minpos = i;
    		}
    	}
    	
    	maximum = array[0];
    	minimum = array[0]; 
    
    	for(i=0;i<arrlength; ++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=arrlength-100; i<arrlength; ++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<arrlength;++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=arrlength-1;
    
    	i=arrlength-1;
    
    	while((array[i]<=baseline + + 4*bias/3) && (i>signalstart)) --i;
    
    	signalend = i;
    
    	if(i<arrlength-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 waveBuffer[SHRT_MAX];
    
    	int32_t i;
    
    	char s[3], m[3];
    
    	initOpenVG();
    
    	system("clear");
    	
    	cout << endl << "HaWe und Hirnfreis's Sound Experiment V " << version << endl << endl;
    	cout << "     1. Audio aufnahme" << endl;
    	cout << "     2. input.csv abspielen" << endl;
    	cout << "     3. waveBuffer.csv abspielen" << endl << endl;
    	cout << "     Bitte wählen: ";
    	
    	fgets(m, 2, stdin);
    	
    	if(strcmp(m, "1") == 0) 
    	{
    		cout << endl << "Starte Aufnahmne... " << endl << endl;
    		
    		audioCapture(waveBuffer, SHRT_MAX, "plughw:1,0", 1, 12000, 8);
    
    		cout << endl << "Aufnahmne beendet! " << endl << endl;
    	}
    	
    	if(strcmp(m, "2") == 0) 
    	{
    		cout << endl << "Spiele input.csv ab!" << endl << endl;
    		
    		datei.open("input.csv", ios::in);
    		
    		for(i=0;i<SHRT_MAX;++i)
    		{
    			datei >> waveBuffer[i];
    		}
    		
    		datei.close();
    	}
    	
    	if(strcmp(m, "3") == 0) 
    	{
    		cout << endl << "Spiele waveBuffer.csv ab!" << endl << endl;
    
    		datei.open("waveBuffer.csv", ios::in);
    		
    		for(i=0;i<SHRT_MAX;++i)
    		{
    			datei >> waveBuffer[i];
    		}
    		
    		datei.close();
    	}
    	for(i=0;i<SHRT_MAX;i++)
    	{
    		waveBuffer[i] = waveBuffer[i] & 0x00ff;
    	} 
    	
    	plotArray(waveBuffer, SHRT_MAX, 0);
    
    	analyse(waveBuffer, SHRT_MAX);
    
    	plotArray(waveBuffer, SHRT_MAX, 255);
    
    	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);
    	}
    
    	fgets(s, 2, stdin);
    
    	SaveEnd("plott.raw");
    
    	finish();
    	
    	return 1;
    }
    - - - Aktualisiert - - -

    Ich sehe aber keinen Grund da ein wave draus zu bauen. speichern und abspielen kann man auch mit meiner Variante und muss nicht erst noch Header erstellen und auslesen# Wäre in meinen Augen nur unnötiger Aufwand.

  7. #7
    HaWe
    Gast
    das ging ja super schnell!



    allerdings soll nicht csv geladen / abgespielt / gespeichert werden, sondern *.wav Dateien (ggf. ~auswahl wie im Filebrowser).

    Gespeichert werden sollen nur echte .wav Formate, keine reinen Arrays.



    das Konzept ist:

    im RAM befindet sich immer ein Array mit den reinen sound data,
    auf der SD befinden sich viele (!) .wav Dateien: die bilden den Wortschatz bekannter (zu erkennender) Wortbefehle.
    Sie müssen während der Testphase und auch später im Automatik-Betrieb nacheinander geöffnet, gespielt, bearbeitet und verglichen werden können.

    Zum Bearbeiten werden .wav Files geöffnet und die reinen sound data in einen array ins RAM kopiert,
    Per Micro wird auch nur ein Array im RAM belegt,
    bei Speichern wird aber wieder der komplette wav-Header davor geschrieben.



    dazu dienen unsere Werkzeuge, und die sind:

    a) record_wave(int32_t * array, int32_t length);
    b) save_wave2file(int32_t * array, char * filename);
    c) wavefile2Array(int32_t * array, char * filename);
    d) play_waveArray(int32_t * array, int32_t length);
    e) play_waveFile(char * filename);
    sowie
    f) plotArray(int32_t * array, int32_t length, int y0);
    g) analyseArray(int32_t * array, int32_t length);
    h) array2FFT(int32_t * array, int32_t length, double * fx, double * fy, int32_t FFT_length);
    i) cross_corr(int32_t * array, int32_t * pattern, int32_t length);
    ...usw...
    Geändert von HaWe (13.06.2016 um 17:49 Uhr)

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Wie im Filebrowser??????????????????????????? Der Aufwand wird etwas gross! Je nachdem wie viele Dateien das sind muss dann auch noch aufteilen und scrollen usw. rein. Also das ist mir dann doch zu viel des Guten.

    Aber nochmal. Was spricht gegen das Speichern des Array? Ich sehe keinen Sinn darin ein ganzes Wave da zu bauen.

Ähnliche Themen

  1. Video Aufnahme (+12std.)
    Von highdef im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 8
    Letzter Beitrag: 03.06.2011, 10:08
  2. led ein/aus programieren
    Von anthony im Forum PIC Controller
    Antworten: 6
    Letzter Beitrag: 15.07.2008, 17:44
  3. hex-dateien in bin-dateien umwandeln
    Von roboterheld im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 02.10.2007, 20:25
  4. Richtiges Drehen einer Flasche/Dose zur Aufnahme
    Von ähM_Key im Forum Mechanik
    Antworten: 2
    Letzter Beitrag: 06.10.2006, 15:43
  5. Automatische Audio-Aufnahme
    Von the_Ghost666 im Forum Software, Algorithmen und KI
    Antworten: 6
    Letzter Beitrag: 11.09.2005, 20:27

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test