sm_psk4800.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:12k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************/
  2. /*
  3.  * sm_psk4800.c  -- soundcard radio modem driver, 4800 baud 8PSK modem
  4.  *
  5.  * Copyright (C) 1997  Thomas Sailer (sailer@ife.ee.ethz.ch)
  6.  *
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published by
  9.  * the Free Software Foundation; either version 2 of the License, or
  10.  * (at your option) any later version.
  11.  *
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this program; if not, write to the Free Software
  19.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  *
  21.  *  Please note that the GPL allows you to use the driver, NOT the radio.
  22.  *  In order to use the radio, you need a license from the communications
  23.  *  authority of your country.
  24.  *
  25.  */
  26. #include "sm.h"
  27. #include "sm_tbl_psk4800.h"
  28. /* --------------------------------------------------------------------- */
  29. #define DESCRAM_TAP1 0x20000
  30. #define DESCRAM_TAP2 0x01000
  31. #define DESCRAM_TAP3 0x00001
  32. #define DESCRAM_TAPSH1 17
  33. #define DESCRAM_TAPSH2 12
  34. #define DESCRAM_TAPSH3 0
  35. #define SCRAM_TAP1 0x20000 /* X^17 */
  36. #define SCRAM_TAPN 0x00021 /* X^0+X^5 */
  37. #define SCRAM_SHIFT 17
  38. /* --------------------------------------------------------------------- */
  39. struct demod_state_psk48 {
  40. /*
  41.  * input mixer and lowpass
  42.  */
  43. short infi[PSK48_RXF_LEN/2], infq[PSK48_RXF_LEN/2];
  44. unsigned int downmixer;
  45. int ovrphase;
  46. short magi, magq;
  47. /*
  48.  * sampling instant recovery
  49.  */
  50. int pwrhist[5];
  51. unsigned int s_phase;
  52. int cur_sync;
  53. /*
  54.  * phase recovery
  55.  */
  56. short cur_phase_dev;
  57. short last_ph_err;
  58. unsigned short pskph;
  59. unsigned int phase;
  60. unsigned short last_pskph;
  61. unsigned char cur_raw, last_raw, rawbits;
  62. /*
  63.  * decoding
  64.  */
  65. unsigned int shreg;
  66. unsigned long descram;
  67. unsigned int bit_pll;
  68. unsigned char last_sample;
  69. unsigned int dcd_shreg;
  70. int dcd_sum0, dcd_sum1, dcd_sum2;
  71. unsigned int dcd_time;
  72. };
  73. struct mod_state_psk48 {
  74. unsigned char txbits[PSK48_TXF_NUMSAMPLES];
  75. unsigned short txphase;
  76. unsigned int shreg;
  77. unsigned long scram;
  78. const short *tbl;
  79. unsigned int txseq;
  80. };
  81. /* --------------------------------------------------------------------- */
  82. static void modulator_4800_u8(struct sm_state *sm, unsigned char *buf, unsigned int buflen)
  83. {
  84. struct mod_state_psk48 *st = (struct mod_state_psk48 *)(&sm->m);
  85. int i, j;
  86. int si, sq;
  87. for (; buflen > 0; buflen--, buf++) {
  88. if (!st->txseq++) {
  89. memmove(st->txbits+1, st->txbits, 
  90. sizeof(st->txbits)-sizeof(st->txbits[0]));
  91. for (i = 0; i < 3; i++) {
  92. if (st->shreg <= 1)
  93. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  94. st->scram = (st->scram << 1) |
  95. (st->shreg & 1);
  96. st->shreg >>= 1;
  97. if (st->scram & SCRAM_TAP1)
  98. st->scram ^= SCRAM_TAPN;
  99. }
  100. j = (st->scram >> (SCRAM_SHIFT+3)) & 7;
  101. st->txbits[0] -= (j ^ (j >> 1));
  102. st->txbits[0] &= 7;
  103. st->tbl = psk48_tx_table;
  104. }
  105. if (st->txseq >= PSK48_TXF_OVERSAMPLING)
  106. st->txseq = 0;
  107. for (j = si = sq = 0; j < PSK48_TXF_NUMSAMPLES; j++, st->tbl += 16) {
  108. si += st->tbl[st->txbits[j]];
  109. sq += st->tbl[st->txbits[j]+8];
  110. }
  111. *buf = ((si*COS(st->txphase)+ sq*SIN(st->txphase)) >> 23) + 0x80;
  112. st->txphase = (st->txphase + PSK48_PHASEINC) & 0xffffu;
  113. }
  114. }
  115. /* --------------------------------------------------------------------- */
  116. static void modulator_4800_s16(struct sm_state *sm, short *buf, unsigned int buflen)
  117. {
  118. struct mod_state_psk48 *st = (struct mod_state_psk48 *)(&sm->m);
  119. int i, j;
  120. int si, sq;
  121. for (; buflen > 0; buflen--, buf++) {
  122. if (!st->txseq++) {
  123. memmove(st->txbits+1, st->txbits, 
  124. sizeof(st->txbits)-sizeof(st->txbits[0]));
  125. for (i = 0; i < 3; i++) {
  126. if (st->shreg <= 1)
  127. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  128. st->scram = (st->scram << 1) |
  129. (st->shreg & 1);
  130. st->shreg >>= 1;
  131. if (st->scram & SCRAM_TAP1)
  132. st->scram ^= SCRAM_TAPN;
  133. }
  134. j = (st->scram >> (SCRAM_SHIFT+3)) & 7;
  135. st->txbits[0] -= (j ^ (j >> 1));
  136. st->txbits[0] &= 7;
  137. st->tbl = psk48_tx_table;
  138. }
  139. if (st->txseq >= PSK48_TXF_OVERSAMPLING)
  140. st->txseq = 0;
  141. for (j = si = sq = 0; j < PSK48_TXF_NUMSAMPLES; j++, st->tbl += 16) {
  142. si += st->tbl[st->txbits[j]];
  143. sq += st->tbl[st->txbits[j]+8];
  144. }
  145. *buf = (si*COS(st->txphase)+ sq*SIN(st->txphase)) >> 15;
  146. st->txphase = (st->txphase + PSK48_PHASEINC) & 0xffffu;
  147. }
  148. }
  149. /* --------------------------------------------------------------------- */
  150. static __inline__ unsigned short tbl_atan(short q, short i)
  151. {
  152. short tmp;
  153. unsigned short argoffs = 0;
  154. if (i == 0 && q == 0)
  155. return 0;
  156. switch (((q < 0) << 1) | (i < 0)) {
  157. case 0:
  158. break;
  159. case 1:
  160. tmp = q;
  161. q = -i;
  162. i = tmp;
  163. argoffs = 0x4000;
  164. break;
  165. case 3:
  166. q = -q;
  167. i = -i;
  168. argoffs = 0x8000;
  169. break;
  170. case 2:
  171. tmp = -q;
  172. q = i;
  173. i = tmp;
  174. argoffs = 0xc000;
  175. break;
  176. }
  177. if (q > i) {
  178. tmp = i / q * ATAN_TABLEN;
  179. return (argoffs+0x4000-atan_tab[((i<<15)/q*ATAN_TABLEN>>15)])
  180. &0xffffu;
  181. }
  182. return (argoffs+atan_tab[((q<<15)/i*ATAN_TABLEN)>>15])&0xffffu;
  183. }
  184. #define ATAN(q,i) tbl_atan(q, i)
  185. /* --------------------------------------------------------------------- */
  186. static void demod_psk48_baseband(struct sm_state *sm, struct demod_state_psk48 *st,
  187.  short vali, short valq)
  188. {
  189. int i, j;
  190. st->magi = vali;
  191. st->magq = valq;
  192. memmove(st->pwrhist+1, st->pwrhist, 
  193. sizeof(st->pwrhist)-sizeof(st->pwrhist[0]));
  194. st->pwrhist[0] = st->magi * st->magi +
  195. st->magq * st->magq;
  196. st->cur_sync = ((st->pwrhist[4] >> 2) > st->pwrhist[2] && 
  197. (st->pwrhist[0] >> 2) > st->pwrhist[2] &&
  198. st-> pwrhist[3] > st->pwrhist[2] && 
  199. st->pwrhist[1] > st->pwrhist[2]);
  200. st->s_phase &= 0xffff;
  201. st->s_phase += PSK48_SPHASEINC;
  202. st->dcd_shreg <<= 1;
  203. if (st->cur_sync) {
  204. if (st->s_phase >= (0x8000 + 5*PSK48_SPHASEINC/2))
  205. st->s_phase -= PSK48_SPHASEINC/6;
  206. else
  207. st->s_phase += PSK48_SPHASEINC/6;
  208. st->dcd_sum0 = 4*hweight8(st->dcd_shreg & 0xf8)-
  209. hweight16(st->dcd_shreg & 0x1f00);
  210. }
  211. if ((--st->dcd_time) <= 0) {
  212. hdlcdrv_setdcd(&sm->hdrv, (st->dcd_sum0 + st->dcd_sum1 + 
  213.    st->dcd_sum2) < 0);
  214. st->dcd_sum2 = st->dcd_sum1;
  215. st->dcd_sum1 = st->dcd_sum0;
  216. st->dcd_sum0 = 2; /* slight bias */
  217. st->dcd_time = 240;
  218. }
  219. if (st->s_phase < 0x10000)
  220. return;
  221. /*
  222.  * sample one constellation
  223.  */
  224. st->last_pskph = st->pskph;
  225. st->pskph = (ATAN(st->magq, st->magi)-
  226.        st->phase) & 0xffffu;
  227. st->last_ph_err = (st->pskph & 0x1fffu) - 0x1000;
  228. st->phase += st->last_ph_err/16;
  229. st->last_raw = st->cur_raw;
  230. st->cur_raw = ((st->pskph >> 13) & 7);
  231. i = (st->cur_raw - st->last_raw) & 7;
  232. st->rawbits = i ^ (i >> 1) ^ (i >> 2);
  233. st->descram = (st->descram << 3) | (st->rawbits);
  234. hdlcdrv_channelbit(&sm->hdrv, st->descram & 4);
  235. hdlcdrv_channelbit(&sm->hdrv, st->descram & 2);
  236. hdlcdrv_channelbit(&sm->hdrv, st->descram & 1);
  237. i = (((st->descram >> DESCRAM_TAPSH1) & 7) ^
  238.      ((st->descram >> DESCRAM_TAPSH2) & 7) ^
  239.      ((st->descram >> DESCRAM_TAPSH3) & 7));
  240.   for (j = 4; j; j >>= 1) {
  241. st->shreg >>= 1;
  242. st->shreg |= (!!(i & j)) << 16;
  243. if (st->shreg & 1) {
  244. hdlcdrv_putbits(&sm->hdrv, st->shreg >> 1);
  245. st->shreg = 0x10000;
  246. }
  247. }
  248. #if 0
  249. st->dcd_shreg <<= 1;
  250. st->bit_pll += 0x4000;
  251. curbit = (*buf >= 0x80);
  252. if (st->last_sample ^ curbit) {
  253. st->dcd_shreg |= 1;
  254. st->bit_pll += pll_corr
  255. [st->bit_pll < 0xa000];
  256. st->dcd_sum0 += 8 * 
  257. hweight8(st->dcd_shreg & 0x0c) - 
  258. !!(st->dcd_shreg & 0x10);
  259. }
  260. st->last_sample = curbit;
  261. hdlcdrv_channelbit(&sm->hdrv, st->last_sample);
  262. if ((--st->dcd_time) <= 0) {
  263. hdlcdrv_setdcd(&sm->hdrv, (st->dcd_sum0 + 
  264.    st->dcd_sum1 + 
  265.    st->dcd_sum2) < 0);
  266. st->dcd_sum2 = st->dcd_sum1;
  267. st->dcd_sum1 = st->dcd_sum0;
  268. st->dcd_sum0 = 2; /* slight bias */
  269. st->dcd_time = 240;
  270. }
  271. if (st->bit_pll >= 0x10000) {
  272. st->bit_pll &= 0xffffu;
  273. st->descram = (st->descram << 1) | curbit;
  274. descx = st->descram ^ (st->descram >> 1);
  275. descx ^= ((descx >> DESCRAM_TAPSH1) ^
  276.   (descx >> DESCRAM_TAPSH2));
  277. st->shreg >>= 1;
  278. st->shreg |= (!(descx & 1)) << 16;
  279. if (st->shreg & 1) {
  280. hdlcdrv_putbits(&sm->hdrv, st->shreg >> 1);
  281. st->shreg = 0x10000;
  282. }
  283. diag_trigger(sm);
  284. }
  285. diag_add_one(sm, ((short)(*buf - 0x80)) << 8);
  286. #endif
  287. diag_trigger(sm);
  288. diag_add_constellation(sm, (vali*COS(st->phase)+ valq*SIN(st->phase)) >> 13, 
  289.        (valq*COS(st->phase) - vali*SIN(st->phase)) >> 13);
  290. }
  291. /* --------------------------------------------------------------------- */
  292. static void demodulator_4800_u8(struct sm_state *sm, const unsigned char *buf, unsigned int buflen)
  293. {
  294. struct demod_state_psk48 *st = (struct demod_state_psk48 *)(&sm->d);
  295. int i, si, sq;
  296. const short *coeff;
  297. for (; buflen > 0; buflen--, buf++) {
  298. memmove(st->infi+1, st->infi, 
  299. sizeof(st->infi)-sizeof(st->infi[0]));
  300. memmove(st->infq+1, st->infq, 
  301. sizeof(st->infq)-sizeof(st->infq[0]));
  302. si = *buf;
  303. si &= 0xff;
  304. si -= 128;
  305. diag_add_one(sm, si << 8);
  306. st->infi[0] = (si * COS(st->downmixer))>>7;
  307. st->infq[0] = (si * SIN(st->downmixer))>>7;
  308. st->downmixer = (st->downmixer-PSK48_PHASEINC)&0xffffu;
  309. for (i = si = sq = 0, coeff = psk48_rx_coeff; i < (PSK48_RXF_LEN/2); 
  310.      i++, coeff += 2) {
  311. si += st->infi[i] * (*coeff);
  312. sq += st->infq[i] * (*coeff);
  313. }
  314. demod_psk48_baseband(sm, st, si >> 15, sq >> 15);
  315. for (i = si = sq = 0, coeff = psk48_rx_coeff + 1; i < (PSK48_RXF_LEN/2); 
  316.      i++, coeff += 2) {
  317. si += st->infi[i] * (*coeff);
  318. sq += st->infq[i] * (*coeff);
  319. }
  320. demod_psk48_baseband(sm, st, si >> 15, sq >> 15);
  321. }
  322. }
  323. /* --------------------------------------------------------------------- */
  324. static void demodulator_4800_s16(struct sm_state *sm, const short *buf, unsigned int buflen)
  325. {
  326. struct demod_state_psk48 *st = (struct demod_state_psk48 *)(&sm->d);
  327. int i, si, sq;
  328. const short *coeff;
  329. for (; buflen > 0; buflen--, buf++) {
  330. memmove(st->infi+1, st->infi, 
  331. sizeof(st->infi)-sizeof(st->infi[0]));
  332. memmove(st->infq+1, st->infq, 
  333. sizeof(st->infq)-sizeof(st->infq[0]));
  334. si = *buf;
  335. diag_add_one(sm, si);
  336. st->infi[0] = (si * COS(st->downmixer))>>15;
  337. st->infq[0] = (si * SIN(st->downmixer))>>15;
  338. st->downmixer = (st->downmixer-PSK48_PHASEINC)&0xffffu;
  339. for (i = si = sq = 0, coeff = psk48_rx_coeff; i < (PSK48_RXF_LEN/2); 
  340.      i++, coeff += 2) {
  341. si += st->infi[i] * (*coeff);
  342. sq += st->infq[i] * (*coeff);
  343. }
  344. demod_psk48_baseband(sm, st, si >> 15, sq >> 15);
  345. for (i = si = sq = 0, coeff = psk48_rx_coeff + 1; i < (PSK48_RXF_LEN/2); 
  346.      i++, coeff += 2) {
  347. si += st->infi[i] * (*coeff);
  348. sq += st->infq[i] * (*coeff);
  349. }
  350. demod_psk48_baseband(sm, st, si >> 15, sq >> 15);
  351. }
  352. }
  353. /* --------------------------------------------------------------------- */
  354. static void mod_init_4800(struct sm_state *sm)
  355. {
  356. struct mod_state_psk48 *st = (struct mod_state_psk48 *)(&sm->m);
  357. st->scram = 1;
  358. }
  359. /* --------------------------------------------------------------------- */
  360. static void demod_init_4800(struct sm_state *sm)
  361. {
  362. struct demod_state_psk48 *st = (struct demod_state_psk48 *)(&sm->d);
  363. st->dcd_time = 120;
  364. st->dcd_sum0 = 2;
  365. }
  366. /* --------------------------------------------------------------------- */
  367. const struct modem_tx_info sm_psk4800_tx = {
  368. "psk4800", sizeof(struct mod_state_psk48), 
  369. PSK48_SAMPLERATE, 4800,
  370. modulator_4800_u8, modulator_4800_s16, mod_init_4800
  371. };
  372. const struct modem_rx_info sm_psk4800_rx = {
  373. "psk4800", sizeof(struct demod_state_psk48), 
  374. PSK48_SAMPLERATE, 4800, 1, PSK48_TXF_OVERSAMPLING, 
  375. demodulator_4800_u8, demodulator_4800_s16, demod_init_4800
  376. };
  377. /* --------------------------------------------------------------------- */