- 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
    naja, warum ... wegen des PCs, den du dann nicht mehr brauchst, nur deswegen.

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Schon. Aber dann brauche ich wieder Platz für noch einen Monitor, noch eine Tastatur und noch eine Mouse. Von daher.

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

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

  5. #5
    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)

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

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

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

12V Akku bauen