kopia lustrzana https://github.com/projecthorus/radiosonde_auto_rx
signed samples; frame shift
rodzic
39eddb045e
commit
d8e30acd16
136
rs41/rs41stdin.c
136
rs41/rs41stdin.c
|
@ -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;
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue