Release status: stable [box doku]
|Description||use the VGA port to generate I/Q baseband signals|
|Last Version||0.2 ()|
This software provides an highspeed, easy to use DAC interface using the VGA compatibel CRTC in your graphics card. It reads from stdin and generates appropriate analog signals on the VGA connector. Those signals could for example be used to feed a rf-modulator. This software is intended to be used with SDRT or SDRT2.
- PC with VGA adapter
- OpenGL with Direct Redering
- Vsync enabled
- Software-defined Radio Transmitter that generates I/Q Signals
- GL_ARB_fragment_program to use the low-pass filter
- GL_ARB_pixel_buffer_object for efficient CPU to GPU transfers
What it does
The current version runs on any symbolrate, recommended are 5MSymbols/s or more.
Every symbol is a complex number, that contains an I (real) and Q (imag) value.
By default the signal is lowpass filtered using convolutional sinc function. Low pass filtering can be disable using -n argument. The I/Q values are read from stdin. The software accepts BYTE, SHORT and FLOAT as input values. The real part (I) is assigned to the RED and the imag part (Q) to the GREEN channel, while the BLUE channel is set to 0.5f. 8bit and 10bit VGA Graphic cards are supported.
vgatobaseband uses the first VGA output found. If none found it uses the first output that is active. The VGA output has to be configured first using xrandr, arandr, ....
The coordinates are saved, a new modeline is added and set.
All baseband signals contains positive as well as negative numbers. If your signal range covers -1.0f to 1.0f you have to convert them.
newval = (float2)(oldval.i/2 + 0.5f, oldval.q/2 + 0.5f)
The newval is now in range 0.0f to 1.0f and can be used with this programm.
Due to most GPU only having 8bit DACs the floats are converted into a range from -127 to 127 (using the blue channel as differential reference).
reads data from stdin
ARGS could be:
-n disable fragmentshader --nofilter disable fragmentshader -v be verbose --verbose same as -v -display DISPLAY Specify the X server to connect to. If not specified, the value of the DISPLAY environment variable is used. -direct force direct rendering -t generates test patterns --testpattern same as -t -d <x> convolutional depth default: 17 -f <c> same as --freq (float) --freq <c> set convolutional filter cut-of frequency to c Mhz (c is float) default: 3.81 Mhz -h same as --help --help print help message -z <x> 4 for float, 2 for ushort, 1 for uchar --datasize <x> same as -z
only if compiled with libXrandr support: -cutofright <n> cutof n rightmost pixels (hsync) default: 1 -cutofbottom <m> cutof m bottommost pixels (vsync) default: 2 -pclk <x> use a pixelclock of x Mhz default: 64
Set the VGA position first:
xrandr --output VGA-0 --right-of LVDS --auto
adjust VGA-0 and LVDS according to your system.
cat inputfile.raw > ./vgatoiqbaseband -v
This will read from the file inputfile.raw .
./vgatoiqbaseband -v -t
This will generate test paterns.
You may also use
OFDM useful carriers to total carriers ratio: 1705 / 2048 = 0.832
|DAC clock [Mhz]||Msymbols/s||carrier ratio||3dB Bandwidth Mhz|
As phase-shifting OFDM symbols results in malformed spektrum, the horizontal sync is padded with blanking pixel to make sure the sync has the same size as all other symbols.
The convolutional filter is critical in this application. Using OFDM 8 Mhz bandwidth the I and Q channel maximum frequency is 3.81 Mhz. The DAC sampling rate is 9.142 MSPS which is enough to reconstruct all frequencies, but due to the low sampling rate the baseband signal contains aliasing artefakts.
To remove those artefakts a si-filter is neccessary, including an interpolation DAC, which is running at much higher sampling rate.
This is done by the fragment shader, implemented in shader.cpp.
The GPU has to fetch, multiply, add and store at least <sampling rate> * <conv_depth> pixels
|DAC clock [MSps]||GPU||Driver||max Kernel_size|
|recommended||27 or more|
A hardware low-pass filter is required to remove remaining aliasing effects.
On fglrx the default screen size is 1600x1600. To increase this limit generate an xorg.conf using 'aticonfig --initial' and add this line:
[...] Section "Screen" Identifier "aticonfig-Screen-0" Device "aticonfig-Device-0" Monitor "aticonfig-Monitor-0" DefaultDepth 24 SubSection "Display" Viewport 0 0 Virtual 3600 1600 Depth 24 EndSubSection EndSection
The line containing "Virtual" is critical. This should be no problem on Mesa as the default screen size is 8196x8196.
- You may use a custom edid, see here for more details HackingVGAforFun.