|
unsigned decode(short *buf,unsigned num,bool *out,fsk_state *fskstate)
{
unsigned i;
short *pdelay=fskstate->delay;
bool *outbuf=out;
unsigned lenmax=FSK_MAXFSKBUF;
short *ptr=buf;
for(i=0;i asm volatile ( "\n" \
E-mail:
info@telesys.ru
pdelay=buf;
}
// LP filter (IIR filter)
int rt;
"sr1=%1; i0=%2;" "\n" \
"DIS M_MODE;" "\n" \
"se=1;" "\n" \
"m1=1;" "\n" \
"m3=-3;" "\n" \
"i6=%3;" "\n" \
"m6=1;" "\n" \
"mx0=dm(i0,m1), my0=pm(i6,m6);" "\n" \
"mr=mx0*my0(ss), mx1=dm(i0,m1), my0=pm(i6,m6);" "\n" \
"mr=mr+mx1*my0(ss), my0=dm(i6,m6);" "\n" \
"mr=mr+sr1*my0(ss), mx0=dm(i0,m1), my0=pm(i6,m6);" "\n" \
"mr=mr+mx0*my0(ss), mx0=dm(i0,m3), my0=pm(i6,m6);" "\n" \
"dm(i0,m1)=mx1, mr=mr+mx0*my0(rnd);" "\n" \
"dm(i0,m1)=sr1, sr=ashift mr1(hi);" "\n" \
"mx0=dm(i0,m1), my0=pm(i6,m6);" "\n" \
"mr=mx0*my0(ss), mx1=dm(i0,m1), my0=pm(i6,m6);" "\n" \
"mr=mr+mx1*my0(ss), my0=dm(i6,m6);" "\n" \
"mr=mr+sr1*my0(ss), mx0=dm(i0,m1), my0=pm(i6,m6);" "\n" \
"mr=mr+mx0*my0(ss), mx0=dm(i0,m3), my0=pm(i6,m6);" "\n" \
"dm(i0,m1)=mx1, mr=mr+mx0*my0(rnd);" "\n" \
"dm(i0,m1)=sr1, sr=ashift mr1(hi);" "\n" \
"dm(i0,m1)=mx0;" "\n" \
"dm(i0,m1)=sr1;" "\n" \
"ENA M_MODE;" "\n" \
"%0=sr1;" "\n" \
: "=r"(rt) : "r"((*ptr++)*(*pdelay++)) , "r"(fskstate->filter_state), "r"(fskstate->coeff) : "SR", "I0", "I6", "MX0", "MX1", "MY0", "SE", "MR", "M1", "M3", "M6" );
bool newbit=(rt<0);
if (fskstate->lastbit != newbit) {
fskstate->lastbit = newbit;
if (fskstate->phase< 0x8000)
fskstate->phase += FSK_BAUD_PLL_ADJ;
else
fskstate->phase -= FSK_BAUD_PLL_ADJ;
}
fskstate->phase+=fskstate->phase_incr;
asm volatile ("if not ac jump .adrcont;");
if(lenmax) {
*outbuf++ = fskstate->lastbit;
lenmax--;
}
asm volatile (".adrcont:");
}
fskstate->delay=pdelay;
return ((unsigned)outbuf)-(unsigned)out;
}
Ответы