signed samples; frame shift

pull/13/head
Zilog80 2015-03-28 08:39:26 +01:00
rodzic 39eddb045e
commit d8e30acd16
1 zmienionych plików z 95 dodań i 41 usunięć

Wyświetl plik

@ -160,35 +160,30 @@ int read_wav_header(FILE *fp) {
return 0;
}
int read_sample(FILE *fp) { // int = i32_t
int byte, i, ret; // return ui16_t/ui8_t oder EOF
#define EOF_INT 0x1000000
int read_signed_sample(FILE *fp) { // int = i32_t
int byte, i, ret; // EOF -> 0x1000000
for (i = 0; i < channels; i++) {
// i = 0: links bzw. mono
// i = 0: links bzw. mono
byte = fgetc(fp);
if (byte == EOF) return EOF;
if (byte == EOF) return EOF_INT;
if (i == 0) ret = byte;
if (bits_sample == 16) {
byte = fgetc(fp);
if (byte == EOF) return EOF;
if (byte == EOF) return EOF_INT;
if (i == 0) ret += byte << 8;
}
}
// unsigned 8/16 bit sample >= 0
return ret; // EOF < 0
}
int sign(int sample) {
int sgn = 0;
if (bits_sample == 8) { // unsigned char:
if (sample & 0x80) sgn = 1; else sgn = -1; // 00..7F - , 80..FF: +
}
else if (bits_sample == 16) {
if (sample & 0x8000) sgn = -1; else sgn = 1;
}
return sgn;
if (bits_sample == 8) return ret-128;
if (bits_sample == 16) return (short)ret;
return ret;
}
int par=1, par_alt=1;
@ -200,20 +195,20 @@ int read_bits_fsk(FILE *fp, int *bit, int *len) {
n = 0;
do{
sample = read_sample(fp); // unsigned sample;
if (sample == EOF) return EOF; // usample >= 0
par_alt = par;
par = sign(sample);
sample = read_signed_sample(fp);
if (sample == EOF_INT) return EOF;
sample_count++;
par_alt = par;
par = (sample >= 0) ? 1 : -1;
n++;
} while (par*par_alt > 0);
l = (float)n / samples_per_bit; // abw = n % samples_per_bit;
l = (float)n / samples_per_bit;
*len = (int)(l+0.5);
if (!option_inv) *bit = (1-par_alt)/2; // unten 1, oben -1
else *bit = (1+par_alt)/2; // inverse:
else *bit = (1+par_alt)/2; // inverse
/* Y-offset ? */
@ -305,12 +300,83 @@ SubHeader, 2byte
#define pos_GPSecefZ 0x11C // 4 byte
#define pos_Hframe 0x039
#define HEAD_frame 0x1713 // ^0x6E3B=0x7928
#define pos_Htow 0x093
#define HEAD_tow 0x9667 // ^0xEA79=0x7C1E
#define pos_Hkoord 0x112
#define HEAD_koord 0xB9FF // ^0xC2EA=0x7B15
unsigned shiftLeft(int pos) {
unsigned tmp;
tmp = (frame[pos+1]<<8) + frame[pos];
tmp = (tmp >> 1) & 0xFF;
return tmp;
}
int shiftRight(int pos) {
unsigned tmp;
tmp = (frame[pos]<<8) + frame[pos-1];
tmp = (tmp >> 7) & 0xFF;
return tmp;
}
void shiftFrame(int pos, int shift) {
unsigned byte, byte1, byte2;
if (shift > 0) {
while (pos < FRAME_LEN) {
byte = shiftLeft(pos);
frame[pos] = byte;
pos++;
}
}
if (shift < 0) {
byte1 = shiftRight(pos);
pos++;
while (pos < FRAME_LEN) {
byte2 = shiftRight(pos);
frame[pos-1] = byte1;
byte1 = byte2;
pos++;
}
}
}
int getShift(int pos, unsigned head) {
unsigned byte;
int shift = 0;
byte = (frame[pos]<<8) + frame[pos+1];
// fprintf(stdout, "0x%04X ", byte ); // HEAD_frame ^ 0x6E38 == 0x7928 ?
if (byte != head) {
byte = (shiftLeft(pos)<<8) + shiftLeft(pos+1);
//fprintf(stdout, " %04X", byte);
if (byte == HEAD_frame) shift = 1;
else {
byte = (shiftRight(pos)<<8) + shiftRight(pos+1);
if (byte == head) shift = -1;
}
if (!shift) return 0x100;
//printf("shift:%2d ", shift);
}
return shift;
}
int get_FrameNb() {
int i;
unsigned byte;
ui8_t frnr_bytes[2];
int frnr;
/* int shift = 0;
shift = getShift(pos_Hframe, HEAD_frame);
if (shift == 0x100) return 0x100;
//printf("shift:%2d ", shift);
shiftFrame(pos_Hframe, shift);
*/
for (i = 0; i < 2; i++) {
byte = xorbyte(pos_FrameNb + i);
frnr_bytes[i] = byte;
@ -346,7 +412,13 @@ int get_GPSweek() {
unsigned byte;
ui8_t gpsweek_bytes[2];
int gpsweek;
/* int shift = 0;
shift = getShift(pos_Htow, HEAD_tow);
if (shift == 0x100) return 0x100;
//printf("shift:%2d ", shift);
shiftFrame(pos_Htow, shift);
*/
for (i = 0; i < 2; i++) {
byte = xorbyte(pos_GPSweek + i);
gpsweek_bytes[i] = byte;
@ -420,23 +492,6 @@ void ecef2elli(double X[], double *lat, double *lon, double *h) {
*lon = lam*180/M_PI;
}
#define pos_Hkoord 0x112
#define HEAD_koord 0xB9FF
unsigned shiftLeft(int pos) {
unsigned tmp;
tmp = (frame[pos+1]<<8) + frame[pos];
tmp = (tmp >> 1) & 0xFF;
return tmp;
}
int shiftRight(int pos) {
unsigned tmp;
tmp = (frame[pos]<<8) + frame[pos-1];
tmp = (tmp >> 7) & 0xFF;
return tmp;
}
int get_GPSkoord() {
int i, k;
unsigned byte;
@ -519,7 +574,6 @@ int get_Cal() {
/* ------------------------------------------------------------------------------------ */
int print_position() {
int err;