Code:
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <stdio.h>
#include <limits.h>
#include <math.h>
#include <VG/openvg.h>
#include <VG/vgu.h>
#include <fontinfo.h>
#include <shapes.h>
#include "diaSound.hpp"
bool ausgabe = true;
int32_t sStart, sEnde;
void plotten(int32_t *input, int32_t *waveBuffer)
{
int width, height, i, x = 800;
float schritt = x / (float)SHRT_MAX;
char s[3];
initWindowSize(20, 20, x, 511);
init(&width, &height);
Start(width, height);
Background(0, 0, 0);
Fill(0, 255, 255, 1);
StrokeWidth(1.0);
for(i=0;i<SHRT_MAX;i++)
{
Stroke(255, 255, 255, 1.0);
Line((VGfloat) schritt*i, (VGfloat) input[i], (VGfloat) schritt*(i+1), (VGfloat) input[i+1]);
Stroke(255, 255, 0, 1.0);
Line((VGfloat) schritt*i, (VGfloat) waveBuffer[i]+256, (VGfloat) schritt*(i+1), (VGfloat) waveBuffer[i+1]+256);
}
Line((VGfloat) schritt*sStart, (VGfloat) 255+256, (VGfloat) schritt*sStart, (VGfloat) 0+256);
Line((VGfloat) schritt*sEnde, (VGfloat) 255+256, (VGfloat) schritt*sEnde, (VGfloat) 0+256);
End();
fgets(s, 2, stdin);
finish();
}
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;
sStart = signalstart;
sEnde = signalend;
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();
}
for(i=0;i<SHRT_MAX;i++)
{
waveBuffer[i] = input[i] & 0x00ff;
}
analyse(input);
plotten(input, waveBuffer);
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;
}
Lesezeichen