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
Lesezeichen