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