kopia lustrzana https://github.com/M17-Project/M17_Implementations
70 wiersze
1.5 KiB
C
70 wiersze
1.5 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
|
|
#include "../inc/m17.h"
|
|
|
|
int16_t sample; //raw S16_LE baseband sample
|
|
int16_t flt_buff[FLT_LEN]; //root-nyquist filter buffer
|
|
int16_t sw_buff[SW_LEN]; //syncword detection buffer
|
|
int16_t xc_buff[XC_LEN]; //cross-correlation buffer
|
|
int16_t mac; //multiply-accumulate
|
|
|
|
//states
|
|
uint8_t pre_syncd=0;
|
|
uint8_t syncd=0;
|
|
int8_t phase=0;
|
|
|
|
int main(void)
|
|
{
|
|
while(1)
|
|
{
|
|
//wait for another baseband sample
|
|
if(fread((uint8_t*)&sample, 2, 1, stdin)<1) break;
|
|
|
|
//push the root-nyquist filter's buffer
|
|
for(uint8_t i=0; i<FLT_LEN-1; i++)
|
|
{
|
|
flt_buff[i]=flt_buff[i+1];
|
|
}
|
|
|
|
flt_buff[FLT_LEN-1]=sample;
|
|
|
|
//calculate the filter's output
|
|
mac=0;
|
|
for(uint8_t i=0; i<FLT_LEN; i++)
|
|
mac+=flt_buff[i]*taps[i];
|
|
|
|
for(uint8_t i=0; i<FLT_LEN-2; i++)
|
|
{
|
|
sw_buff[i]=sw_buff[i+1];
|
|
}
|
|
|
|
sw_buff[FLT_LEN-2]=mac;
|
|
|
|
//detect syncword using cross-correlation
|
|
int32_t xcorr=0;
|
|
|
|
for(uint8_t i=0; i<XC_LEN; i+=10)
|
|
{
|
|
xcorr+=sw_buff[i]*str_sync[i/10];
|
|
}
|
|
|
|
//push the xcorr value to the buffer
|
|
for(uint8_t i=0; i<XC_LEN-1; i++)
|
|
{
|
|
xc_buff[i]=xc_buff[i+1];
|
|
}
|
|
|
|
xc_buff[XC_LEN-1]=xcorr/24;
|
|
|
|
//detect peak
|
|
if(xc_buff[XC_LEN-1]>0.4*INT16_MAX)
|
|
{
|
|
fprintf(stderr, "SYNC\n");
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|