Contents

Frequency Fix for GOCOM GD900

The GOCOM GD900 I received was offset by about 500Hz which resulted in a high BER on my MMDVM hotspot. With the discovery the secret AT command interface, it is now possible to fix the offset inside the radio.

The AUCTUS A6 based radios have a hidden AT command interface which includes many commands which can be used to alter internal settings of the radio. One pair of these alters a frequency offset which is used to calibrate the TCXO. Using these commands, I have made a tool to fix the miscalibrated GOCOM GD900 I bought and brought the BER down to a reasonable level. This radio will no longer make me sound like a robot. :)

The GD900 I bought from Amazon had a pretty high BER. After some testing, I determined that the radio was transmitting with the frequency shifted a bit. It is possible to fix the offset by adding a small correction to the frequencies in the CPS, but it seems like the sort of thing that should be correctable in the radio.

To measure the offset, a spectrum analyzer would be best. However, you can find the offset using a regular old SDR such as an RTL-SDR. I used an RTL-SDRv3 with SDR#, but whatever you have available will probably work.

Now the RTL-SDR isn’t going to be some standard of frequency accuracy. Even if it were possible to calibrate the SDR, it drifts with temperature. Instead, I would suggest using something else as a frequency standard, comparing the “good” against the “bad” to find an offset.

Frequency Offset

Frequency offset of my Anytone D878UV, top, vs the Gocom GD900, bottom

The error we are trying to measure is on the order of 100s of Hz while the signal itself is ~12.5 kHz in width. Using the VFO in SDR#, pick the middle of the signal to measure its frequency.

Frequency Offset

Measured frequency of the Gocom GD900

And then measure the frequency for the known good radio.

Frequency Offset

Measured frequency of the Anytone D878UV

Now subtracting these two, I get an offset of -2085 Hz.

To fix the offset, we first need the offset that is programmed into the memory of the radio. In the list of AT commands, there is a command to GETFREQERR. Sending the AT+GETFREQERR command returns this:

1
2
3
4
5
6
_OnCmd_GETFREQERR the compesation value[-1000]
tx_length:19
ATE_SendDataFrame:
+GETFREQERR:150

ATE pipe. used[HOST]

The current offset is -1000 Hz shown on that top line.

To set the frequency offset, we need to calculate the new value. When reading the offset there are actually two numbers given. The pretty printed value of -1000 and the AT command response “+GETFREQERR:150”. To set the offset value to -1000 we would send AT+DMOFREQERR=150 to the radio.

1
2
3
4
5
6
7
8
_OnCmd_DMOFREQERR
TCXO's fc compesation:-1000, txFreqErr[150]
ATE_SendCmdAck: cmd:DMOFREQERR isOk:0x1
tx_length:17
ATE_SendDataFrame:
+DMOFREQERR:0

ATE pipe. used[HOST]

The formula for offset is -2500 + 10 * FREQERR = offset or in reverse (offset + 2500) / 10.

With everything in hand, it is now possible to fix the offset in the radio. The current value of -1000 Hz is low by 2085 Hz. We need to raise the offset by 2085 to a final value of 1085. This give a FREQERR setting of 358.5 but as the radio only accepts whole numbers, lets set it to 358.

1
2
3
4
5
6
7
8
_OnCmd_DMOFREQERR
TCXO's fc compesation:1080, txFreqErr[358]
ATE_SendCmdAck: cmd:DMOFREQERR isOk:0x1
tx_length:17
ATE_SendDataFrame:
+DMOFREQERR:0

ATE pipe. used[HOST]

Now one thing before going and testing this out. Change the channel back and forth. The frequency offset isn’t reloaded until the frequency is changed! And now trying this out we get the following offset on the SDR.

Frequency Offset

Measured frequency of the GOCOM GD900 after fixing the offset.

Awesome. The frequency is dead on now. Having a look at BER on my MMDVM hotspot shows that the BER is now a respectable 0.3% as compared with the 5% I was getting before the fix.

We are already using python to push the AT commands which are encapsulated in 2 other protocols, so why not just automate the process? I made a small tool, freqoffset.py, to help in fixing the offset of the radio by just giving it the measured frequency and the programmed frequency and it will automatically set an appropriate offset in the radio for you.

1
2
3
4
5
6
7
8
$ python3 freqoffset.py 438800000 438800000
_OnCmd_DMOFREQERR
TCXO's fc compesation:-400, txFreqErr[210]
ATE_SendCmdAck: cmd:DMOFREQERR isOk:0x1
tx_length:17
ATE_SendDataFrame:
+DMOFREQERR:0
ATE pipe. used[HOST]

With modest equipment, the frequency offset of the GOCOM GD900 can be corrected in the radio. There are plenty of other applications for the AT interface, but I think that this one solves one aggravating problem and shows the utility of having this programming interface.