kopia lustrzana https://github.com/rs1729/RS
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;
|
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++) {
|
for (i = 0; i < channels; i++) {
|
||||||
// i = 0: links bzw. mono
|
// i = 0: links bzw. mono
|
||||||
byte = fgetc(fp);
|
byte = fgetc(fp);
|
||||||
if (byte == EOF) return EOF;
|
if (byte == EOF) return EOF_INT;
|
||||||
if (i == 0) ret = byte;
|
if (i == 0) ret = byte;
|
||||||
|
|
||||||
if (bits_sample == 16) {
|
if (bits_sample == 16) {
|
||||||
byte = fgetc(fp);
|
byte = fgetc(fp);
|
||||||
if (byte == EOF) return EOF;
|
if (byte == EOF) return EOF_INT;
|
||||||
if (i == 0) ret += byte << 8;
|
if (i == 0) ret += byte << 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// unsigned 8/16 bit sample >= 0
|
|
||||||
return ret; // EOF < 0
|
|
||||||
}
|
|
||||||
|
|
||||||
int sign(int sample) {
|
if (bits_sample == 8) return ret-128;
|
||||||
int sgn = 0;
|
if (bits_sample == 16) return (short)ret;
|
||||||
if (bits_sample == 8) { // unsigned char:
|
|
||||||
if (sample & 0x80) sgn = 1; else sgn = -1; // 00..7F - , 80..FF: +
|
return ret;
|
||||||
}
|
|
||||||
else if (bits_sample == 16) {
|
|
||||||
if (sample & 0x8000) sgn = -1; else sgn = 1;
|
|
||||||
}
|
|
||||||
return sgn;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int par=1, par_alt=1;
|
int par=1, par_alt=1;
|
||||||
|
@ -200,20 +195,20 @@ int read_bits_fsk(FILE *fp, int *bit, int *len) {
|
||||||
|
|
||||||
n = 0;
|
n = 0;
|
||||||
do{
|
do{
|
||||||
sample = read_sample(fp); // unsigned sample;
|
sample = read_signed_sample(fp);
|
||||||
if (sample == EOF) return EOF; // usample >= 0
|
if (sample == EOF_INT) return EOF;
|
||||||
par_alt = par;
|
|
||||||
par = sign(sample);
|
|
||||||
sample_count++;
|
sample_count++;
|
||||||
|
par_alt = par;
|
||||||
|
par = (sample >= 0) ? 1 : -1;
|
||||||
n++;
|
n++;
|
||||||
} while (par*par_alt > 0);
|
} 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);
|
*len = (int)(l+0.5);
|
||||||
|
|
||||||
if (!option_inv) *bit = (1-par_alt)/2; // unten 1, oben -1
|
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 ? */
|
/* Y-offset ? */
|
||||||
|
|
||||||
|
@ -305,12 +300,83 @@ SubHeader, 2byte
|
||||||
#define pos_GPSecefZ 0x11C // 4 byte
|
#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 get_FrameNb() {
|
||||||
int i;
|
int i;
|
||||||
unsigned byte;
|
unsigned byte;
|
||||||
ui8_t frnr_bytes[2];
|
ui8_t frnr_bytes[2];
|
||||||
int frnr;
|
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++) {
|
for (i = 0; i < 2; i++) {
|
||||||
byte = xorbyte(pos_FrameNb + i);
|
byte = xorbyte(pos_FrameNb + i);
|
||||||
frnr_bytes[i] = byte;
|
frnr_bytes[i] = byte;
|
||||||
|
@ -346,7 +412,13 @@ int get_GPSweek() {
|
||||||
unsigned byte;
|
unsigned byte;
|
||||||
ui8_t gpsweek_bytes[2];
|
ui8_t gpsweek_bytes[2];
|
||||||
int gpsweek;
|
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++) {
|
for (i = 0; i < 2; i++) {
|
||||||
byte = xorbyte(pos_GPSweek + i);
|
byte = xorbyte(pos_GPSweek + i);
|
||||||
gpsweek_bytes[i] = byte;
|
gpsweek_bytes[i] = byte;
|
||||||
|
@ -420,23 +492,6 @@ void ecef2elli(double X[], double *lat, double *lon, double *h) {
|
||||||
*lon = lam*180/M_PI;
|
*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 get_GPSkoord() {
|
||||||
int i, k;
|
int i, k;
|
||||||
unsigned byte;
|
unsigned byte;
|
||||||
|
@ -519,7 +574,6 @@ int get_Cal() {
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
|
||||||
int print_position() {
|
int print_position() {
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue