usrp-users@lists.ettus.com

Discussion and technical support related to USRP, UHD, RFNoC

View all threads

B210 set BW

RB
Raj Bhattacharjea
Mon, Jan 26, 2015 11:27 PM

There was this thread from some time ago discussing setting the filter
bandwidth on the B210:

http://lists.ettus.com/pipermail/usrp-users_lists.ettus.com/2014-August/010459.html

It looks to me like the functionality to set the filter coefficients in the
AD9361 is there in the UHD code now, namely in the AD9361_device driver,
but the functionality hasn't been plumbed all the way up to the public API.

Even so, can I use the ad9361_device_t::_program_fir_filter API directly
myself with my custom selection of coefficients (assuming I change the
method to "public" or use a friend function or class)? How can I get a
pointer to the underlying ad9361_device_t object from the higher level APIs?

And finally, since ad9361_device_t::_program_fir_filter exists, is
completing this functionality now just a matter of designing a database of
filter coefficients for some discrete set of bandwidths and/or implementing
a filter design routine and plumbing things through appropriately?

--
Raj Bhattacharjea
Georgia Institute of Technology
School of Electrical and Computer Engineering
http://www.prism.gatech.edu/~gtg037s/
404.894.7516

There was this thread from some time ago discussing setting the filter bandwidth on the B210: http://lists.ettus.com/pipermail/usrp-users_lists.ettus.com/2014-August/010459.html It looks to me like the functionality to set the filter coefficients in the AD9361 is there in the UHD code now, namely in the AD9361_device driver, but the functionality hasn't been plumbed all the way up to the public API. Even so, can I use the ad9361_device_t::_program_fir_filter API directly myself with my custom selection of coefficients (assuming I change the method to "public" or use a friend function or class)? How can I get a pointer to the underlying ad9361_device_t object from the higher level APIs? And finally, since ad9361_device_t::_program_fir_filter exists, is completing this functionality now just a matter of designing a database of filter coefficients for some discrete set of bandwidths and/or implementing a filter design routine and plumbing things through appropriately? -- Raj Bhattacharjea Georgia Institute of Technology School of Electrical and Computer Engineering http://www.prism.gatech.edu/~gtg037s/ 404.894.7516
JA
Julian Arnold
Tue, Jan 27, 2015 2:12 AM

Hi Raj,

We are currently working on exposing all the filter manipulation features
(including reprogramming of FIR filter taps) for the B2xx series devices in
a future UHD release.

In the meantime, you can hard-code new filter coefficients
in lib/usrp/common/ad9361_driver/ad9361_filter_taps.h. In order to
manipulate the ad9361_device_t object from a higher layer, you would need
manipulate the property tree. If you would like, I could send you a patch
that would implement this functionality and provide you with early access
to it. However, please keep in mind that the final released implementation
may differ from what is done in the patch. Furthermore, please note that
the patch is preliminary code, and does not include any formal support, and
therefore should not be used on any critical or production systems.

Please let me know how you would like to proceed.

Cheers,
Julian

On Mon, Jan 26, 2015 at 3:27 PM, Raj Bhattacharjea via USRP-users <
usrp-users@lists.ettus.com> wrote:

There was this thread from some time ago discussing setting the filter
bandwidth on the B210:

http://lists.ettus.com/pipermail/usrp-users_lists.ettus.com/2014-August/010459.html

It looks to me like the functionality to set the filter coefficients in
the AD9361 is there in the UHD code now, namely in the AD9361_device
driver, but the functionality hasn't been plumbed all the way up to the
public API.

Even so, can I use the ad9361_device_t::_program_fir_filter API directly
myself with my custom selection of coefficients (assuming I change the
method to "public" or use a friend function or class)? How can I get a
pointer to the underlying ad9361_device_t object from the higher level APIs?

And finally, since ad9361_device_t::_program_fir_filter exists, is
completing this functionality now just a matter of designing a database of
filter coefficients for some discrete set of bandwidths and/or implementing
a filter design routine and plumbing things through appropriately?

--
Raj Bhattacharjea
Georgia Institute of Technology
School of Electrical and Computer Engineering
http://www.prism.gatech.edu/~gtg037s/
404.894.7516


USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

--
Julian Arnold

Hi Raj, We are currently working on exposing all the filter manipulation features (including reprogramming of FIR filter taps) for the B2xx series devices in a future UHD release. In the meantime, you can hard-code new filter coefficients in lib/usrp/common/ad9361_driver/ad9361_filter_taps.h. In order to manipulate the ad9361_device_t object from a higher layer, you would need manipulate the property tree. If you would like, I could send you a patch that would implement this functionality and provide you with early access to it. However, please keep in mind that the final released implementation may differ from what is done in the patch. Furthermore, please note that the patch is preliminary code, and does not include any formal support, and therefore should not be used on any critical or production systems. Please let me know how you would like to proceed. Cheers, Julian On Mon, Jan 26, 2015 at 3:27 PM, Raj Bhattacharjea via USRP-users < usrp-users@lists.ettus.com> wrote: > There was this thread from some time ago discussing setting the filter > bandwidth on the B210: > > > http://lists.ettus.com/pipermail/usrp-users_lists.ettus.com/2014-August/010459.html > > It looks to me like the functionality to set the filter coefficients in > the AD9361 is there in the UHD code now, namely in the AD9361_device > driver, but the functionality hasn't been plumbed all the way up to the > public API. > > Even so, can I use the ad9361_device_t::_program_fir_filter API directly > myself with my custom selection of coefficients (assuming I change the > method to "public" or use a friend function or class)? How can I get a > pointer to the underlying ad9361_device_t object from the higher level APIs? > > And finally, since ad9361_device_t::_program_fir_filter exists, is > completing this functionality now just a matter of designing a database of > filter coefficients for some discrete set of bandwidths and/or implementing > a filter design routine and plumbing things through appropriately? > > -- > Raj Bhattacharjea > Georgia Institute of Technology > School of Electrical and Computer Engineering > http://www.prism.gatech.edu/~gtg037s/ > 404.894.7516 > > _______________________________________________ > USRP-users mailing list > USRP-users@lists.ettus.com > http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com > > -- Julian Arnold
IB
Ian Buckley
Tue, Jan 27, 2015 2:55 AM

Raj,
There is currently no roadmap feature to provide on-the-fly generation of FIR coefficients to meet a run time spec.
The current driver code just selects from the pre-generated coeffs to match the logical size of the FIR filter for a given configuration.
There is a bug fix that will hit the maint branch soon that provides FIR coefficients for decimation by 4 modes of AD9361 also.
It is actually relatively easy to generate your own coefficients for custom filters in Octave with the Signal package:
For example to generate a 128 tap filter that has the stop band set at 0.25Fs in a format that is easy to use to C,

octave:3>  pkg load signal
octave:4> bb = round(2^16 * fir1(127,0.25));
octave:5>  freqz(bb);
octave:6> dlmwrite ("file.csv",bb,",");

Now to your question about the currently stubbed API call 'set_bw_filter'. This API call is a placeholder for programable analog filter bandwidth and will ultimately hook upto existing methods like '_calibrate_baseband_rx_analog_filter' to add programability to the analog front end of AD9361. Currently the analog front end filters are configured statically to bandwidths that match the configured master_clock_rate.

-Ian

On Jan 26, 2015, at 3:27 PM, Raj Bhattacharjea via USRP-users usrp-users@lists.ettus.com wrote:

There was this thread from some time ago discussing setting the filter bandwidth on the B210:

http://lists.ettus.com/pipermail/usrp-users_lists.ettus.com/2014-August/010459.html

It looks to me like the functionality to set the filter coefficients in the AD9361 is there in the UHD code now, namely in the AD9361_device driver, but the functionality hasn't been plumbed all the way up to the public API.

Even so, can I use the ad9361_device_t::_program_fir_filter API directly myself with my custom selection of coefficients (assuming I change the method to "public" or use a friend function or class)? How can I get a pointer to the underlying ad9361_device_t object from the higher level APIs?

And finally, since ad9361_device_t::_program_fir_filter exists, is completing this functionality now just a matter of designing a database of filter coefficients for some discrete set of bandwidths and/or implementing a filter design routine and plumbing things through appropriately?

--
Raj Bhattacharjea
Georgia Institute of Technology
School of Electrical and Computer Engineering
http://www.prism.gatech.edu/~gtg037s/
404.894.7516


USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Raj, There is currently no roadmap feature to provide on-the-fly generation of FIR coefficients to meet a run time spec. The current driver code just selects from the pre-generated coeffs to match the logical size of the FIR filter for a given configuration. There is a bug fix that will hit the maint branch soon that provides FIR coefficients for decimation by 4 modes of AD9361 also. It is actually relatively easy to generate your own coefficients for custom filters in Octave with the Signal package: For example to generate a 128 tap filter that has the stop band set at 0.25Fs in a format that is easy to use to C, octave:3> pkg load signal octave:4> bb = round(2^16 * fir1(127,0.25)); octave:5> freqz(bb); octave:6> dlmwrite ("file.csv",bb,","); Now to your question about the currently stubbed API call 'set_bw_filter'. This API call is a placeholder for programable analog filter bandwidth and will ultimately hook upto existing methods like '_calibrate_baseband_rx_analog_filter' to add programability to the analog front end of AD9361. Currently the analog front end filters are configured statically to bandwidths that match the configured master_clock_rate. -Ian On Jan 26, 2015, at 3:27 PM, Raj Bhattacharjea via USRP-users <usrp-users@lists.ettus.com> wrote: > There was this thread from some time ago discussing setting the filter bandwidth on the B210: > > http://lists.ettus.com/pipermail/usrp-users_lists.ettus.com/2014-August/010459.html > > It looks to me like the functionality to set the filter coefficients in the AD9361 is there in the UHD code now, namely in the AD9361_device driver, but the functionality hasn't been plumbed all the way up to the public API. > > Even so, can I use the ad9361_device_t::_program_fir_filter API directly myself with my custom selection of coefficients (assuming I change the method to "public" or use a friend function or class)? How can I get a pointer to the underlying ad9361_device_t object from the higher level APIs? > > And finally, since ad9361_device_t::_program_fir_filter exists, is completing this functionality now just a matter of designing a database of filter coefficients for some discrete set of bandwidths and/or implementing a filter design routine and plumbing things through appropriately? > > -- > Raj Bhattacharjea > Georgia Institute of Technology > School of Electrical and Computer Engineering > http://www.prism.gatech.edu/~gtg037s/ > 404.894.7516 > _______________________________________________ > USRP-users mailing list > USRP-users@lists.ettus.com > http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
RB
Raj Bhattacharjea
Tue, Jan 27, 2015 4:13 AM

I see that generating coefficients to meet a spec is possible in my filter
design tool of choice (Matlab in my case); with the current API, I can only
hardcode these coefficients into ad9361_filter_taps header and recompile a
"custom" UHD, is that correct?

Your last comment is new information to me. Perhaps I misunderstood the
AD9361's capabilities. In has tunable analog filters? I assumed that it had
a fixed analog filter, sampled at more than Nyquist of that filter
bandwidth, filtered in digital to a bandwidth <56MSps, and then decimated
down to a lower sample rate. Is this incorrect?

If I set the sampling rate and the master clock rate to the same value (say
26 MHz), then the net effect will be a bandpass filter around my center
frequency of approximately this bandwidth?

On Mon, Jan 26, 2015 at 9:55 PM, Ian Buckley ianb@ionconcepts.com wrote:

Raj,
There is currently no roadmap feature to provide on-the-fly generation of
FIR coefficients to meet a run time spec.
The current driver code just selects from the pre-generated coeffs to
match the logical size of the FIR filter for a given configuration.
There is a bug fix that will hit the maint branch soon that provides FIR
coefficients for decimation by 4 modes of AD9361 also.
It is actually relatively easy to generate your own coefficients for
custom filters in Octave with the Signal package:
For example to generate a 128 tap filter that has the stop band set at
0.25Fs in a format that is easy to use to C,

octave:3>  pkg load signal
octave:4> bb = round(2^16 * fir1(127,0.25));
octave:5>  freqz(bb);
octave:6> dlmwrite ("file.csv",bb,",");

Now to your question about the currently stubbed API call 'set_bw_filter'.
This API call is a placeholder for programable analog filter bandwidth and
will ultimately hook upto existing methods like
'_calibrate_baseband_rx_analog_filter' to add programability to the analog
front end of AD9361. Currently the analog front end filters are configured
statically to bandwidths that match the configured master_clock_rate.

-Ian

On Jan 26, 2015, at 3:27 PM, Raj Bhattacharjea via USRP-users <
usrp-users@lists.ettus.com> wrote:

There was this thread from some time ago discussing setting the filter
bandwidth on the B210:

http://lists.ettus.com/pipermail/usrp-users_lists.ettus.com/2014-August/010459.html

It looks to me like the functionality to set the filter coefficients in
the AD9361 is there in the UHD code now, namely in the AD9361_device
driver, but the functionality hasn't been plumbed all the way up to the
public API.

Even so, can I use the ad9361_device_t::_program_fir_filter API directly
myself with my custom selection of coefficients (assuming I change the
method to "public" or use a friend function or class)? How can I get a
pointer to the underlying ad9361_device_t object from the higher level APIs?

And finally, since ad9361_device_t::_program_fir_filter exists, is
completing this functionality now just a matter of designing a database of
filter coefficients for some discrete set of bandwidths and/or implementing
a filter design routine and plumbing things through appropriately?

--
Raj Bhattacharjea
Georgia Institute of Technology
School of Electrical and Computer Engineering
http://www.prism.gatech.edu/~gtg037s/
404.894.7516


USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

--
Raj Bhattacharjea
Georgia Institute of Technology
School of Electrical and Computer Engineering
http://www.prism.gatech.edu/~gtg037s/
404.894.7516

I see that generating coefficients to meet a spec is possible in my filter design tool of choice (Matlab in my case); with the current API, I can only hardcode these coefficients into ad9361_filter_taps header and recompile a "custom" UHD, is that correct? Your last comment is new information to me. Perhaps I misunderstood the AD9361's capabilities. In has tunable analog filters? I assumed that it had a fixed analog filter, sampled at more than Nyquist of that filter bandwidth, filtered in digital to a bandwidth <56MSps, and then decimated down to a lower sample rate. Is this incorrect? If I set the sampling rate and the master clock rate to the same value (say 26 MHz), then the net effect will be a bandpass filter around my center frequency of approximately this bandwidth? On Mon, Jan 26, 2015 at 9:55 PM, Ian Buckley <ianb@ionconcepts.com> wrote: > Raj, > There is currently no roadmap feature to provide on-the-fly generation of > FIR coefficients to meet a run time spec. > The current driver code just selects from the pre-generated coeffs to > match the logical size of the FIR filter for a given configuration. > There is a bug fix that will hit the maint branch soon that provides FIR > coefficients for decimation by 4 modes of AD9361 also. > It is actually relatively easy to generate your own coefficients for > custom filters in Octave with the Signal package: > For example to generate a 128 tap filter that has the stop band set at > 0.25Fs in a format that is easy to use to C, > > octave:3> pkg load signal > octave:4> bb = round(2^16 * fir1(127,0.25)); > octave:5> freqz(bb); > octave:6> dlmwrite ("file.csv",bb,","); > > Now to your question about the currently stubbed API call 'set_bw_filter'. > This API call is a placeholder for programable analog filter bandwidth and > will ultimately hook upto existing methods like > '_calibrate_baseband_rx_analog_filter' to add programability to the analog > front end of AD9361. Currently the analog front end filters are configured > statically to bandwidths that match the configured master_clock_rate. > > -Ian > > > On Jan 26, 2015, at 3:27 PM, Raj Bhattacharjea via USRP-users < > usrp-users@lists.ettus.com> wrote: > > There was this thread from some time ago discussing setting the filter > bandwidth on the B210: > > > http://lists.ettus.com/pipermail/usrp-users_lists.ettus.com/2014-August/010459.html > > It looks to me like the functionality to set the filter coefficients in > the AD9361 is there in the UHD code now, namely in the AD9361_device > driver, but the functionality hasn't been plumbed all the way up to the > public API. > > Even so, can I use the ad9361_device_t::_program_fir_filter API directly > myself with my custom selection of coefficients (assuming I change the > method to "public" or use a friend function or class)? How can I get a > pointer to the underlying ad9361_device_t object from the higher level APIs? > > And finally, since ad9361_device_t::_program_fir_filter exists, is > completing this functionality now just a matter of designing a database of > filter coefficients for some discrete set of bandwidths and/or implementing > a filter design routine and plumbing things through appropriately? > > -- > Raj Bhattacharjea > Georgia Institute of Technology > School of Electrical and Computer Engineering > http://www.prism.gatech.edu/~gtg037s/ > 404.894.7516 > _______________________________________________ > USRP-users mailing list > USRP-users@lists.ettus.com > http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com > > > -- Raj Bhattacharjea Georgia Institute of Technology School of Electrical and Computer Engineering http://www.prism.gatech.edu/~gtg037s/ 404.894.7516
IB
Ian Buckley
Tue, Jan 27, 2015 7:59 PM

Raj,
Yes, there are tunable analog filters on both Rx and Tx. If you are interested in the details I suggest you take a look at this document, its a complex radio design:
https://ez.analog.com/servlet/JiveServlet/download/159446-28531/AD9361_Reference_Manual_UG-570.pdf
-Ian

On Jan 26, 2015, at 8:13 PM, Raj Bhattacharjea rbhattacharjea@gmail.com wrote:

I see that generating coefficients to meet a spec is possible in my filter design tool of choice (Matlab in my case); with the current API, I can only hardcode these coefficients into ad9361_filter_taps header and recompile a "custom" UHD, is that correct?

Your last comment is new information to me. Perhaps I misunderstood the AD9361's capabilities. In has tunable analog filters? I assumed that it had a fixed analog filter, sampled at more than Nyquist of that filter bandwidth, filtered in digital to a bandwidth <56MSps, and then decimated down to a lower sample rate. Is this incorrect?

If I set the sampling rate and the master clock rate to the same value (say 26 MHz), then the net effect will be a bandpass filter around my center frequency of approximately this bandwidth?

On Mon, Jan 26, 2015 at 9:55 PM, Ian Buckley ianb@ionconcepts.com wrote:
Raj,
There is currently no roadmap feature to provide on-the-fly generation of FIR coefficients to meet a run time spec.
The current driver code just selects from the pre-generated coeffs to match the logical size of the FIR filter for a given configuration.
There is a bug fix that will hit the maint branch soon that provides FIR coefficients for decimation by 4 modes of AD9361 also.
It is actually relatively easy to generate your own coefficients for custom filters in Octave with the Signal package:
For example to generate a 128 tap filter that has the stop band set at 0.25Fs in a format that is easy to use to C,

octave:3>  pkg load signal
octave:4> bb = round(2^16 * fir1(127,0.25));
octave:5>  freqz(bb);
octave:6> dlmwrite ("file.csv",bb,",");

Now to your question about the currently stubbed API call 'set_bw_filter'. This API call is a placeholder for programable analog filter bandwidth and will ultimately hook upto existing methods like '_calibrate_baseband_rx_analog_filter' to add programability to the analog front end of AD9361. Currently the analog front end filters are configured statically to bandwidths that match the configured master_clock_rate.

-Ian

On Jan 26, 2015, at 3:27 PM, Raj Bhattacharjea via USRP-users usrp-users@lists.ettus.com wrote:

There was this thread from some time ago discussing setting the filter bandwidth on the B210:

http://lists.ettus.com/pipermail/usrp-users_lists.ettus.com/2014-August/010459.html

It looks to me like the functionality to set the filter coefficients in the AD9361 is there in the UHD code now, namely in the AD9361_device driver, but the functionality hasn't been plumbed all the way up to the public API.

Even so, can I use the ad9361_device_t::_program_fir_filter API directly myself with my custom selection of coefficients (assuming I change the method to "public" or use a friend function or class)? How can I get a pointer to the underlying ad9361_device_t object from the higher level APIs?

And finally, since ad9361_device_t::_program_fir_filter exists, is completing this functionality now just a matter of designing a database of filter coefficients for some discrete set of bandwidths and/or implementing a filter design routine and plumbing things through appropriately?

--
Raj Bhattacharjea
Georgia Institute of Technology
School of Electrical and Computer Engineering
http://www.prism.gatech.edu/~gtg037s/
404.894.7516


USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

--
Raj Bhattacharjea
Georgia Institute of Technology
School of Electrical and Computer Engineering
http://www.prism.gatech.edu/~gtg037s/
404.894.7516

Raj, Yes, there are tunable analog filters on both Rx and Tx. If you are interested in the details I suggest you take a look at this document, its a complex radio design: https://ez.analog.com/servlet/JiveServlet/download/159446-28531/AD9361_Reference_Manual_UG-570.pdf -Ian On Jan 26, 2015, at 8:13 PM, Raj Bhattacharjea <rbhattacharjea@gmail.com> wrote: > I see that generating coefficients to meet a spec is possible in my filter design tool of choice (Matlab in my case); with the current API, I can only hardcode these coefficients into ad9361_filter_taps header and recompile a "custom" UHD, is that correct? > > Your last comment is new information to me. Perhaps I misunderstood the AD9361's capabilities. In has tunable analog filters? I assumed that it had a fixed analog filter, sampled at more than Nyquist of that filter bandwidth, filtered in digital to a bandwidth <56MSps, and then decimated down to a lower sample rate. Is this incorrect? > > If I set the sampling rate and the master clock rate to the same value (say 26 MHz), then the net effect will be a bandpass filter around my center frequency of approximately this bandwidth? > > On Mon, Jan 26, 2015 at 9:55 PM, Ian Buckley <ianb@ionconcepts.com> wrote: > Raj, > There is currently no roadmap feature to provide on-the-fly generation of FIR coefficients to meet a run time spec. > The current driver code just selects from the pre-generated coeffs to match the logical size of the FIR filter for a given configuration. > There is a bug fix that will hit the maint branch soon that provides FIR coefficients for decimation by 4 modes of AD9361 also. > It is actually relatively easy to generate your own coefficients for custom filters in Octave with the Signal package: > For example to generate a 128 tap filter that has the stop band set at 0.25Fs in a format that is easy to use to C, > > octave:3> pkg load signal > octave:4> bb = round(2^16 * fir1(127,0.25)); > octave:5> freqz(bb); > octave:6> dlmwrite ("file.csv",bb,","); > > Now to your question about the currently stubbed API call 'set_bw_filter'. This API call is a placeholder for programable analog filter bandwidth and will ultimately hook upto existing methods like '_calibrate_baseband_rx_analog_filter' to add programability to the analog front end of AD9361. Currently the analog front end filters are configured statically to bandwidths that match the configured master_clock_rate. > > -Ian > > > On Jan 26, 2015, at 3:27 PM, Raj Bhattacharjea via USRP-users <usrp-users@lists.ettus.com> wrote: > >> There was this thread from some time ago discussing setting the filter bandwidth on the B210: >> >> http://lists.ettus.com/pipermail/usrp-users_lists.ettus.com/2014-August/010459.html >> >> It looks to me like the functionality to set the filter coefficients in the AD9361 is there in the UHD code now, namely in the AD9361_device driver, but the functionality hasn't been plumbed all the way up to the public API. >> >> Even so, can I use the ad9361_device_t::_program_fir_filter API directly myself with my custom selection of coefficients (assuming I change the method to "public" or use a friend function or class)? How can I get a pointer to the underlying ad9361_device_t object from the higher level APIs? >> >> And finally, since ad9361_device_t::_program_fir_filter exists, is completing this functionality now just a matter of designing a database of filter coefficients for some discrete set of bandwidths and/or implementing a filter design routine and plumbing things through appropriately? >> >> -- >> Raj Bhattacharjea >> Georgia Institute of Technology >> School of Electrical and Computer Engineering >> http://www.prism.gatech.edu/~gtg037s/ >> 404.894.7516 >> _______________________________________________ >> USRP-users mailing list >> USRP-users@lists.ettus.com >> http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com > > > > > -- > Raj Bhattacharjea > Georgia Institute of Technology > School of Electrical and Computer Engineering > http://www.prism.gatech.edu/~gtg037s/ > 404.894.7516