I’m trying to decode a packet from a legacy system using an Si4463 radio.
The message begins with a very long single tone preamble, before going in it’s 3FSK message (yes, it’s odd). I have the radio setup in 4FSK mode using the Direct RX lines to attempt to decode the packet (can’t use the packet radio portion, because there is no transitions in the preamble, also no synch byte). Note, when using 4FSK radio, I simply ignore the 4th key. What I’m struggling with is that the AFC doesn’t want to stay ‘locked on’ to the single tone preamble. I’ll see the middle code in the decoded pramble (along with a bunch of ‘noise’), but I believe the AFC is looking for transitions and hence it doesn’t appear to lock on correctly. I can occasionally decode correctly when I turn AFC off and manually adjust frequency, but this doesn’t help me long term.
Is there any way to setup the AFC to lock on the single tone?
I’ll also take suggestions on new approaches to decode said packet.
You haven't picked the easiest problems to solve. There is some hope though.
Si4463 is capable of detecting as preamble and settling the AFC on CW tones. The CW tone will be perceived as an all ones or all zeroes symbol in 2FSK mode. You can take your pick. The magic property field is PM_PATTERN in API property MODEM_RAW_CONTROL.
- Only works in 2FSK mode.
- Only works in the asynchronous demodulation path. (More on the modes in AN734).
So you cannot apply this directly to your 3FSK scheme. What you can do is settle the AFC on the CW portion, read back the offset (Again AN734 chapter 4.7 or https://www.silabs.com/community/wireless/proprietary/knowledge-base.entry.html/2015/10/27/ezradio_frequencyer-Z5US ) and than change the CF and restart in 4FSK direct mode.
This is rather complex but might work.
To get started can you tell me how long the CW at the beginning of the packet and whcih symbol is it? And also the bit rate and deviation values.
Sorry it took so long to reply, your response didn’t seem to make it in to my inbox.
I’m glad you appreciate my problem. I believe I understand what you’re suggesting. But I have questions.
The good news about all of this is that time is something I do have. The data rate is very slow (less than 1kHz) and the preamble is very long (approx. 100ms).
1) Yes, the API does not specify exact timing here. However, preamble detection jappens the same way as it does for standard (1010) preambles. You can set up a detection threshold in API property PREAMBLE_CONFIG_STD_1 field RX_THRESH. You may configure this field from WDS too. The threshold is in bits which you can transform to absolute CW time.
This is how you do this in practice (i mean the whole CW acquisition configuration). Select a 2FSK modulation format that satisfies the Rx bandwidth requirements of your Rx (taking frequency inaccuracies into account.) i.,e if you signal is 2ksps with 3 frequency symbols 2 kHz apart than your signal bandwidth is around 8 kHz. Suppose you operate at 434 MHz with 2 ppm XOs at Tx and Rx. The frequency inaccuracy range is than +/- 1.73 kHz. This comes on top of the 8 kHz ->you are looking at a bandwidth of 12 kHz. For this 5 kbps 2GFSK with 2.5 kHz would suffice (with XO accuracies set to 0).
Create such a configuration in packet mode; you may use the custom packet rx project from WDS. Select the following premble configuration at the rx side:
Overwrite the following API values in the configuration:
#increase AFC gain at acquisition
#'SET_PROPERTY' 'MODEM_AFC_GEAR' 54
'SET_PROPERTY' 'MODEM_AFC_GEAR' 44
# enable all ones preamble pattern
# 'SET_PROPERTY' 'MODEM_RAW_CONTROL' 8F
'SET_PROPERTY' 'MODEM_RAW_CONTROL' 87
# enable AFC through PLL feedback
# 'SET_PROPERTY' 'MODEM_AFC_MISC' 80
# 'SET_PROPERTY' 'MODEM_AFC_MISC' C0
The last change is needed so that you can read back (and then reapply) the measured frequency offset: chapter 4.7 AN734 (https://www.silabs.com/documents/public/application-notes/AN734.pdf) The value you read back can go straight in API property MODEM_FREQ_OFFSET in the subsequent 4FSK Rx configuration.
2) Yes and also a frequency offset measurement on the CW. This is also needed.
4) Use RX_RAW_DATA it will be correct. You may try RX_DATA, but there the 1st bit may get lost. The slicer level is adjusted with the frequency offset from the CW acquisition configuration.
The whole operation hinges on point 1) Try that 1st. Look for robustness and also check the frequency offset measurement accuracy. You may increase the measurement accuracy by increasing the observation window (as long as the preamble length allows it). Refer to chapter 4.2 in AN734 and also KBA: https://www.silabs.com/community/wireless/proprietary/knowledge-base.entry.html/2015/06/05/si446x_modem_rawsea-VhiB.
Let me know how it goes. I subscribe to this thread so That I can answer faster.