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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************/
  2. /*
  3.  * sm_afsk1200.c  -- soundcard radio modem driver, 1200 baud AFSK modem
  4.  *
  5.  * Copyright (C) 1996  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_afsk1200.h"
  28. /* --------------------------------------------------------------------- */
  29. struct demod_state_afsk12 {
  30. unsigned int shreg;
  31. unsigned int bit_pll;
  32. unsigned char last_sample;
  33. unsigned int dcd_shreg;
  34. int dcd_sum0, dcd_sum1, dcd_sum2;
  35. unsigned int dcd_time;
  36. unsigned char last_rxbit;
  37. };
  38. struct mod_state_afsk12 {
  39. unsigned int shreg;
  40. unsigned char tx_bit;
  41. unsigned int bit_pll;
  42. unsigned int dds_inc;
  43. unsigned int txphase;
  44. };
  45. /* --------------------------------------------------------------------- */
  46. static const int dds_inc[2] = { 
  47. AFSK12_TX_FREQ_LO*0x10000/AFSK12_SAMPLE_RATE,
  48. AFSK12_TX_FREQ_HI*0x10000/AFSK12_SAMPLE_RATE 
  49. };
  50. static void modulator_1200_u8(struct sm_state *sm, unsigned char *buf, 
  51.       unsigned int buflen)
  52. {
  53. struct mod_state_afsk12 *st = (struct mod_state_afsk12 *)(&sm->m);
  54. for (; buflen > 0; buflen--) {
  55. if (!((st->txphase++) & 7)) {
  56. if (st->shreg <= 1)
  57. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  58. st->tx_bit = (st->tx_bit ^ (!(st->shreg & 1))) & 1;
  59. st->shreg >>= 1;
  60. }
  61. st->dds_inc = dds_inc[st->tx_bit & 1];
  62. *buf++ = OFFSCOS(st->bit_pll);
  63. st->bit_pll += st->dds_inc;
  64. }
  65. }
  66. /* --------------------------------------------------------------------- */
  67. static void modulator_1200_s16(struct sm_state *sm, short *buf, unsigned int buflen)
  68. {
  69. struct mod_state_afsk12 *st = (struct mod_state_afsk12 *)(&sm->m);
  70. for (; buflen > 0; buflen--) {
  71. if (!((st->txphase++) & 7)) {
  72. if (st->shreg <= 1)
  73. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  74. st->tx_bit = (st->tx_bit ^ (!(st->shreg & 1))) & 1;
  75. st->shreg >>= 1;
  76. }
  77. st->dds_inc = dds_inc[st->tx_bit & 1];
  78. *buf++ = COS(st->bit_pll);
  79. st->bit_pll += st->dds_inc;
  80. }
  81. }
  82. /* --------------------------------------------------------------------- */
  83. extern __inline__ int convolution8_u8(const unsigned char *st, const int *coeff, int csum)
  84. {
  85. int sum = -0x80 * csum;
  86. sum += (st[0] * coeff[0]);
  87. sum += (st[-1] * coeff[1]);
  88. sum += (st[-2] * coeff[2]);
  89. sum += (st[-3] * coeff[3]);
  90. sum += (st[-4] * coeff[4]);
  91. sum += (st[-5] * coeff[5]);
  92. sum += (st[-6] * coeff[6]);
  93. sum += (st[-7] * coeff[7]);
  94. sum >>= 7;
  95. return sum * sum;
  96. }
  97. extern __inline__ int convolution8_s16(const short *st, const int *coeff, int csum)
  98. {
  99. int sum = 0;
  100. sum += (st[0] * coeff[0]);
  101. sum += (st[-1] * coeff[1]);
  102. sum += (st[-2] * coeff[2]);
  103. sum += (st[-3] * coeff[3]);
  104. sum += (st[-4] * coeff[4]);
  105. sum += (st[-5] * coeff[5]);
  106. sum += (st[-6] * coeff[6]);
  107. sum += (st[-7] * coeff[7]);
  108. sum >>= 15;
  109. return sum * sum;
  110. }
  111. extern __inline__ int do_filter_1200_u8(const unsigned char *buf)
  112. {
  113. int sum = convolution8_u8(buf, afsk12_tx_lo_i, SUM_AFSK12_TX_LO_I);
  114. sum += convolution8_u8(buf, afsk12_tx_lo_q, SUM_AFSK12_TX_LO_Q);
  115. sum -= convolution8_u8(buf, afsk12_tx_hi_i, SUM_AFSK12_TX_HI_I);
  116. sum -= convolution8_u8(buf, afsk12_tx_hi_q, SUM_AFSK12_TX_HI_Q);
  117. return sum;
  118. }
  119. extern __inline__ int do_filter_1200_s16(const short *buf)
  120. {
  121. int sum = convolution8_s16(buf, afsk12_tx_lo_i, SUM_AFSK12_TX_LO_I);
  122. sum += convolution8_s16(buf, afsk12_tx_lo_q, SUM_AFSK12_TX_LO_Q);
  123. sum -= convolution8_s16(buf, afsk12_tx_hi_i, SUM_AFSK12_TX_HI_I);
  124. sum -= convolution8_s16(buf, afsk12_tx_hi_q, SUM_AFSK12_TX_HI_Q);
  125. return sum;
  126. }
  127. /* --------------------------------------------------------------------- */
  128. static const int pll_corr[2] = { -0x1000, 0x1000 };
  129. static void demodulator_1200_u8(struct sm_state *sm, const unsigned char *buf, unsigned int buflen)
  130. {
  131. struct demod_state_afsk12 *st = (struct demod_state_afsk12 *)(&sm->d);
  132. int j;
  133. int sum;
  134. unsigned char newsample;
  135. for (; buflen > 0; buflen--, buf++) {
  136. sum = do_filter_1200_u8(buf);
  137. st->dcd_shreg <<= 1;
  138. st->bit_pll += 0x2000;
  139. newsample = (sum > 0);
  140. if (st->last_sample ^ newsample) {
  141. st->last_sample = newsample;
  142. st->dcd_shreg |= 1;
  143. st->bit_pll += pll_corr
  144. [st->bit_pll < 0x9000];
  145. j = 4 * hweight8(st->dcd_shreg & 0x38)
  146. - hweight16(st->dcd_shreg & 0x7c0);
  147. st->dcd_sum0 += j;
  148. }
  149. hdlcdrv_channelbit(&sm->hdrv, st->last_sample);
  150. if ((--st->dcd_time) <= 0) {
  151. hdlcdrv_setdcd(&sm->hdrv, (st->dcd_sum0 + 
  152.    st->dcd_sum1 + 
  153.    st->dcd_sum2) < 0);
  154. st->dcd_sum2 = st->dcd_sum1;
  155. st->dcd_sum1 = st->dcd_sum0;
  156. st->dcd_sum0 = 2; /* slight bias */
  157. st->dcd_time = 120;
  158. }
  159. if (st->bit_pll >= 0x10000) {
  160. st->bit_pll &= 0xffff;
  161. st->shreg >>= 1;
  162. st->shreg |= (!(st->last_rxbit ^
  163. st->last_sample)) << 16;
  164. st->last_rxbit = st->last_sample;
  165. diag_trigger(sm);
  166. if (st->shreg & 1) {
  167. hdlcdrv_putbits(&sm->hdrv, st->shreg >> 1);
  168. st->shreg = 0x10000;
  169. }
  170. }
  171. diag_add(sm, (((int)*buf)-0x80) << 8, sum);
  172. }
  173. }
  174. /* --------------------------------------------------------------------- */
  175. static void demodulator_1200_s16(struct sm_state *sm, const short *buf, unsigned int buflen)
  176. {
  177. struct demod_state_afsk12 *st = (struct demod_state_afsk12 *)(&sm->d);
  178. int j;
  179. int sum;
  180. unsigned char newsample;
  181. for (; buflen > 0; buflen--, buf++) {
  182. sum = do_filter_1200_s16(buf);
  183. st->dcd_shreg <<= 1;
  184. st->bit_pll += 0x2000;
  185. newsample = (sum > 0);
  186. if (st->last_sample ^ newsample) {
  187. st->last_sample = newsample;
  188. st->dcd_shreg |= 1;
  189. st->bit_pll += pll_corr
  190. [st->bit_pll < 0x9000];
  191. j = 4 * hweight8(st->dcd_shreg & 0x38)
  192. - hweight16(st->dcd_shreg & 0x7c0);
  193. st->dcd_sum0 += j;
  194. }
  195. hdlcdrv_channelbit(&sm->hdrv, st->last_sample);
  196. if ((--st->dcd_time) <= 0) {
  197. hdlcdrv_setdcd(&sm->hdrv, (st->dcd_sum0 + 
  198.    st->dcd_sum1 + 
  199.    st->dcd_sum2) < 0);
  200. st->dcd_sum2 = st->dcd_sum1;
  201. st->dcd_sum1 = st->dcd_sum0;
  202. st->dcd_sum0 = 2; /* slight bias */
  203. st->dcd_time = 120;
  204. }
  205. if (st->bit_pll >= 0x10000) {
  206. st->bit_pll &= 0xffff;
  207. st->shreg >>= 1;
  208. st->shreg |= (!(st->last_rxbit ^
  209. st->last_sample)) << 16;
  210. st->last_rxbit = st->last_sample;
  211. diag_trigger(sm);
  212. if (st->shreg & 1) {
  213. hdlcdrv_putbits(&sm->hdrv, st->shreg >> 1);
  214. st->shreg = 0x10000;
  215. }
  216. }
  217. diag_add(sm, *buf, sum);
  218. }
  219. }
  220. /* --------------------------------------------------------------------- */
  221. static void demod_init_1200(struct sm_state *sm)
  222. {
  223. struct demod_state_afsk12 *st = (struct demod_state_afsk12 *)(&sm->d);
  224.         st->dcd_time = 120;
  225. st->dcd_sum0 = 2;
  226. }
  227. /* --------------------------------------------------------------------- */
  228. const struct modem_tx_info sm_afsk1200_tx = {
  229. "afsk1200", sizeof(struct mod_state_afsk12), 
  230. AFSK12_SAMPLE_RATE, 1200, modulator_1200_u8, modulator_1200_s16, NULL
  231. };
  232. const struct modem_rx_info sm_afsk1200_rx = {
  233. "afsk1200", sizeof(struct demod_state_afsk12), 
  234. AFSK12_SAMPLE_RATE, 1200, 8, AFSK12_SAMPLE_RATE/1200, 
  235. demodulator_1200_u8, demodulator_1200_s16, demod_init_1200
  236. };
  237. /* --------------------------------------------------------------------- */