- 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
    nein, mach mal folgendes:

    for(int i=0; i<SHRT_MAX, ++i) input[i]=input[i] & 0x00ff;

    und dann guck, ob du es immer noch abspielen kannst!

    (ps, dein letzter Link ist kaputt)

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Habe ich gemacht, ja kann ich noch problemlos abspielen!

    und der Link geht jetzt auch. Hatte mich vertippt.

    - - - Aktualisiert - - -

    Nachdem was ich bis jetzt so gelesen habe kommen bei Stereo die Daten immer abwechselnd. Erst Links dann Rechts.

    - - - Aktualisiert - - -

    Hast du das schon gesehen? http://www.fftw.org/

  3. #3
    HaWe
    Gast
    ja, das mit Stereo weiß ich, die Frage ist: alle in derselben int32 Zelle oder in 2 aufeinanderfolgenden?

    aber das ist jetzt nicht mehr wichtig.

    Wir wissen jetzt:
    die Sound-Daten im Input-Array entsprechen ganz exakt den Micro-sound(wav)-Schwingungsdaten, die wir weiterverarbeiten können.

    also speichern wir jetzt am besten input in einem wavbuffer (um input zu schonen):

    int32_t wavbuffer[SHRT_MAX];
    memcpy(wavbuffer, input, sizeof(input) );
    for(int i=0; i<SHRT_MAX, ++i) wavbuffer[i] &= 0x00ff;


    wav buffer müssen wir jetzt analysieren:

    Bandbreite der Werte/Dynamik:
    min-Wert=?
    max-Wert=?

    Code:
    
    
    bis wo geht der Vorspann,
    d.h. wo fängt das eigentliche Wort an,
    und wo beginnt der Nachspann, d.h. wo hört das Wort auf.

    dann:
    wie groß ist die Schwingungsbreite (Dynamik) im Vor/Nachspann?
    126-130? oder größer?
    Geändert von HaWe (04.06.2016 um 20:23 Uhr)

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Warum ein neues Array anlegen? Können wir nicht das nutzen was wir schon haben?

    min-Wert ist 0
    max-Wert ist 255

    Ja die Schwinungsbreite von vor und nach müsste so zwischen 120 und 132 liegen.

    Wo nun vor und nachspann anfangen, wie ich das kläre weiss ich nicht.

  5. #5
    HaWe
    Gast
    Mist, der blöde Editor hat mich rausgeschmissen...

    nein, ich will das Original behalten, zur Sicherheit, deshalb zusätzlicher wavbuffer.

    max-Wert und Minwert htte ich grade gepostet, wurde aber von dem blöden editor gelöscht weil mich das Forum ausgeloggt hat. Abrer das kannst du selber....

    - - - Aktualisiert - - -

    hierfür eine Funktion mit Rückgabewert anlegen:
    Code:
      maximum = wavbuffer[0];
      int32_t maxpos;
      for (i = 1; i < size; i++)
      {
        if (wavbuffer[i] > maximum)
        {
           maximum  = wavbuffer[i];
           maxpos= i+1;
        }
      }
    Minimum analog

    - - - Aktualisiert - - -

    wir müssten für Vorspann und Nachspann wissen, ob wirklich immer einer existiert, oder ob alles der komplette aufgenommene Sound ist.
    Nur wenn künftig überall Vor-oder Nachspann vorkommen, kann man das also analysieren und verwenden

    - - - Aktualisiert - - -

    wenn wir aufpassen, dass unsere Kommandos immer kürzer sind als die etwa 3 sec., kann man die Dynamik der letzten 100 Zellen verwenden (~10 ms):

    minr = minimum der letzten 100 zellen (optimiert: ebenfalls zu heftige Spikes nach unten rausschneiden)
    maxr = maximum der letzten 100 zellen (optimiert: ebenfalls zu heftige Spikes nach oben rausschneiden)

    baseline = arithmet. Mittel der letzten 100 zellen (baseline)

    bias = min(baseline-minr, maxr-baseline); // <=== Bandbreite um Mittelwert

    - - - Aktualisiert - - -

    wenn wir dann die Ober- und Untergrenzen des Grundrauschens kennen, können wir das bias abschneiden:
    Code:
    for(int i=0; i<SHRT_MAX; ++i) {
      if( (wavbuffer[i]>baseline ) && (wavbuffer[i]< baseline + bias)) wavbuffer[i] = baseline ; // kleine Schwankung => auf Baseline
      else
      if( (wavbuffer[i]<baseline ) && (wavbuffer[i]> baseline - bias)) wavbuffer[i] = baseline ; // kleine Schwankung => auf Baseline
    oh mann, wenn wir doch nur IMMER codetags im Editor hätten....!

    (ich hoffe, ich habe mich jetzt nicht verkalkuliert mit dem "Entrauschen"...)
    Geändert von HaWe (05.06.2016 um 12:11 Uhr)

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Schneiden wir dann nicht auch diese Teile aus dem Wort raus?

    Hier mal ein Update von der main

    Code:
    #include <iostream>
    #include <vector>
    #include <fstream>
    
    #include <stdio.h>
    #include <limits.h>
    
    #include "diaSound.hpp"
    
    bool debug = false;
    
    void analyse(int32_t *waveBuffer)
    {
    	int32_t maximum = waveBuffer[0];
    	int32_t minimum = waveBuffer[0];
    	
    	int32_t maxpos, minpos;
    	
    	int i;
    
    	for(i=0;i<SHRT_MAX;i++)
    	{
    		if(waveBuffer[i] > maximum)
    		{
    			maximum = waveBuffer[i];
    			
    			maxpos = i + 1;
    		}
    
    		if(waveBuffer[i] < minimum)
    		{
    			minimum = waveBuffer[i];
    			
    			minpos = i + 1;
    		}
    	}
    }
    
    int main()
    {
    	fstream datei;
    	
    	int32_t input[SHRT_MAX], waveBuffer[SHRT_MAX];
    
    	int i;
    
    	uint8_t *wave;
    	
    	audioCapture(input, SHRT_MAX, "plughw:1,0", 1, 12000, 8);
    	
    	wave = (uint8_t *) malloc(SHRT_MAX+1);
    	
    	if(debug) datei.open("test.csv", ios::out);
    	
    	for(i=0;i<SHRT_MAX;i++)
    	{
    		wave[i] = input[i] & 0x00ff;;
    
    		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();
    
    	playCaptured(wave, SHRT_MAX, "plughw:1,0", 1, 12000, 8);
    	
    	free(wave);
    	
    	return 1;
    }

  7. #7
    HaWe
    Gast
    wenn wir soweit sind, können wir probeweise dieses Veränderte Array einmal abspielen und horchen, wie es klingt...
    dann gehts weiter...
    (ich habe schon eine Idee)


    kleine Optimierung für analyse():

    Code:
    void analyse(int32_t *waveBuffer)
    {
    	int32_t maximum = waveBuffer[0];
    	int32_t minimum = waveBuffer[0];
    	
    	int32_t maxpos, minpos;
    	
    	uint32_t i; // falls man mal aus Versehen 1 zu weit zählt...
    
    	for(i=0; i<SHRT_MAX; ++i)  {
    		if(waveBuffer[i] > maximum) {
    			maximum = waveBuffer[i];			
    			maxpos = i ;  // genaue Zellen-Nummer
    		}
    
    		if(waveBuffer[i] < minimum) {
    			minimum = waveBuffer[i];			
    			minpos = i ;
    		}
    	}
    }
    heute abend kann ich selber nicht am Raspi programmieren, du könntest mir aber mal deinen input als zipfile hochladen, dann kann ich morgen mal dran arbeiten.

    - - - Aktualisiert - - -

    Schneiden wir dann nicht auch diese Teile aus dem Wort raus?
    was sind das für Teile, die du meinst ?


    und wofür braucht du noch wave und diese Zeilen...?

    wave = (uint8_t *) malloc(SHRT_MAX+1);
    wave[i] = input[i] & 0x00ff;;

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    wave ist für die Ausgabe. Hat eigentlich nur Kontrollfunktion ob im Gerät auch das ankommt was man rein geredet hat. Das kann im letztendlichen Code raus.

    Was ist der Unterschied zwischen i++ und ++i?????

    Und was genau soll ich hoch laden? Die Daten vom Mikro? Falls ja, dass ist das was in test.cvs drin steht.

    - - - Aktualisiert - - -

    Und mit Teile raus schneiden, wenn wir alles raus schneiden was die Werte von Vor- und Abspann hat dann schneiden wir das ja auch aus dem Wort heraus. Da kommen doch auch solche Werte drin vor.

    - - - Aktualisiert - - -

    Ah noch etwas. Was genau macht & 0x00ff?

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

fchao-Sinus-Wechselrichter AliExpress