- Akku Tests und Balkonkraftwerk Speicher         
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
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    So. Code eingebaut, etwas angepasst, ausprobiert. Läuft!

    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;
    }
    Rauscht noch ein wenig, aber ich denke es ist schon um einiges besser!

    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

  2. #2
    HaWe
    Gast
    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.
    Geändert von HaWe (09.06.2016 um 08:32 Uhr)

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    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.

  4. #4
    HaWe
    Gast
    geht wavebuffer auch ohne analyse() nicht oder nur mit analyse() nicht ?

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Habe ich auch schon versucht. Das bringt das selber Ergebnis.

  6. #6
    HaWe
    Gast
    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

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    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 !
    Wo du recht hast . Ist mir aber auch schon aufgefallen, damit geht es natürlich.

    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

    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;
    }
    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,

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

Ä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
  •  

Solar Speicher und Akkus Tests