Post date: Nov 30, 2011 3:28:17 PM
"It's a long way to the top if you want to rock-n-roll" - AC/DC. If you want to actually do any useful digital interferometry, you need to synchronize data streams from your SDRs. Mastery of this step can take you from failure and obscurity to the next level if pay attention to the details.
Now that raw IQ data files are captured, they will need to be synchronized to within a single sample prior to cross correlation. This step can be somewhat difficult and may require some effort to excise RFI in order to align data. I use a Python script that works pretty well, but it is far from being an automatic process. With practice though, I can align files with relative ease.
At the present time, BladeRF's can be clock synchronized via their MIMO ports, but data streams from each radio can not be automatically synchronized. Sample stream synchronization is on the BladeRF developers' to-do list, but so far, it hasn't been implemented. In my experience, three BladeRF's will be aligned to within 10,000 IQ sample pairs, so extensive searching isn't needed to align data. A FFT -> cross correlation -> iFFT based approach is used to identify where the signals align.
The Python script used to find the alignment point is attached here. Basically, the script slides blocks of IQ data past each other and does the FFT/X/iFFT, looking for the position where the most power is in the iFFT array. This provides a value which is used to delay/advance each dataset to within one IQ sample.
Examples of what the iFFT looks like shown above. The three baselines are represented in red, green and blue. Alignment at the 500 position represents synchronized data streams. The Python code that shows the image above (tripleprecross.py) and the code the generates the 2D frequency/time spectrograms (triplecross.py) are attached here.
The key parts of the FX correlator are here. This is the yellow brick road to success for your very own FX correlator, right here.