I'm trying to receive an ASK signal in the 433 MHz center frequency with a bandwidth of 100KHz. I'm using a CC1101 transceiver connected to a Raspberry Pi GPIO ports. However, there is an intermittent signal in the 433MHz center frequency coming from the sensors of my alarm system, so the RX doesn't get all the samples of my wanted signal and I'm not sure how I could filter the interference because both signals are "unknown" (they are not generated by me). I wonder how I could do this, at least in theory.
First of all, the CC1101 supports a number of other frequencies, so as a trivial solution, you can switch to using those.
The other thing that you can do at the RF module level is to "shift" your data out of the problematic region. Now, I am assuming that the other module is on 433MHz and it is not a similar module with similar operation. Let's assume that the interfering module is different than the one you are using.
What you could do, is shift to 4-FSK with the highest
DEVIATION_M (refer to the datasheet) but use it as 2-FSK. What you would be trying to do is use the two symbols that cause the largest deviation to the centre carrier frequency to avoid your data being contaminated by the interference. Usually, these two symbols would be
11 (notice these pairs). This is inefficient of course, but it might work as a quick workaround for you.
But what might be happening is that the other RF module is also behaving in the same way. It might also be doing Frequency Shift Keying, in which case, none of the frequencies your RF module might try to hop to is "safe" from noise.
In this case, you have to work with high levels of noise.
The number one way to guard against this kind of interference is with the use of coding.
This can take many forms and have various complexities. One of the simplest "encoding" schemes is a Repetition Code coupled with simple Majority Decoding scheme. You might notice above that your effective B-FSK used the symbols
11 which, effectively, is a bit like using a repetition code.
One of the issues you might face in this case is that you do not have access to the internals of the RF module. In other words, the only thing you would be doing here is repeat bits $N$ times and at the reception end, receive a frame and decide what bit was sent by assigning the frame to the majority of bits received (either $0$ or $1$).
Obviously the question now is, where does the frame start and where does it end?
To deal with this, you are now going to have to embed your data stream on some form of protocol that specifies that your actual message starts with something like
0000000000111111111100001111001101 followed by your encoded bits.
The frame start sequence has equal chances of being contaminated with noise as the rest of the data, but the idea is to be looking in to your incoming data stream for a sequence that looks as close as possible to the frame start sequence.
And thus, progressively, we are going closer and closer to convolutional codes where you would be inserting redundant
1s in a predictable way in your data stream to be able to decode the most likely sequence to have been sent. That is a bit more involved at the decoding side but convolutional codes are more powerful than plain repetition codes.
Hope this helps.
The best way to share the same carrier is to use CDMA modulation. The GPS satellite constellation all broadcast on the same carriers.
You mentioned that the interference was intermittent, so don’t broadcast when it does. The alarm sensors are either using a schedule or using collision detection-rebroadcast protocol, so fill the empty times.
There is a lot of work called cognitive radio which steals dead time.
Blocking a carrier while simultaneously receiving is hard to do.
Most new stuff is designed to be part of a network, conforming to a standard. Roll your own protocols tend to be frowned on, unless there is a very good reason. The non recurring costs are higher. The maintenance costs are higher. Upgrade is rip out and replace.