前言
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.