logo资料库

C++ 2FSK解调example.docx

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
#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 ; }
分享到:
收藏