BB60C–external trigger–bbFetchRaw(buffer, triggers)
I use GPS to 1PPS to fetch external trigger.
I call bbFetchRaw() Continuously.
And every 76~ times triggers have a non-negative value, like 739915,1048099,307706…
So I want to know what does these numbers mean?
Means the start posiontion of external trigger?
Like this: triggers == 307706, so buffer[307706*2] and buffer[307706*2 + 1]?
But bufferLen is 16384(sample rate: 625000)…
And my GPS module， 1PPS is LVTTL, 3.3V
catalin_roParticipantcatalin_ro October 9, 2016 at 4:32 am
I decided not to start another thread because the problem I have just discovered is related. The setup is 100% identical.
There is spurious trigger event occurring on the first ever call of bbInitiate with trigger input enabled, after opening the receiver, even if the trigger input is hardwired to ground. Subsequent bbInitiate calls do not cause spurious trigger events.
If the first ever bbInitiate call is with trigger input disabled there is no spurious event when later enabling the input.
The spurious event is always in the first ever received buffer at sample 572 with 64-bit APIs and at sample 1144 with 32-bit APIs. Tested with 32-bit and 64-bit API 3.0.11 (bbFetchRaw) and 64-bit API 3.0.14 (bbGetIQ).
CatalinAndrew October 10, 2016 at 9:03 am
I apologize for the confusion. The bbFetchRaw function, before the last API version, returns trigger values relative to the full 40MS/s rate. To convert to values relative to the IQ data you received, simply divide the trigger values by the decimation rate, 64 in the example you provided. In the latest API version with the bbGetIQ function, we are performing the calculation for the user.
Thank you, Andrew!
And I have another question…
Please look at the picture, like
trigger == 853325———28———16384
28 means this is the twenty-eighth times I call bbFetchRaw().
16384 means when the decimation is 64, the bufferLen is 16384.
So the trigger position is 2 * 853325 / 64 = 26,666.4062 ?
But 26,666 > 16384 ?
26,666 / 16384 = 1.63, so trigger position is at the middle of the
twenty-ninth buffer(when I call bbFetchRaw twenty-ninth times)?
catalin_roParticipantcatalin_ro October 11, 2016 at 12:26 am
I might reply to this one!
First of all, the buffer length is in I/Q samples, not in 32-bit floating point values. So, the 16384 I/Q samples in each buffer actually means 32768 (2*16384) 32-bit floating point values. Considering that, the index that you reported in the example, 26666, is mostly correct.
But there is a well hidden problem in how you determined it. The API manual states that the trigger position is in I/Q samples number. So you must first convert the trigger position to the I/Q sample number before multiplying it by 2.
So you have SamplePos=TrigPos/DecimRatio (integer math!) and then go at 2*SamplePos in the received buffer to get the samples after the trigger.
The way you estimated the sample position is not correct because for many trigger position values, when using integer math, 2*Pos/Decim is different from 2*(Pos/Decim) and you end up accessing the Q1/I2 instead of I1/Q1 (the samples are considered I1/Q1, I2/Q2 etc.).
Thank you, Catalin~
I apologize for the confusion. The bufferLen is 8192(decimation is 64).
So the I and Q have 16384 samples totally.
So 26,666.4062 still bigger than 16384.
I want to konw that 26,666.4062 means the buffer(26,666.4062 – 16384 = 10282.4062) & buffer of the next buffer?
sszqdzAndrew October 11, 2016 at 8:20 am
Divide the trigger value by (decimation * 2) instead of decimation. This will give you the result you are looking for. I realize it is not documented as well as it should be. I misspoke before, the trigger values are relative to the 80MS/s IF data, which is converted to 40MS/s IQ (before decimation), so this additional factor of two still needs to be accounted for. The trigger values returned should always refer to the data just received, never for some future call to bbFetchRaw.
Hi，Andrew~ I have a new problem…
Yesterday I used two BB60C devices to collect IQ data at the same time(Using external trigger of second pluse).
Then I use matlab to seek correlation peak. But there are no correlation peaks….
So, what’s wrong with my operation?
My computer is table and have a Intel Core i7 CPU.
Using external trigger to collect IQ data can’t make sure collecting at the same time?Andrew October 25, 2016 at 9:09 am
Can you provide more information about your setup? How are you using the external triggers? What are you measuring? What are you correlating? Have you made successful measurements with both receivers? Does the data look good on both receivers? I’m not sure what you mean with the question “Using external trigger to collect IQ data can’t make sure collecting at the same time?” The presence of an external trigger does not synchronize the receivers, you still need to write code to use the trigger locations to synchronize the data streams.
I look forward to your response.
I’m sorry, I’m not explaning my question very well.
I want to start collecting signals at the same time.
Last week, I write code to collect the same signal with two BB60C devices using external triggers(second pulse).The sample rate is 625000.
I think trigger location is the same moment, but it is not.
I draw the IQ image with MATLAB. Obviously, it is not the same moment two sets fo data collection(the difference between the two trigger location for more than 800ns * 100 = 80000ns).
So I wonder how many nanoseconds precision can reach when i use external trigger?
I’m looking forward to your answer.
two group of data
Justin CrooksModeratorJustin Crooks November 1, 2016 at 9:31 am
It looks like maybe the phase of your I/Q data doesn’t match up. Is this what you are seeing?
You should not expect the phase of two demodulated signals to line up. Even if the BB60s use the same external trigger and external time base, there is still a fractional-N PLL that can lock to several different phases each time you change the LO frequency.
Multi-channel phase coherent receivers exist, but they are generally more expensive.
If you need to make phase coherent measurements with two BB60Cs, generally you would:
1) Use a common external 10 MHz reference to align frequency
2) Use a common trigger to align time within 50 ns.
Now, all that is missing is phase alignment, and this is where it gets tricky.
3) Select your frequency on both devices, and begin streaming I/Q data. Do not change frequencies or interrupt the I/Q data stream for the next steps.
4) Send a known signal to both devices to calculate a phase offset (and possibly amplitude offset if needed) between devices
5) Connect your unknown signal. You can now measure relative phase between the two streaming devices, until you change frequency or the I/Q stream is interrupted.
Hello Justin Crooks,
I’m very glad to receive your reply.
We are doing a TDOA positioning system (with external trigger, not external 10 MHz reference). We encountered the problem now is the collection of data is not the same time.
I’m sure you know something about it. I’m looking forward to your advice.
Lee.Andrew November 3, 2016 at 10:57 am
If you have additional questions, you may email justin @ signalhound dot com. The previous response from Justin described how you would use an external trigger and 10MHz reference to phase correlate two streaming receivers. If you need dual channel phase locked receivers without going through this much effort there are several receivers on the market which can do this for you. If you have more specific questions about your application, it would be helpful to know more about your setup and what you have accomplished so far. We look forward to your email.
You must be logged in to reply to this topic.