FreeDV 2400A

前言

FreeDV 2400A是一种使用Codec2声码器,4FSK分帧调谐的简单数字语音调解制式,其拥有比FM模拟音频更优秀的传输性能,适合在VHF、UHF波段使用。但是之前因为成本与接受度原因未得到推广。现在我希望把他捡起来作为一种业余业务的通联方式。

Codec2声码器是无专利限制的自由软件。

计划

  • GNURadio implmentation: Done,Untested 不知道随手写的deframer靠不靠谱。
  • MMDVM_HS Board side support W.I.P.
  • MMDVM with freedv_rx/tx W.I.P.
  • User friendly SDR software, consider qradiolink?

MMDVM_HS坑

ADF7021 prefer SYNC Word, 但是2400A没有定义SYNC Word,Unique Word也在帧中。

ADF7021 4FSK symbol mapper是Grey Code的顺序,但是freedv的4FSK是一般顺序,需要解包。

Big-Endian在rx/tx FIFO RB里是Little Endian?

Spec坑

FreeDV.org 上竟然没有VHF 4FSK制式的Spec????底下的Spec是按代码蒙出来的。

置频到底算谁?freedv的FSK I/Q Carrier的是最低频,然而DMR、D-STAR、M17这些似乎是中频,ADF7021也是中频。

全世界都在用gray code,为啥FreeDV不用。

1
2
3
4
5
gray sym -> bin sym
+3 -> 3
+1 -> 2
-1 -> 1
-3 -> 0

Data Payload定义好迷,先不做了。

没有流控没有CD没有时隙,特性和FM差不多,并不能治压台(

Physical Modulation

2400A

The radio system operates within a 4.8 kHz RF carrier bandwidth.

The modulation sends 1200 symbols/s with each symbol conveying 2 bits of information.

1
2
3
4
5
6
| Bit1 | Bit0 | Symbol | 4FSK deviation to center | 4FSK deviation to tune | 
| ---- | ---- | ------ | ------------------------ | ---------------------- | 
|  1   |  1   |   3    |          +1800Hz         |          +4800Hz       |
|  1   |  0   |   2    |          +600Hz          |          +3600Hz       |
|  0   |  1   |   1    |          -600Hz          |          +2400Hz       |
|  0   |  0   |   0    |          -1800Hz         |          +1200Hz       |

Suggested Channel Spacing: 6.25 KHz

Implementation notes

  • It does not use gray code symbol order.
  • For freedv_rx raw I/Q input, it must tune to 3000 Hz below expected center frequency.

Framing

FreeDV 2400 uses a fixed length, MSB first frame structure. The total length of a frame is 96 bits, it consists 16 bits of Unique Word (UW), 52 bits of DATA/Voice payload, 20 bits of protocol and 8 bits of padding (4 bits at the start, 4 bits at the end).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|--------------------------------------------------------------------------------
|  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 | 10 | 11 | 12 | 13 | 14 | 15 |    
|    Padding[0:3]   |                        Proto[0:11]                        |
|--------------------------------------------------------------------------------

---------------------------------------------------------------------------------
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |    
|                                 Payload[0:15]                                 |
---------------------------------------------------------------------------------

---------------------------------------------------------------------------------
| 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |    
|           Payload[16:23]              |                UW[0:7]                |
---------------------------------------------------------------------------------

---------------------------------------------------------------------------------
| 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |    
|                UW[8:15]               |            Payload[24:31]             |
---------------------------------------------------------------------------------

---------------------------------------------------------------------------------
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |    
|                                Payload[32:47]                                 |
---------------------------------------------------------------------------------

--------------------------------------------------------------------------------|
| 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 |    
|   Payload[48:51]  |              Proto[12:19]             |    Padding[4:7]   |
--------------------------------------------------------------------------------|

Fields

Padding

No actual meaning, recommanded to be Padding[8:0] = 0x45.

UW (Unique Words)

Simple Codec2 Voice

Should be {UW[15:8], UW[7:0]} = {0xB5, 0xE6}.

Proto

Simple Codec2 Voice

All zero.

Payload

Simple Codec2 Voice

MSB first CODEC2_MODE_1300 data.

Licensed under CC BY 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy