#define RISINGEDGE 0
#define DROPEDGE
1
#define ABS(x) (((x) > 0) ? (x) : (-x))
980
#define MARK_FREQ
#define SPACE_FREQ 1180
#define MARGIN
#define STARTBIT
#define BAUDRATE
static void
FSK_decode (SNDFILE * infile, FILE * outfile, int channels, int samplerate)
{
((SPACE_FREQ-MARK_FREQ)/2)
1
300
float buf [channels * BLOCK_SIZE] ;
int k, readcount ;
char bits;
float value;
float last_val = 0.0;
int edge = -1;
int last_edge = -1;
const float dt = 1.00/samplerate;
const int bpts = (int)(1.00/BAUDRATE/dt);
int index = 0;
int edge_index = 0;
int last_edge_index = 0;
int bit_start_idx = 0;
int tmp;
float freq;
int ModemStatusReg = 0;
int BitCounter = 0;
int zeros = 0;
int ones = 0;
//printf("time gap of two samplerate: %f, baud points %d\n", dt, bpts);
while ((readcount = sf_readf_float (infile, buf, BLOCK_SIZE)) > 0)
{
for (k = 0 ; k < readcount ; k++)
{
value = buf [k * channels];
index++;
//printf("idx %d, value %f\n", index, value);
if(value - last_val > 0.4) {
edge = RISINGEDGE;
edge_index = index;
//printf("RISINGEDGE\n");
}
else if(value - last_val < -0.4) {
edge = DROPEDGE;
edge_index = index;
//printf("DROPEDGE\n");
}
if((last_edge != -1) && (edge != -1) && (last_edge != edge))
{
tmp = last_edge_index - edge_index;
if(ABS(tmp) <= 1){
tmp, last_edge_index, edge_index);
printf("Something wrong %d, last_edge_index %d, edge_index %d\n",
return;
}
freq = 1.00 / 2 / (ABS(tmp) * dt);
if(freq > MARK_FREQ-MARGIN && freq < MARK_FREQ+MARGIN) {
} else if(freq > SPACE_FREQ-MARGIN && freq < SPACE_FREQ+MARGIN) {
}
//printf("freq %d, points %d, zeros %d, ones %d\n", (int)freq,
ones++;
zeros++;
ABS(tmp), zeros, ones);
if(zeros>=6 && !(ModemStatusReg & STARTBIT)) {
ModemStatusReg |= STARTBIT;
BitCounter = 0;
zeros = 0;
ones = 0;
bit_start_idx = index;
bits = 0;
//printf("start bit detected\n");
// startbit detected
// reset counters
}
tmp = index-bit_start_idx;
if((ABS(tmp) >= (bpts-6)) && (ModemStatusReg & STARTBIT)) {
BitCounter++;
//printf("bits %d\n", BitCounter);
if(BitCounter > 8 || BitCounter < 1){
printf("Something wrong %d\n", BitCounter);
return;
}
if(BitCounter == 8) {
byte
it!!!!!!!!!!!
bits[0..7]
// processed one
ModemStatusReg &= ~STARTBIT;
printf("0x%x, %c\n", bits, bits);
fprintf(outfile, "0x%x, %c\n", bits, bits);
// return; //debug, return when first char detected
// got
} else {
if(ones >= zeros) {
// show 1 to UART
if(BitCounter >= 1 && BitCounter <=8)
// 1-8 actural
bits |= (0x1 << (BitCounter-1));
} else {
// show 0 to UART
// zero do nothing
}
}
zeros = 0;
ones = 0;
bit_start_idx = index; // reset baud index
}
}
last_val = value;
last_edge = edge;
last_edge_index = edge_index;
}
}
return ;
}