mirror of https://github.com/drowe67/pirip.git
added CRC16, functional test working to rtl_sdr at Rs=200,100,and 10000, 2 and 4FSK
parent
a205c2ac04
commit
f267b44853
|
@ -3,6 +3,12 @@
|
||||||
David Rowe July 2020
|
David Rowe July 2020
|
||||||
|
|
||||||
FSK modulates an input bit stream using rpitx.
|
FSK modulates an input bit stream using rpitx.
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
[ ] decide if we should have packet bytes input data
|
||||||
|
[ ] if so, need a way to send uncoded test packets as per examples in README.md
|
||||||
|
[ ] Something wrong at Rs<200, e.g. Rx can't detect any packets at Rs=100
|
||||||
|
[ ] test link with other codes
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
@ -23,6 +29,9 @@ extern "C" {
|
||||||
int freedv_tx_fsk_ldpc_bits_per_frame(struct freedv *f);
|
int freedv_tx_fsk_ldpc_bits_per_frame(struct freedv *f);
|
||||||
void freedv_tx_fsk_ldpc_framer(struct freedv *f, uint8_t frame[], uint8_t payload_data[]);
|
void freedv_tx_fsk_ldpc_framer(struct freedv *f, uint8_t frame[], uint8_t payload_data[]);
|
||||||
void ofdm_generate_payload_data_bits(uint8_t payload_data_bits[], int n);
|
void ofdm_generate_payload_data_bits(uint8_t payload_data_bits[], int n);
|
||||||
|
unsigned short freedv_gen_crc16(unsigned char* data_p, int length);
|
||||||
|
void freedv_pack(unsigned char *bytes, unsigned char *bits, int nbits);
|
||||||
|
void freedv_unpack(unsigned char *bits, unsigned char *bytes, int nbits);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool running=true;
|
bool running=true;
|
||||||
|
@ -194,20 +203,36 @@ int main(int argc, char **argv)
|
||||||
if ((carrier_test == 0) && (one_zero_test == 0)) {
|
if ((carrier_test == 0) && (one_zero_test == 0)) {
|
||||||
/* regular FSK modulator operation */
|
/* regular FSK modulator operation */
|
||||||
|
|
||||||
/* pre-amble */
|
/* pre-amble TODO: reconcile this with same code in freedv_fsk.c */
|
||||||
int np = 100;
|
int npreamble_symbols = 50*(m>>1);
|
||||||
uint8_t preamble_bits[np];
|
int npreamble_bits = npreamble_symbols*(m>>1);
|
||||||
for(int i=0; i<np; i++) preamble_bits[i] = rand() % 0x1;
|
uint8_t preamble_bits[npreamble_bits];
|
||||||
modulate_frame(fmmod, shiftHz, m, preamble_bits, np);
|
// cycle through all 2 and 4FSK symbols, not sure if this is better than random
|
||||||
|
int sym = 0;
|
||||||
|
for(int i=0; i<npreamble_bits; i+=2) {
|
||||||
|
preamble_bits[i] = (sym>>1) & 0x1;
|
||||||
|
preamble_bits[i+1] = sym & 0x1;
|
||||||
|
sym += 1;
|
||||||
|
}
|
||||||
|
modulate_frame(fmmod, shiftHz, m, preamble_bits, npreamble_bits);
|
||||||
|
|
||||||
while(running) {
|
while(running) {
|
||||||
uint8_t data_bits[data_bits_per_frame];
|
uint8_t data_bits[data_bits_per_frame];
|
||||||
int BytesRead = fread(data_bits, sizeof(uint8_t), data_bits_per_frame, fin);
|
int BytesRead = fread(data_bits, sizeof(uint8_t), data_bits_per_frame, fin);
|
||||||
if (BytesRead == data_bits_per_frame) {
|
if (BytesRead == (data_bits_per_frame)) {
|
||||||
if (testframes) {
|
if (testframes) {
|
||||||
/* replace input data with testframe */
|
/* replace input data with testframe */
|
||||||
ofdm_generate_payload_data_bits(data_bits, data_bits_per_frame);
|
ofdm_generate_payload_data_bits(data_bits, data_bits_per_frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* calculate and insert CRC in the last 16 bit sof data_bits[] */
|
||||||
|
assert((data_bits_per_frame % 8) == 0);
|
||||||
|
int data_bytes_per_frame = data_bits_per_frame / 8;
|
||||||
|
uint8_t data_bytes[data_bytes_per_frame];
|
||||||
|
freedv_pack(data_bytes, data_bits, data_bits_per_frame-16);
|
||||||
|
uint16_t crc16 = freedv_gen_crc16(data_bytes, data_bytes_per_frame-2);
|
||||||
|
uint8_t crc16_bytes[] = { (uint8_t)(crc16 >> 8), (uint8_t)(crc16 & 0xff) };
|
||||||
|
freedv_unpack(data_bits+data_bits_per_frame-16, crc16_bytes, 16);
|
||||||
uint8_t tx_frame[bits_per_frame];
|
uint8_t tx_frame[bits_per_frame];
|
||||||
if (fsk_ldpc)
|
if (fsk_ldpc)
|
||||||
freedv_tx_fsk_ldpc_framer(freedv, tx_frame, data_bits);
|
freedv_tx_fsk_ldpc_framer(freedv, tx_frame, data_bits);
|
||||||
|
@ -221,9 +246,6 @@ int main(int argc, char **argv)
|
||||||
if (testframes)
|
if (testframes)
|
||||||
if (frames >= Nframes) running = false;
|
if (frames >= Nframes) running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* post-amble */
|
|
||||||
modulate_frame(fmmod, shiftHz, m, preamble_bits, np);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (carrier_test) {
|
if (carrier_test) {
|
||||||
|
@ -245,8 +267,16 @@ int main(int argc, char **argv)
|
||||||
fmmod->SetFrequencySamples(&VCOfreqHz,1);
|
fmmod->SetFrequencySamples(&VCOfreqHz,1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this was required to prevent errors on final frame, I suspect
|
||||||
|
// as fmmod FIFO hasn't emptied by the time we delete fmmod.
|
||||||
|
// Seems a bit wasteful, so there might be a better way
|
||||||
|
|
||||||
|
float VCOfreqHz = 0;
|
||||||
|
for(int i=0; i<50; i++)
|
||||||
|
fmmod->SetFrequencySamples(&VCOfreqHz,1);
|
||||||
printf("End of Tx\n");
|
printf("End of Tx\n");
|
||||||
|
|
||||||
if (fsk_ldpc) freedv_close(freedv);
|
if (fsk_ldpc) freedv_close(freedv);
|
||||||
delete fmmod;
|
delete fmmod;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue