- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
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
    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?

  2. #2
    HaWe
    Gast
    erstmal: wie setzen nur die Bereiche auf Null, die innerhalb eines bestimmten Ausschlags von der Basislinie liegen.

    im Abspann, bei den fiktiven Werten
    Code:
    128  129   125  130  127  131  126  128
    wären:

    baseline 128
    maxr 131
    minr 125
    bias 3

    (zur Ermittlung arbeite ich grade an eine optimierten Funktion, die auch singuläre Ausreißer-Spikes unberücksichtigt lässt! )(

    das (laute) Wort davor soll mal haben

    Code:
    135  138  120  123  180  150  115  112
    kurzer Vorspann (optional):

    Code:
    127  129  128  128

    jetzt gucken wir uns den gesamten Scan an:
    (Punkte zur Markierung der Bereiche)

    Code:
    127  129  128  128 . 135  138  120  123  180  150  115  112. 128  129  125  130  127  131 126  128
    nun bereinigen wir den Scan, indem wir alle kleinen Ausschläge ( von der Baseline <= bias inkl.) auf baseline gesetzt werden, d.h. alle zwischen 125 und 131
    Code:
    128  128  128  128 . 135  138  120  123  180  150  115  112. 128  128  128  128  128  128  128  128

    du siehst: jetzt ist das "Wort" in der Mitte scharf markiert.

    Den Kram mit dem Bias abziehen vom gesamten Scan, wie gestern "angedacht",können wir uns evtl schenken, denn das macht wschl. die FFT für und automatisch wie ichs momentan sehe.

    - - - Aktualisiert - - -

    Ah noch etwas. Was genau macht & 0x00ff?
    & 0x00ff
    "anded" bitweise einen Int-Wert aus mehreren (hier: 4) Bytes und errechnet daraus den Wert des Lowbytes.
    0x00ff ist die hex-Schreibweise von 255, wo die 8 kleinen bits auf 1 und alle höheren bits Null sind.

    das heisst:
    7 & 0x00ff ergibt 7 // nur das lowByte enthält Werte
    127 & 0x00ff ergibt 127 // dto...
    255 & 0x00ff ergibt 255
    256 & 0x00ff ergibt 1 // 2.-unterstes Byte enthält Stör-Wert, der wird herausmaskiert, nur Lowbyte bleibt übrig.
    262 & 0x00ff ergibt 7 // dto...
    382 & 0x00ff ergibt 127
    511 & 0x00ff ergibt 255 .
    1024 & 0x00ff ergibt 1
    32768 & 0x00ff ergibt 1 // 3.-unterstes Byte enthält Stör-Wert, der wird herausmaskiert, nur Lowbyte bleibt übrig.

    Der Sinn war: alle int-Werte, die sonst noch als unnütze Bytes in den 4-Byte-int32_t array-zellen auftauchen sollten, zu nullen (z. B. Steuer-Bytes / Begrenzer oder der Wert einer 2. Spur), damit nur das kleinste Byte übrig bleibt, wenn das wirklich die echte Micro-Mono-Spur enthält.
    So wie es momentan aussieht, sind allerdings keine weiteren Stör-Bytes drinnen, aber das werden wir noch austesten.

    Was ist der Unterschied zwischen i++ und ++i?????
    ++i ist das pre-increment, das führt das Increment sofort aus und steht für i=i+1.
    i++ ist das post-increment, das führt das Increment erst aus, nachdem weitere Kommandos in der selben Kommando-Zeile bereits ausgeführt worden sind.

    ++i ist in diesem speziellen Falle zwar identisch mit i++,
    aber ++i ist das logisch richtigere, denn i++ kann möglicherweise immer "side effects" haben.

    Siehe die Erklärung hier:
    http://www.embedded.com/design/progr...rement-in-C-C-
    Geändert von HaWe (05.06.2016 um 14:19 Uhr)

  3. #3
    HaWe
    Gast
    so, ich habe mal auf nem Arduino die Rauschglättung simuliert (geht dort einfacher mit Grafik etc):

    Simulations-Code (automatische Erkennung der Rauschbandbreite) :

    Code:
    // ver 0005
    
    void arrayinit(int16_t * array, int16_t arrlen) {
      char     sbuf[128];
      int16_t  bias, minr, maxr, baseline;
    
    
      // simulated noisy word-command or signal
      for (int i=0; i<arrlen; ++i) {    
        array[i] = 128 + random(10)- 5;  // simulated noise  +/- 5;      
      }
      for (int i=33; i<arrlen-101; ++i) {  // simulated word/signal +/- 100
        array[i] = 128 + random(200) - 100;      
      }
    
      curlf();
      sprintf(sbuf, "arrayinit[0] vorher %d ", array[0] );  
      Serial.println(sbuf);
      lcdprint(sbuf);
      
      
    
      // calculate baseline from last 100 array cells:
    
      //init
      baseline=array[arrlen-90];
      minr=array[arrlen-90]-1;
      maxr=array[arrlen-90]+1;
      
      // auto-adjust:  
      for (int i=arrlen-100; i<arrlen; ++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.8*(float)array[i]  + 0.2*(float)maxr )) ;
    
        // smoothed out min noise
        if (array[i] <= baseline) minr = round ( ( 0.8*(float)array[i]  + 0.2*(float)minr ))  ;       
      }
     
      bias =  max(baseline-minr-2, maxr+2-baseline)  ;  // 
      
      curlf();
      sprintf(sbuf, "baseline %d ", baseline );  
      Serial.println(sbuf);
      lcdprint(sbuf);
    
      curlf();
      sprintf(sbuf, "bias %d ", bias );  
      Serial.println(sbuf);
      lcdprint(sbuf);
    
    
      // mit /ohne Rauschglättung (auskommentieren)
     
      for (int i=0; i<arrlen; ++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
      }
      
      
      
      curlf();
      sprintf(sbuf, "arrayinit[0] nachher %d ", array[0] );  
      lcdprint(sbuf);
      Serial.println(sbuf);
     
    
    }
    klappt!

    leider ist das Bildhochladen hier im Forum extremst kompliziert und vom Speicherplatz zu eingeschränkt,
    ich habe es daher hier zum direkten Vergleich hochgeladen:

    http://www.mindstormsforum.de/viewto...p=69409#p69409

    - - - Aktualisiert - - -

    deine lib habe ich jetzt noch etwas in ifndef eingekapselt, um doppeltes Linken zu vermeiden:


    Code:
    #ifndef __DIASOUND_HPP__
    #define __DIASOUND_HPP__
    
    
    
    /// dein diaSound-lib Code
    
    
    
    #endif
    Geändert von HaWe (05.06.2016 um 17:43 Uhr)

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Was ist denn das für ein Display wo du da am Arduino hängen hast?

    Ich merke immer wieder, dass seit ich C gelernt habe sich doch einiges weiter entwickelt hat. Oder es liegt daran das ich erst seit nem halben Jahr mit C++ arbeite.

    Danke für deine Erklärungen. Hab ich bisher so noch nie gebraucht und auch i++ hat bisher noch nie Schwierigkeiten gemacht, aber man lernt ja nie aus!

    Was dein Simulationscode angeht, sobald ich mein Gentoo auf systemd umgestellt habe bastel ich da gerne was in den Code rein.

    ich nehme an es geht in der Hauptsache um diesen Teil

    Code:
      // calculate baselind from last 100 arraay cells:
    
      //init
      baseline=array[arrlen-50];
      minr=array[arrlen-50]-1;
      maxr=array[arrlen-50]+1;
      
      // auto-adjust:  
      for (int i=arrlen-100; i<arrlen; ++i) {    
        // mean baseline
        baseline = round ( ( 0.7*(float)array[i]  + 0.3*(float)baseline ) ) +1;
    
        // smoothed out max noise
        if (array[i] >= baseline) maxr = round ( ( 0.7*(float)array[i]  + 0.3*(float)maxr ) ) +1;
    
        // smoothed out min noise
        if (array[i] <= baseline) minr = round ( ( 0.7*(float)array[i]  + 0.3*(float)minr ) ) -1;   
        
      }
     
      bias = max (baseline-minr, maxr-baseline);  // 
    
      // mit /ohne Rauschglättung (auskommentieren)
     
      for (int i=0; i<arrlen; ++i) {
         if( (array[i]>baseline ) && (array[i] <= baseline + bias)) array[i] = baseline ; // kleine Schwankung => auf Baseline
         else
         if( (array[i]<baseline ) && (array[i] >= baseline - bias)) array[i] = baseline ; // kleine Schwankung => auf Baseline
      }

  5. #5
    HaWe
    Gast
    hallo,

    ja, genau, das ist der Teil mit dem Rauschen wegschneiden. Inzwischen ist der Code schon wieder ein wenig optimiert...

    was C angeht: da hat sich bei ANSI C gar nicht so viel verändert, eher schon C++11 und C++14, aber ich selber programmiere nur in ANSI C99 (und nutze die C++ libs ntl, soweit verfügbar).

    C/C++ sind aber derart mächtig, dass man sicher immer wieder noch mal was neues entdeckt, egal wie lange man schon dabei ist ...

    das Arduino-Display ist dieses hier:
    http://www.mindstormsforum.de/viewto...p=68170#p68170

    - - - Aktualisiert - - -

    wenn du die Wav-Rausch-Entfernung vorher/nachher gemacht hast, dann spiele doch bitte mal diesen veränderten Array als wav-File ab (PlayCaptured).
    Das Rauschen im "Wortsignal" ist ja noch nicht verändert, aber vorher/hinterher müsste man einen Unterschied hören!

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Hast du den Code schon abgeändert? Wenn nicht machst du das noch?

    Ja ich höre mir das natürlich an. Nutzt ja nichts wenn man Kaudawelsch versucht zu vergleichen.

    Ich hab damals auf dem Amiga mit C Programmieren angefangen. Ganz am Anfang war es der C64 mit Basic und auch der C128. Danach dann kurz MS-DOS (VHS da hatte ich keine Wahl) und das war mir schon unangenehm. Zum Glück bekam ich kurz darauf einen Amiga und da ging es dann los mit dem Programmieren. Erst in ARexx. Eine Skript-Sprache die mir heute auf eigentlich allen Betriebssystemen fehlt. Auf dem Amiga hat eigentlich jedes Programm eine ARexx Schnittstelle wo man sie dann mit ARexx unter einander verbinden und steuern kann. Da habe ich komplette Mailinglisten drüber programmiert und auch sonst vieles Automatisiert. Dann kam Ansi-C. Da hab ich alles Mögliche mit programmiert. Angefangen von einfachen Programmen zur Fuhrparktüberwachung bis hin zu FTP Clienten und OpenGL. Auch einen AIM Client habe ich geschrieben. Dann wurde aber das Geld knapp und leider ist Hardware für den Amiga super teuer. Dann kam kurz Windows. Dort habe ich auch programmiert aber Spass hatte ich irgendwie nie dabei. Dann bin ich davon weg zu Linux aber durch Frau und Kinder habe ich das Hobby echt lange brach liegen lassen. Bis letztes Jahr. Ich habe letztes Jahr mit einem Freund angefangen einen Kettcar um zu bauen und einen PocketBike Motor dran zu bauen (Daher Projekt-Hirnfrei, die Idee meiner Frau). Wir waren aber sehr unzufrieden mit dem Bowdenzug für das Gas-Pedal und als Alternative kam dann mein erster Arduino ins Haus und der hat mir derart viel Spass gemacht das ich seit her wieder sehr viel programmiere. Bin dann aber von Ansi-C auf C++ umgestiegen. Zwar finde ich es toll, wenn man wirklich über jede Speicherstelle bescheid weiss, die man zum Programmieren benutzt, aber der Aufwand mit dem Anfordern, Erweitern und löschen war mir dann irgendwie zu viel. Das es C++11 gibt weiss ich auch erst seit ein paar Monaten .

    So jetzt kennst du meine Geschichte . So viel wollte ich gar nicht schreiben.

    Aber recht hast du definitiv. C/C++ ist wahrscheinlich nach Assembler das wo man nie auslernen wird.

  7. #7
    HaWe
    Gast
    ja, ich habe die Grenzen noch optimiert, nach ein paar Serien sehr ausgefallener random-Waves.
    zur Zeit ver 0005-0007.
    im Raspy Code mus es ntl als array-Größe SHRT_MAX heißen statt arrlen, und int32_t statt int16_t.

    wenn nach dem Rausch-ex vorher/hinterher beim Abhören immer noch alles klar ist, dann kann man jetzt die Grenzen des Signals setzen:

    int signalstart=0;
    int i=0;
    while( (wavbuffer[i]<=baseline+bias) && (i<SHORT_MAX-1) ) ++i;
    signalstart=i;

    int signalend=SHORT_MAX-1;
    i=SHORT_MAX-1;
    while( (wavbuffer[i]<=baseline+bias) && (i>signalstart) ) --i;
    signalend=i;

    jetzt müsten die Grenzen feststehen.
    Ich teste es auf dem Arduino aus.
    ver 0007c

    - - - Aktualisiert - - -

    jawohl, klappt!

    Code:
    
    // ver 0007c
    
    void arrayinit(int16_t * array, int16_t arrlen) {
       char      sbuf[128];
       int16_t   bias, minr, maxr, baseline, 
                   maximum, minimum, maxpos, minpos,
                   signalstart, signalend;
       uint16_t  i;
    
    
       // simulated noisy word-command or signal
       for (i=0; i<arrlen; ++i) {    
         array[i] = 128 + random(11) - 5;  // simulated noise  +/- 5;      
       }
       for (i=33; i<arrlen-101; ++i) {  // simulated word/signal +/- 100
         array[i] = 128 + random(201) - 100;      
       }
    
       curlf();
       sprintf(sbuf, "arrayinit[0] vorher %d ", array[0] );  
       Serial.println(sbuf);
       lcdprint(sbuf);
      
       // dynamics: min, max 
    
       maximum = array[0];
       minimum = array[0]; 
     
      
       for(i=0;i<arrlen; ++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=arrlen-100; i<arrlen; ++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;  // 
      
       curlf();
       sprintf(sbuf, "baseline %d ", baseline );  
       Serial.println(sbuf);
       lcdprint(sbuf);
    
       curlf();
       sprintf(sbuf, "bias %d ", bias );  
       Serial.println(sbuf);
       lcdprint(sbuf);
    
    
       // noise reduction start/end 
       // drop small noise
       for (i=0; i<arrlen; ++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<arrlen-1) ) ++i;
       signalstart = i;
       if (i>0) signalstart -=1;   
       signalend=arrlen-1;
       i=arrlen-1;
       while( (array[i]<=baseline + + 4*bias/3) && (i>signalstart) ) --i;
       signalend = i;
       if (i<arrlen-1) signalstart +=1;     
      
       curlf();  
       sprintf(sbuf, "arrayinit[0] nachher %d", array[0] );  
       lcdprint(sbuf);
       Serial.println(sbuf);
    
       curlf(); _curx_=80;
       sprintf(sbuf, "signalstart %d", signalstart );  
       lcdprint(sbuf);
       Serial.println(sbuf);
    
       curlf(); _curx_=80;
       sprintf(sbuf, "signalend  %d", signalend );  
       lcdprint(sbuf);
       Serial.println(sbuf); 
    
    }
    jetzt bei 7c: Grenzenerkennung funktioniert sogar bei 20% Rauschen sehr gut.
    neuestes Bild ganz unten hier im Post:

    http://www.mindstormsforum.de/viewto...p=69409#p69409
    Geändert von HaWe (08.06.2016 um 13:48 Uhr)

Ä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