DAQ Board Designed for distributed fiber optic acoustic sensing systems, the DAQ board features a high speed sampling rate of 250 MSps, dual channel and pulse-triggered outputs, and built-in IQ demodulation algorithms.
Data Acquisition Card for Distributed Acoustic Fiber Sensing (DAS) with Pulse Output sends TTL pulses directly to the AOM driver, eliminating the need for an additional pulse generator and greatly reducing system complexity.
The DAQ card has a 250MSps sampling rate suitable for DAS systems with 80M acousto-optic modulators (if your AOM is 200M, we recommend choosing our higher sampling rate version of the DAQ YB-DAS-1000-DAQ). The built-in IQ demodulation algorithm allows direct acquisition of amplitude data, which effectively reduces computational complexity.
This is a PCIe x8 Lane, dual channel, 14bits respectively rate high speed data acquisition card with 250MSps sampling rate. high performance FPGA chip on board with rich multiplier and RAM resources. The driver has good compatibility and supports multiple versions of WIN7, WIN8, WIN10 with 32/64bits, as well as CentOS and Ubuntu systems.
YB-DAS-250-DAQ Built-in IQ demodulation function for balanced detector DAS system supports both single-channel and dual-channel IQ demodulation. Simultaneous upload rate can be configured as 250M, 125M, 83.33M, 62.5M, 50M.
When using the upload raw data, or single-channel demodulation function, the number of points per frame (the number of points captured by a single trigger pulse) can support a maximum of 131072 points, i.e., a single length of fiber at 250M (0.4m spatial resolution) upload rate, the The maximum length of a single fiber can reach 131072*0.4m=52.4288km; if the upload rate is reduced, it can support longer fiber length;
When using the dual-channel demodulation function, the number of points per frame (the number of points captured by a single trigger pulse) can support a maximum of 65536 points, i.e., a single optical fiber length can reach a maximum of 65536*0.4m=26.2144 km at an upload rate of 250M (0.4m spatial resolution), and the total kilometers of two-channel optical fibers is 26.2144*2=52.4288 km; If the upload rate is reduced, longer fiber lengths can be supported.
Input Channel | |||
---|---|---|---|
Number of input channels | 2 | ||
Input Impedance | 50±1% | Ω | |
Input Signal Range | 2Vp-p/10dBm | ||
Input coupling method | DC(Customizable AC coupling) | ||
Resolution | 14 | bits | |
Bandwidth(-3dB) | 0-125 (other bandwidths can be customized) | MHz | |
Spurious-free dynamic range(SFDR) | -1dBFS Input/250MSps | ||
fIN=26MHz fIN=42MHz | 88.5 | dBc | |
88.9 | dBc | ||
Signal-to-noise ratio(SNR) | -1dBFS Input/250MSps | ||
fIN=26MHz fIN=42MHz | 70 | dBFS | |
72 | dBFS | ||
Average noise density | -140 | dBm/Hz | |
Internal reference clock | |||
Frequency | 10 | MHz | |
Stability | ±0.5(-20-60℃) | ppm | |
Trigger output | |||
High level minimum voltage | 3.3 | V | |
Pulse width resolution | 4 | nS | |
Minimum pulse width | 4 | nS | |
Digital input/output | |||
Number of channels | 16 | ||
Leveling standards | 3.3V LVTTL | ||
Output drive capability | 8(MAX) | mA | |
Signal Rate | 50(MAX) | Mbps | |
On-Board Cache | 2 | GB(DDR3L) |
We provide the API in the form of a dynamic link library (.dll file) that you can call in your favorite programming language (e.g. python, C++, java or libview). Here is a description of the 2 more important functions.
int pcie6920_data_src_sel(unsigned int data_src_sel)
The digital down-conversion function has been done on the board to perform digital I/Q demodulation of the captured data. The data_src_sel parameter and the demodulation_ch_quantity are used together to select where in the demodulation algorithm the data should be read.
The data read by the pcie6920_read_data function should be parsed according to the following table:
Item | data_src_sel | demodulation _ch_quantity | Uploaded data | Upload data parsing rules |
---|---|---|---|---|
1 | 0 | neglect | Raw data collected | ch0_data---ch1_data---ch0_data---ch1_da ta…… |
2 | 2 | 1 | I/Q data of channel 0 after low-pass filtering | I0---Q0---I0----Q0 …… |
3 | 2 | 2 | I/Q data after low-pass filtering for channels 0 and 1 | I0---Q0---I1----Q1---I0---Q0---I1----Q1 …… |
4 | 3 | 1 | Channel 0 demodulated amplitude and phase data | arctan(I0/Q0)--- √(I02+Q02)---arctan(I0/Q0)--- √(I02+Q02)…… |
5 | 3 | 2 | Amplitude and phase data after demodulation of channels 0 and 1 | arctan(I0/Q0)--- √(I02+Q02)---arctan(I1/Q1)--- √(I12+Q12)---arctan(I0/Q0)--- √(I02+Q02)---arctan(I1/Q1)--- √(I12+Q12)…… |
ch0_data---ch1_data---I0---Q0---I1----Q1--- arctan(I0/Q0)--- arctan(I1/Q1),These 8 types of data need to be parsed as 16-bit signed data (short);√(I02+Q02)--- √(I12+Q12),These two types of data need to be parsed as 16-bit unsigned short numbers.
The arctan phase value read up is a fixed point, and its correspondence with π is: 25733 - positive π, -25732 - negative π。The DAQ does not do phase unwinding internally and requires the user to do spatial and temporal unwinding in the application program, the unwinding method is shown in the following figure:
int pcie6920_upload_rate_sel(unsigned int upload_rate_sel)
Setting the upload rate of IQ or phase/amplitude demodulated data reduces the amount of data uploaded for the same fiber length, but reduces the spatial resolution of individual samples.
upload_rate_sel:
1:Upload rate 250M, corresponding to a single-point spatial resolution of 0.4m;
2:Upload rate of 125M, corresponding to a single-point spatial resolution of 0.8m;
3:Upload rate 83.33M, corresponding to a single-point spatial resolution of 1.2m;
4:Upload rate 62.5M, corresponding to a single-point spatial resolution of 1.6m;
5:Upload rate of 50M, corresponding to a single point of spatial resolution of 2m;
Full interface documentation, please inquire.
# -*- coding: utf-8 -*-
from ctypes import *
import numpy as np
from time import sleep
import datetime
dll = cdll.LoadLibrary("./pcie6920_250m_64bits_api.dll")
samples = 1024 #Sampling Points
flag = True
def open_card():
print('Open...')
dll.pcie6920_open() #open
def init_daq_card():
print('Configure card...')
dll.pcie6920_demodulation_ch_quantity_set(c_uint(1)) #Setting the number of channels requiring IQ demodulation
dll.pcie6920_set_points_num_per_scan(c_double(1024)) #Set the number of points to be collected after each trigger pulse
dll.pcie6920_set_scan_rate(c_double(20000)) #Setting the output frequency of the trigger pulse 20kHz
dll.pcie6920_set_pusle_width(c_uint16(100)) #Setting the high level width of the trigger pulse, 100ns
dll.pcie6920_set_center_freq(c_uint(80000000)) #Set the center frequency of the collected signal, if you only read the raw data you can not call the function
dll.pcie6920_data_src_sel(c_uint(3)) #Setting the data source for reading
dll.pcie6920_upload_rate_sel(c_uint(1)) #Set the rate at which data is uploaded
print("Config end")
def start():
flag = True
print('Start...')
dll.pcie6920_start()
def stop():
flag = True
print('Stop...')
dll.pcie6920_stop()
def close():
print('Close...')
dll.pcie6920_close() #先stop 再close
def read_data():
n_frames = 200
size = c_uint(0)
buf = (c_int16*samples*n_frames)()
flag = True
i=0
start_time = datetime.datetime.now()
while flag:
status_query = dll.pcie6920_point_num_per_ch_in_buf_query(byref(size))
print(f"query.. {size.value}, {status_query=}")
#print(size)
if size.value >=samples*100:
print('Read data...')
status_read = dll.pcie6920_read_data(c_uint(samples*100), buf, byref(size))
""" if size.value!=samples*100:
continue """
ndata = np.frombuffer(buf, dtype=np.int16)
# print(f"Data size: {np.size(ndata)}")
print(f"Start Time: {start_time}, Current Time: {datetime.datetime.now()} - Acquisition number {i}, {status_read=}")
#unwrap code ....
#flag = False
i = i + 1
if i >= 1000000:
flag = False
if status_read == -1:
break
else:
sleep(0.1) #wait...
def run():
open_card()
init_daq_card()
start()
read_data()
stop()
close()
if __name__ == '__main__':
run()