summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohnathan Corgan <jcorgan@corganenterprises.com>2009-10-12 18:46:56 -0700
committerJohnathan Corgan <jcorgan@corganenterprises.com>2009-10-12 18:46:56 -0700
commit4df83569c130c1f4fe2aba3e1b5dd1419272f22f (patch)
treef64ccf30880228ab639ff06c971603e214b6303f
parent83ddffdaa968c5131228346b5f3f2ca123b759c7 (diff)
parent3eeb2720664ec7cb67e60d4f8a01b933ddba0143 (diff)
Merge branch 'sync' of git@gnuradio.org:trondeau into master
This merge adds polyphase clock recovery, implements new PAM demodulators that use it, and also moves GRC examples to gnuradio-examples component. See merge commit diff for updated files post merge. * 'sync' of git@gnuradio.org:trondeau: (54 commits) Reverting dqpsk to be mpsk_receiver based and not change its behavior. Fixing initialization of timing gains. Alpha should be < 1, and beta should be << 1. This splits the rate into a fractional an integer value, which allows the loop to adjust the fractional rate while the integer rate keeps the increments moving properly. Allows the max rate deviation to be independent of the integer rate. Scaling of the differential taps also allows alpha and beta to operate independent of the rate when fractional samples per symbol are used. Slightly more tolerant to large signal values, but they still should be close to +/-1. Fixing compiler warnings. Adding dqpsk2 block to makefile for installation. Adding DQPSK version that uses the PFB timing sync block (dqpsk2). Minor fixes for logging. Fixing import of UI file. Temporary working dbpsk2 example until we match everything. Working DBPSK implementation with new PFB clock recovery block. The feedforward AGC wasn't playing nicely, the frequency aquistion range was increased to swing half the sample rate in either direction, and the number of filter phases to use was increased to 32. A bit of code cleanup. Starting to rework QT app to control new PFB clock recovery alg. Making old dbpsk work again to compare against new version. Adding new DBPSK block with new PFB clock recovery alg. Revert "More additions to PAM timing simulation." More additions to PAM timing simulation. Using 2-PAM by default. Cleaning up GRC PAM timing example and adding ability to do M-ary PAM. Cleaning up constructor. Moving filter number decision to start work function. ...
-rw-r--r--config/grc_gnuradio_examples.m45
-rw-r--r--config/grc_grc.m41
-rwxr-xr-xdebian/bin/gen-install-files.sh11
-rw-r--r--debian/control20
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc163
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h50
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i13
-rw-r--r--gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc2
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am2
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py20
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py351
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py8
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py353
-rw-r--r--gnuradio-examples/Makefile.am4
-rw-r--r--gnuradio-examples/grc/.gitignore (renamed from grc/examples/.gitignore)0
-rw-r--r--gnuradio-examples/grc/Makefile.am (renamed from grc/examples/Makefile.am)5
-rw-r--r--gnuradio-examples/grc/audio/cvsd_sweep.grc (renamed from grc/examples/audio/cvsd_sweep.grc)0
-rw-r--r--gnuradio-examples/grc/audio/dial_tone.grc (renamed from grc/examples/audio/dial_tone.grc)0
-rw-r--r--gnuradio-examples/grc/demod/mpsk_demod.grc586
-rw-r--r--gnuradio-examples/grc/demod/pam_timing.grc1424
-rw-r--r--gnuradio-examples/grc/simple/ber_simulation.grc (renamed from grc/examples/simple/ber_simulation.grc)0
-rw-r--r--gnuradio-examples/grc/simple/dpsk_loopback.grc (renamed from grc/examples/simple/dpsk_loopback.grc)0
-rw-r--r--gnuradio-examples/grc/simple/var_sink_taps.grc (renamed from grc/examples/simple/var_sink_taps.grc)0
-rw-r--r--gnuradio-examples/grc/simple/variable_config.grc (renamed from grc/examples/simple/variable_config.grc)0
-rw-r--r--gnuradio-examples/grc/trellis/interference_cancellation.grc (renamed from grc/examples/trellis/interference_cancellation.grc)0
-rw-r--r--gnuradio-examples/grc/trellis/readme.txt (renamed from grc/examples/trellis/readme.txt)0
-rw-r--r--gnuradio-examples/grc/usrp/usrp2_const_wave.grc (renamed from grc/examples/usrp/usrp2_const_wave.grc)0
-rw-r--r--gnuradio-examples/grc/usrp/usrp2_dpsk_mod.grc (renamed from grc/examples/usrp/usrp2_dpsk_mod.grc)0
-rw-r--r--gnuradio-examples/grc/usrp/usrp2_fft.grc (renamed from grc/examples/usrp/usrp2_fft.grc)0
-rw-r--r--gnuradio-examples/grc/usrp/usrp_two_tone_loopback.grc (renamed from grc/examples/usrp/usrp_two_tone_loopback.grc)0
-rw-r--r--gnuradio-examples/grc/usrp/usrp_wbfm_receive.grc (renamed from grc/examples/usrp/usrp_wbfm_receive.grc)0
-rw-r--r--gnuradio-examples/grc/xmlrpc/readme.txt (renamed from grc/examples/xmlrpc/readme.txt)0
-rw-r--r--gnuradio-examples/grc/xmlrpc/xmlrpc_client.grc (renamed from grc/examples/xmlrpc/xmlrpc_client.grc)0
-rw-r--r--gnuradio-examples/grc/xmlrpc/xmlrpc_client_script.py (renamed from grc/examples/xmlrpc/xmlrpc_client_script.py)0
-rw-r--r--gnuradio-examples/grc/xmlrpc/xmlrpc_server.grc (renamed from grc/examples/xmlrpc/xmlrpc_server.grc)0
-rwxr-xr-xgnuradio-examples/python/digital/benchmark_qt_loopback.py39
-rwxr-xr-xgnuradio-examples/python/digital/benchmark_qt_loopback2.py488
-rw-r--r--gnuradio-examples/python/digital/qt_digital_window.py264
-rw-r--r--gnuradio-examples/python/digital/qt_digital_window.ui589
-rw-r--r--gnuradio-examples/python/digital/qt_digital_window2.py261
-rw-r--r--gnuradio-examples/python/digital/qt_digital_window2.ui637
-rw-r--r--gr-qtgui/src/lib/spectrumdisplayform.ui557
-rw-r--r--gr-utils/src/python/pyqt_plot.py238
-rw-r--r--gr-utils/src/python/pyqt_plot.ui737
-rw-r--r--grc/Makefile.am1
-rw-r--r--grc/blocks/Makefile.am1
-rw-r--r--grc/blocks/block_tree.xml5
-rw-r--r--grc/blocks/gr_pfb_clock_sync.xml75
-rw-r--r--grc/examples/audio/.gitignore2
-rw-r--r--grc/examples/simple/.gitignore2
-rw-r--r--grc/examples/trellis/.gitignore2
-rw-r--r--grc/examples/usrp/.gitignore2
-rw-r--r--grc/examples/xmlrpc/.gitignore2
53 files changed, 5491 insertions, 1429 deletions
diff --git a/config/grc_gnuradio_examples.m4 b/config/grc_gnuradio_examples.m4
index 3225f3ab51..4d6116c70f 100644
--- a/config/grc_gnuradio_examples.m4
+++ b/config/grc_gnuradio_examples.m4
@@ -1,4 +1,4 @@
-dnl Copyright 2001,2002,2003,2004,2005,2006,2008 Free Software Foundation, Inc.
+dnl Copyright 2001,2002,2003,2004,2005,2006,2008,2009 Free Software Foundation, Inc.
dnl
dnl This file is part of GNU Radio
dnl
@@ -27,13 +27,14 @@ AC_DEFUN([GRC_GNURADIO_EXAMPLES],[
gnuradio-examples/Makefile \
gnuradio-examples/c++/Makefile \
gnuradio-examples/python/Makefile \
+ gnuradio-examples/grc/Makefile \
gnuradio-examples/python/apps/hf_explorer/Makefile \
gnuradio-examples/python/apps/hf_radio/Makefile \
gnuradio-examples/python/apps/Makefile \
gnuradio-examples/python/audio/Makefile \
gnuradio-examples/python/digital/Makefile \
gnuradio-examples/python/digital_voice/Makefile \
- gnuradio-examples/python/digital-bert/Makefile \
+ gnuradio-examples/python/digital-bert/Makefile \
gnuradio-examples/python/mp-sched/Makefile \
gnuradio-examples/python/multi-antenna/Makefile \
gnuradio-examples/python/multi_usrp/Makefile \
diff --git a/config/grc_grc.m4 b/config/grc_grc.m4
index 7ee009faee..16720b8fed 100644
--- a/config/grc_grc.m4
+++ b/config/grc_grc.m4
@@ -50,7 +50,6 @@ AC_DEFUN([GRC_GRC],[
grc/Makefile \
grc/base/Makefile \
grc/blocks/Makefile \
- grc/examples/Makefile \
grc/freedesktop/Makefile \
grc/grc_gnuradio/Makefile \
grc/gui/Makefile \
diff --git a/debian/bin/gen-install-files.sh b/debian/bin/gen-install-files.sh
index 5e900095a9..45296bff68 100755
--- a/debian/bin/gen-install-files.sh
+++ b/debian/bin/gen-install-files.sh
@@ -433,6 +433,12 @@ $EXTRACT gnuradio-examples/python/pfb/Makefile dist_ourdata_DATA >>$NAME
$EXTRACT gnuradio-examples/python/usrp/Makefile dist_ourdata_SCRIPTS >>$NAME
$EXTRACT gnuradio-examples/python/usrp2/Makefile dist_ourdata_SCRIPTS >>$NAME
$EXTRACT gnuradio-examples/python/usrp2/Makefile dist_ourdata_DATA >>$NAME
+$EXTRACT gnuradio-examples/grc/Makefile dist_audiodata_DATA >>$NAME
+$EXTRACT gnuradio-examples/grc/Makefile dist_demoddata_DATA >>$NAME
+$EXTRACT gnuradio-examples/grc/Makefile dist_simpledata_DATA >>$NAME
+$EXTRACT gnuradio-examples/grc/Makefile dist_trellisdata_DATA >>$NAME
+$EXTRACT gnuradio-examples/grc/Makefile dist_usrpdata_DATA >>$NAME
+$EXTRACT gnuradio-examples/grc/Makefile dist_xmlrpcdata_DATA >>$NAME
# gnuradio-pager
NAME=debian/gnuradio-pager.install
@@ -492,11 +498,6 @@ $EXTRACT grc/Makefile dist_etc_DATA >>$NAME
$EXTRACT grc/base/Makefile ourpython_PYTHON >>$NAME
$EXTRACT grc/base/Makefile dist_ourdata_DATA >>$NAME
$EXTRACT grc/blocks/Makefile dist_ourdata_DATA >>$NAME
-$EXTRACT grc/examples/Makefile dist_audiodata_DATA >>$NAME
-$EXTRACT grc/examples/Makefile dist_simpledata_DATA >>$NAME
-$EXTRACT grc/examples/Makefile dist_trellisdata_DATA >>$NAME
-$EXTRACT grc/examples/Makefile dist_usrpdata_DATA >>$NAME
-$EXTRACT grc/examples/Makefile dist_xmlrpcdata_DATA >>$NAME
$EXTRACT grc/freedesktop/Makefile dist_ourdata_DATA >>$NAME
$EXTRACT grc/freedesktop/Makefile dist_bin_SCRIPTS >>$NAME
$EXTRACT grc/grc_gnuradio/Makefile root_python_PYTHON >>$NAME
diff --git a/debian/control b/debian/control
index a7b33f0be2..0760ddaec6 100644
--- a/debian/control
+++ b/debian/control
@@ -551,16 +551,6 @@ XB-Python-Version: ${python:Versions}
Description: GNU Radio Utilities
This package provides commonly used utilities for GNU Radio
-Package: gnuradio-examples
-Architecture: any
-Depends: ${python:Depends}, python-gnuradio-core
-Provides: ${python:Provides}
-Recommends: python-gnuradio-wxgui, python-gnuradio
-Section: comm
-XB-Python-Version: ${python:Versions}
-Description: GNU Radio Example Programs
- This package provides examples of GNU Radio usage using Python.
-
Package: gnuradio-pager
Architecture: any
Depends: ${python:Depends}, ${shlibs:Depends}, python-gnuradio-usrp
@@ -621,6 +611,16 @@ XB-Python-Version: ${python:Versions}
Description: The GNU Radio Companion
GRC is a graphical flowgraph editor for the GNU Software Radio
+Package: gnuradio-examples
+Architecture: any
+Depends: ${python:Depends}, python-gnuradio-core, gnuradio-companion
+Provides: ${python:Provides}
+Recommends: python-gnuradio-wxgui, python-gnuradio
+Section: comm
+XB-Python-Version: ${python:Versions}
+Description: GNU Radio Example Programs
+ This package provides examples of GNU Radio usage using Python.
+
################################################################################
# Documentation packages #
################################################################################
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 91cbf74c6b..433b7d6133 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -33,45 +33,51 @@
#include <gr_io_signature.h>
#include <gr_math.h>
-gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
+gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (double sps, float gain,
const std::vector<float> &taps,
unsigned int filter_size,
- float init_phase)
+ float init_phase,
+ float max_rate_deviation)
{
return gr_pfb_clock_sync_ccf_sptr (new gr_pfb_clock_sync_ccf (sps, gain, taps,
filter_size,
- init_phase));
+ init_phase,
+ max_rate_deviation));
}
-
-gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
+int ios[] = {sizeof(gr_complex), sizeof(float), sizeof(float), sizeof(float)};
+std::vector<int> iosig(ios, ios+sizeof(ios)/sizeof(int));
+gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (double sps, float gain,
const std::vector<float> &taps,
unsigned int filter_size,
- float init_phase)
+ float init_phase,
+ float max_rate_deviation)
: gr_block ("pfb_clock_sync_ccf",
gr_make_io_signature (1, 1, sizeof(gr_complex)),
- gr_make_io_signature2 (2, 2, sizeof(gr_complex), sizeof(float))),
- d_updated (false), d_sps(sps), d_alpha(gain)
+ gr_make_io_signaturev (1, 4, iosig)),
+ d_updated (false), d_nfilters(filter_size),
+ d_max_dev(max_rate_deviation)
{
d_nfilters = filter_size;
+ d_sps = floor(sps);
// Store the last filter between calls to work
// The accumulator keeps track of overflow to increment the stride correctly.
// set it here to the fractional difference based on the initial phaes
- // assert(init_phase <= 2*M_PI);
- float x = init_phase / (2*M_PI); //normalize initial phase
- d_acc = x*(d_nfilters-1);
- d_last_filter = (int)floor(d_acc);
- d_acc = fmodf(d_acc, 1);
- d_start_count = 0;
-
+ set_alpha(gain);
+ set_beta(0.25*gain*gain);
+ d_k = init_phase;
+ d_rate = (sps-floor(sps))*(double)d_nfilters;
+ d_rate_i = (int)floor(d_rate);
+ d_rate_f = d_rate - (float)d_rate_i;
+ d_filtnum = (int)floor(d_k);
d_filters = std::vector<gr_fir_ccf*>(d_nfilters);
d_diff_filters = std::vector<gr_fir_ccf*>(d_nfilters);
// Create an FIR filter for each channel and zero out the taps
std::vector<float> vtaps(0, d_nfilters);
- for(unsigned int i = 0; i < d_nfilters; i++) {
+ for(int i = 0; i < d_nfilters; i++) {
d_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps);
d_diff_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps);
}
@@ -85,7 +91,7 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
gr_pfb_clock_sync_ccf::~gr_pfb_clock_sync_ccf ()
{
- for(unsigned int i = 0; i < d_nfilters; i++) {
+ for(int i = 0; i < d_nfilters; i++) {
delete d_filters[i];
}
}
@@ -95,7 +101,7 @@ gr_pfb_clock_sync_ccf::set_taps (const std::vector<float> &newtaps,
std::vector< std::vector<float> > &ourtaps,
std::vector<gr_fir_ccf*> &ourfilter)
{
- unsigned int i,j;
+ int i,j;
unsigned int ntaps = newtaps.size();
d_taps_per_filter = (unsigned int)ceil((double)ntaps/(double)d_nfilters);
@@ -114,13 +120,13 @@ gr_pfb_clock_sync_ccf::set_taps (const std::vector<float> &newtaps,
// Partition the filter
for(i = 0; i < d_nfilters; i++) {
// Each channel uses all d_taps_per_filter with 0's if not enough taps to fill out
- ourtaps[i] = std::vector<float>(d_taps_per_filter, 0);
+ ourtaps[d_nfilters-1-i] = std::vector<float>(d_taps_per_filter, 0);
for(j = 0; j < d_taps_per_filter; j++) {
- ourtaps[i][j] = tmp_taps[i + j*d_nfilters]; // add taps to channels in reverse order
+ ourtaps[d_nfilters - 1 - i][j] = tmp_taps[i + j*d_nfilters];
}
// Build a filter for each channel and add it's taps to it
- ourfilter[i]->set_taps(ourtaps[i]);
+ ourfilter[i]->set_taps(ourtaps[d_nfilters-1-i]);
}
// Set the history to ensure enough input items for each filter
@@ -133,38 +139,53 @@ void
gr_pfb_clock_sync_ccf::create_diff_taps(const std::vector<float> &newtaps,
std::vector<float> &difftaps)
{
+ float maxtap = 1e-20;
difftaps.clear();
difftaps.push_back(0); //newtaps[0]);
for(unsigned int i = 1; i < newtaps.size()-1; i++) {
- difftaps.push_back(newtaps[i+1] - newtaps[i-1]);
+ float tap = newtaps[i+1] - newtaps[i-1];
+ difftaps.push_back(tap);
+ if(tap > maxtap) {
+ maxtap = tap;
+ }
}
difftaps.push_back(0);//-newtaps[newtaps.size()-1]);
+
+ // Scale the differential taps; helps scale error term to better update state
+ // FIXME: should this be scaled this way or use the same gain as the taps?
+ for(unsigned int i = 0; i < difftaps.size(); i++) {
+ difftaps[i] /= maxtap;
+ }
}
void
gr_pfb_clock_sync_ccf::print_taps()
{
- unsigned int i, j;
+ int i, j;
+ printf("[ ");
for(i = 0; i < d_nfilters; i++) {
- printf("filter[%d]: [%.4e, ", i, d_taps[i][0]);
+ printf("[%.4e, ", d_taps[i][0]);
for(j = 1; j < d_taps_per_filter-1; j++) {
printf("%.4e,", d_taps[i][j]);
}
- printf("%.4e]\n", d_taps[i][j]);
+ printf("%.4e],", d_taps[i][j]);
}
+ printf(" ]\n");
}
void
gr_pfb_clock_sync_ccf::print_diff_taps()
{
- unsigned int i, j;
+ int i, j;
+ printf("[ ");
for(i = 0; i < d_nfilters; i++) {
- printf("filter[%d]: [%.4e, ", i, d_dtaps[i][0]);
+ printf("[%.4e, ", d_dtaps[i][0]);
for(j = 1; j < d_taps_per_filter-1; j++) {
printf("%.4e,", d_dtaps[i][j]);
}
- printf("%.4e]\n", d_dtaps[i][j]);
+ printf("%.4e],", d_dtaps[i][j]);
}
+ printf(" ]\n");
}
@@ -172,8 +193,7 @@ std::vector<float>
gr_pfb_clock_sync_ccf::channel_taps(int channel)
{
std::vector<float> taps;
- unsigned int i;
- for(i = 0; i < d_taps_per_filter; i++) {
+ for(int i = 0; i < d_taps_per_filter; i++) {
taps.push_back(d_taps[channel][i]);
}
return taps;
@@ -183,8 +203,7 @@ std::vector<float>
gr_pfb_clock_sync_ccf::diff_channel_taps(int channel)
{
std::vector<float> taps;
- unsigned int i;
- for(i = 0; i < d_taps_per_filter; i++) {
+ for(int i = 0; i < d_taps_per_filter; i++) {
taps.push_back(d_dtaps[channel][i]);
}
return taps;
@@ -199,7 +218,13 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
{
gr_complex *in = (gr_complex *) input_items[0];
gr_complex *out = (gr_complex *) output_items[0];
- float *err = (float *) output_items[1];
+
+ float *err, *outrate, *outk;
+ if(output_items.size() > 2) {
+ err = (float *) output_items[1];
+ outrate = (float*)output_items[2];
+ outk = (float*)output_items[3];
+ }
if (d_updated) {
d_updated = false;
@@ -209,50 +234,50 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
// We need this many to process one output
int nrequired = ninput_items[0] - d_taps_per_filter;
- int i = 0, count = d_start_count;
- float error = 0;
+ int i = 0, count = 0;
+ float error, error_r, error_i;
// produce output as long as we can and there are enough input samples
while((i < noutput_items) && (count < nrequired)) {
- out[i] = d_filters[d_last_filter]->filter(&in[count]);
- error = (out[i] * d_diff_filters[d_last_filter]->filter(&in[count])).real();
- err[i] = error;
-
- d_acc += d_alpha*error;
- gr_branchless_clip(d_acc, 1);
-
- int newfilter;
- newfilter = (int)((float)d_last_filter + d_acc);
- if(newfilter != (int)d_last_filter)
- d_acc = 0.5;
-
- if(newfilter >= (int)d_nfilters) {
- d_last_filter = newfilter - d_nfilters;
- count++;
+ d_filtnum = (int)floor(d_k);
+
+ // Keep the current filter number in [0, d_nfilters]
+ // If we've run beyond the last filter, wrap around and go to next sample
+ // If we've go below 0, wrap around and go to previous sample
+ while(d_filtnum >= d_nfilters) {
+ d_k -= d_nfilters;
+ d_filtnum -= d_nfilters;
+ count += 1;
}
- else if(newfilter < 0) {
- d_last_filter = d_nfilters + newfilter;
- count--;
- }
- else {
- d_last_filter = newfilter;
+ while(d_filtnum < 0) {
+ d_k += d_nfilters;
+ d_filtnum += d_nfilters;
+ count -= 1;
}
+ out[i] = d_filters[d_filtnum]->filter(&in[count]);
+ gr_complex diff = d_diff_filters[d_filtnum]->filter(&in[count]);
+ error_r = out[i].real() * diff.real();
+ error_i = out[i].imag() * diff.imag();
+ error = (error_i + error_r) / 2.0; // average error from I&Q channel
+
+ // Run the control loop to update the current phase (k) and tracking rate
+ d_k = d_k + d_alpha*error + d_rate_i + d_rate_f;
+ d_rate_f = d_rate_f + d_beta*error;
+
+ // Keep our rate within a good range
+ d_rate_f = gr_branchless_clip(d_rate_f, d_max_dev);
+
i++;
- count += d_sps;
- }
+ count += (int)floor(d_sps);
- // Set the start index at the next entrance to the work function
- // if we stop because we run out of input items, jump ahead in the
- // next call to work. Otherwise, we can start at zero.
- if(count > nrequired) {
- d_start_count = count - (nrequired);
- consume_each(ninput_items[0]-d_taps_per_filter);
- }
- else {
- d_start_count = 0;
- consume_each(count);
+ if(output_items.size() > 2) {
+ err[i] = error;
+ outrate[i] = d_rate_f;
+ outk[i] = d_k;
+ }
}
-
+ consume_each(count);
+
return i;
}
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
index 1a04e55c75..a07192a7f3 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
@@ -28,10 +28,11 @@
class gr_pfb_clock_sync_ccf;
typedef boost::shared_ptr<gr_pfb_clock_sync_ccf> gr_pfb_clock_sync_ccf_sptr;
-gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
- const std::vector<float> &taps,
- unsigned int filter_size=32,
- float init_phase=0);
+gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (double sps, float gain,
+ const std::vector<float> &taps,
+ unsigned int filter_size=32,
+ float init_phase=0,
+ float max_rate_deviation=1.5);
class gr_fir_ccf;
@@ -50,31 +51,38 @@ class gr_pfb_clock_sync_ccf : public gr_block
/*!
* Build the polyphase filterbank timing synchronizer.
*/
- friend gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
+ friend gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (double sps, float gain,
const std::vector<float> &taps,
unsigned int filter_size,
- float init_phase);
+ float init_phase,
+ float max_rate_deviation);
bool d_updated;
- unsigned int d_sps;
+ double d_sps;
+ double d_sample_num;
float d_alpha;
- unsigned int d_nfilters;
+ float d_beta;
+ int d_nfilters;
std::vector<gr_fir_ccf*> d_filters;
std::vector<gr_fir_ccf*> d_diff_filters;
std::vector< std::vector<float> > d_taps;
std::vector< std::vector<float> > d_dtaps;
- float d_acc;
- unsigned int d_last_filter;
- unsigned int d_start_count;
- unsigned int d_taps_per_filter;
+ float d_k;
+ float d_rate;
+ float d_rate_i;
+ float d_rate_f;
+ float d_max_dev;
+ int d_filtnum;
+ int d_taps_per_filter;
/*!
* Build the polyphase filterbank timing synchronizer.
*/
- gr_pfb_clock_sync_ccf (float sps, float gain,
+ gr_pfb_clock_sync_ccf (double sps, float gain,
const std::vector<float> &taps,
unsigned int filter_size,
- float init_phase);
+ float init_phase,
+ float max_rate_deviation);
void create_diff_taps(const std::vector<float> &newtaps,
std::vector<float> &difftaps);
@@ -96,6 +104,20 @@ public:
*/
void print_taps();
void print_diff_taps();
+
+ void set_alpha(float alpha)
+ {
+ d_alpha = alpha;
+ }
+ void set_beta(float beta)
+ {
+ d_beta = beta;
+ }
+
+ void set_max_rate_deviation(float m)
+ {
+ d_max_dev = m;
+ }
int general_work (int noutput_items,
gr_vector_int &ninput_items,
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
index 729d4a1aa9..1979842871 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
@@ -22,18 +22,20 @@
GR_SWIG_BLOCK_MAGIC(gr,pfb_clock_sync_ccf);
-gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
+gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (double sps, float gain,
const std::vector<float> &taps,
unsigned int filter_size=32,
- float init_phase=0);
+ float init_phase=0,
+ float max_rate_deviation=1.5);
class gr_pfb_clock_sync_ccf : public gr_block
{
private:
- gr_pfb_clock_sync_ccf (float sps, float gain,
+ gr_pfb_clock_sync_ccf (double sps, float gain,
const std::vector<float> &taps,
unsigned int filter_size,
- float init_phase);
+ float init_phase,
+ float max_rate_deviation);
public:
~gr_pfb_clock_sync_ccf ();
@@ -46,4 +48,7 @@ class gr_pfb_clock_sync_ccf : public gr_block
std::vector<float> diff_channel_taps(int channel);
void print_taps();
void print_diff_taps();
+ void set_alpha(float alpha);
+ void set_beta(float beta);
+ void set_max_rate_deviation(float m);
};
diff --git a/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc b/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
index 49bbb8d360..1efa827035 100644
--- a/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
+++ b/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
@@ -265,8 +265,6 @@ gr_mpsk_receiver_cc::phase_error_tracking(gr_complex sample)
// Make phase and frequency corrections based on sampled value
phase_error = (*this.*d_phase_error_detector)(sample);
-
- phase_error = gr_branchless_clip(phase_error, 1.0);
d_freq += d_beta*phase_error; // adjust frequency based on error
d_phase += d_freq + d_alpha*phase_error; // adjust phase based on error
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am b/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
index f0825b1513..68d6836236 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
@@ -31,7 +31,9 @@ grblkspython_PYTHON = \
am_demod.py \
channel_model.py \
dbpsk.py \
+ dbpsk2.py \
dqpsk.py \
+ dqpsk2.py \
d8psk.py \
filterbank.py \
fm_demod.py \
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py
index 3147bfa2ab..860015c3f0 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py
@@ -1,5 +1,5 @@
#
-# Copyright 2005,2006,2007 Free Software Foundation, Inc.
+# Copyright 2005,2006,2007,2009 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -251,20 +251,20 @@ class dbpsk_demod(gr.hier_block2):
# symbol clock recovery
if not self._mm_gain_mu:
self._mm_gain_mu = 0.1
-
+
self._mm_omega = self._samples_per_symbol
self._mm_gain_omega = .25 * self._mm_gain_mu * self._mm_gain_mu
self._costas_beta = 0.25 * self._costas_alpha * self._costas_alpha
- fmin = -0.1
- fmax = 0.1
+ fmin = -0.25
+ fmax = 0.25
self.receiver=gr.mpsk_receiver_cc(arity, 0,
- self._costas_alpha, self._costas_beta,
- fmin, fmax,
- self._mm_mu, self._mm_gain_mu,
- self._mm_omega, self._mm_gain_omega,
- self._mm_omega_relative_limit)
-
+ self._costas_alpha, self._costas_beta,
+ fmin, fmax,
+ self._mm_mu, self._mm_gain_mu,
+ self._mm_omega, self._mm_gain_omega,
+ self._mm_omega_relative_limit)
+
# Do differential decoding based on phase change of symbols
self.diffdec = gr.diff_phasor_cc()
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
new file mode 100644
index 0000000000..4541b453b3
--- /dev/null
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
@@ -0,0 +1,351 @@
+#
+# Copyright 2005,2006,2007 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+# See gnuradio-examples/python/digital for examples
+
+"""
+differential BPSK modulation and demodulation.
+"""
+
+from gnuradio import gr, gru, modulation_utils
+from math import pi, sqrt
+import psk
+import cmath
+from pprint import pprint
+
+# default values (used in __init__ and add_options)
+_def_samples_per_symbol = 2
+_def_excess_bw = 0.35
+_def_gray_code = True
+_def_verbose = False
+_def_log = False
+
+_def_costas_alpha = 0.1
+_def_timing_alpha = 0.100
+_def_timing_beta = 0.010
+_def_timing_max_dev = 1.5
+
+
+# /////////////////////////////////////////////////////////////////////////////
+# DBPSK modulator
+# /////////////////////////////////////////////////////////////////////////////
+
+class dbpsk2_mod(gr.hier_block2):
+
+ def __init__(self,
+ samples_per_symbol=_def_samples_per_symbol,
+ excess_bw=_def_excess_bw,
+ gray_code=_def_gray_code,
+ verbose=_def_verbose,
+ log=_def_log):
+ """
+ Hierarchical block for RRC-filtered differential BPSK modulation.
+
+ The input is a byte stream (unsigned char) and the
+ output is the complex modulated signal at baseband.
+
+ @param samples_per_symbol: samples per baud >= 2
+ @type samples_per_symbol: integer
+ @param excess_bw: Root-raised cosine filter excess bandwidth
+ @type excess_bw: float
+ @param gray_code: Tell modulator to Gray code the bits
+ @type gray_code: bool
+ @param verbose: Print information about modulator?
+ @type verbose: bool
+ @param log: Log modulation data to files?
+ @type log: bool
+ """
+
+ gr.hier_block2.__init__(self, "dbpsk_mod",
+ gr.io_signature(1, 1, gr.sizeof_char), # Input signature
+ gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature
+
+ self._samples_per_symbol = samples_per_symbol
+ self._excess_bw = excess_bw
+ self._gray_code = gray_code
+
+ if not isinstance(self._samples_per_symbol, int) or self._samples_per_symbol < 2:
+ raise TypeError, ("sbp must be an integer >= 2, is %d" % self._samples_per_symbol)
+
+ ntaps = 11 * self._samples_per_symbol
+
+ arity = pow(2,self.bits_per_symbol())
+
+ # turn bytes into k-bit vectors
+ self.bytes2chunks = \
+ gr.packed_to_unpacked_bb(self.bits_per_symbol(), gr.GR_MSB_FIRST)
+
+ if self._gray_code:
+ self.symbol_mapper = gr.map_bb(psk.binary_to_gray[arity])
+ else:
+ self.symbol_mapper = gr.map_bb(psk.binary_to_ungray[arity])
+
+ self.diffenc = gr.diff_encoder_bb(arity)
+
+ self.chunks2symbols = gr.chunks_to_symbols_bc(psk.constellation[arity])
+
+ # pulse shaping filter
+ self.rrc_taps = gr.firdes.root_raised_cosine(
+ self._samples_per_symbol, # gain (samples_per_symbol since we're
+ # interpolating by samples_per_symbol)
+ self._samples_per_symbol, # sampling rate
+ 1.0, # symbol rate
+ self._excess_bw, # excess bandwidth (roll-off factor)
+ ntaps)
+ self.rrc_filter = gr.interp_fir_filter_ccf(self._samples_per_symbol,
+ self.rrc_taps)
+
+ # Connect
+ self.connect(self, self.bytes2chunks, self.symbol_mapper, self.diffenc,
+ self.chunks2symbols, self.rrc_filter, self)
+
+ if verbose:
+ self._print_verbage()
+
+ if log:
+ self._setup_logging()
+
+
+ def samples_per_symbol(self):
+ return self._samples_per_symbol
+
+ def bits_per_symbol(self=None): # static method that's also callable on an instance
+ return 1
+ bits_per_symbol = staticmethod(bits_per_symbol) # make it a static method. RTFM
+
+ def add_options(parser):
+ """
+ Adds DBPSK modulation-specific options to the standard parser
+ """
+ parser.add_option("", "--excess-bw", type="float", default=_def_excess_bw,
+ help="set RRC excess bandwith factor [default=%default]")
+ parser.add_option("", "--no-gray-code", dest="gray_code",
+ action="store_false", default=True,
+ help="disable gray coding on modulated bits (PSK)")
+ add_options=staticmethod(add_options)
+
+ def extract_kwargs_from_options(options):
+ """
+ Given command line options, create dictionary suitable for passing to __init__
+ """
+ return modulation_utils.extract_kwargs_from_options(dbpsk2_mod.__init__,
+ ('self',), options)
+ extract_kwargs_from_options=staticmethod(extract_kwargs_from_options)
+
+
+ def _print_verbage(self):
+ print "\nModulator:"
+ print "bits per symbol: %d" % self.bits_per_symbol()
+ print "Gray code: %s" % self._gray_code
+ print "RRC roll-off factor: %.2f" % self._excess_bw
+
+ def _setup_logging(self):
+ print "Modulation logging turned on."
+ self.connect(self.bytes2chunks,
+ gr.file_sink(gr.sizeof_char, "tx_bytes2chunks.dat"))
+ self.connect(self.symbol_mapper,
+ gr.file_sink(gr.sizeof_char, "tx_graycoder.dat"))
+ self.connect(self.diffenc,
+ gr.file_sink(gr.sizeof_char, "tx_diffenc.dat"))
+ self.connect(self.chunks2symbols,
+ gr.file_sink(gr.sizeof_gr_complex, "tx_chunks2symbols.dat"))
+ self.connect(self.rrc_filter,
+ gr.file_sink(gr.sizeof_gr_complex, "tx_rrc_filter.dat"))
+
+
+# /////////////////////////////////////////////////////////////////////////////
+# DBPSK demodulator
+#
+# Differentially coherent detection of differentially encoded BPSK
+# /////////////////////////////////////////////////////////////////////////////
+
+class dbpsk2_demod(gr.hier_block2):
+
+ def __init__(self,
+ samples_per_symbol=_def_samples_per_symbol,
+ excess_bw=_def_excess_bw,
+ costas_alpha=_def_costas_alpha,
+ timing_alpha=_def_timing_alpha,
+ timing_max_dev=_def_timing_max_dev,
+ gray_code=_def_gray_code,
+ verbose=_def_verbose,
+ log=_def_log):
+ """
+ Hierarchical block for RRC-filtered differential BPSK demodulation
+
+ The input is the complex modulated signal at baseband.
+ The output is a stream of bits packed 1 bit per byte (LSB)
+
+ @param samples_per_symbol: samples per symbol >= 2
+ @type samples_per_symbol: float
+ @param excess_bw: Root-raised cosine filter excess bandwidth
+ @type excess_bw: float
+ @param costas_alpha: loop filter gain
+ @type costas_alpha: float
+ @param timing_alpha: timing loop alpha gain
+ @type timing_alpha: float
+ @param timing_max: timing loop maximum rate deviations
+ @type timing_max: float
+ @param gray_code: Tell modulator to Gray code the bits
+ @type gray_code: bool
+ @param verbose: Print information about modulator?
+ @type verbose: bool
+ @param debug: Print modualtion data to files?
+ @type debug: bool
+ """
+
+ gr.hier_block2.__init__(self, "dbpsk2_demod",
+ gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
+ gr.io_signature(1, 1, gr.sizeof_char)) # Output signature
+
+ self._samples_per_symbol = samples_per_symbol
+ self._excess_bw = excess_bw
+ self._costas_alpha = costas_alpha
+ self._timing_alpha = timing_alpha
+ self._timing_beta = _def_timing_beta
+ self._timing_max_dev=timing_max_dev
+ self._gray_code = gray_code
+
+ if samples_per_symbol < 2:
+ raise TypeError, "samples_per_symbol must be >= 2, is %r" % (samples_per_symbol,)
+
+ arity = pow(2,self.bits_per_symbol())
+
+ # Automatic gain control
+ self.agc = gr.agc2_cc(0.6e-1, 1e-3, 1, 1, 100)
+ #self.agc = gr.feedforward_agc_cc(16, 1.0)
+
+ self._costas_beta = 0.25 * self._costas_alpha * self._costas_alpha
+ # Allow a frequency swing of +/- half of the sample rate
+ fmin = -0.5
+ fmax = 0.5
+
+ self.clock_recov = gr.costas_loop_cc(self._costas_alpha,
+ self._costas_beta,
+ fmax, fmin, arity)
+
+ # symbol timing recovery with RRC data filter
+ nfilts = 32
+ ntaps = 11 * samples_per_symbol*nfilts
+ taps = gr.firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(self._samples_per_symbol), self._excess_bw, ntaps)
+ self.time_recov = gr.pfb_clock_sync_ccf(self._samples_per_symbol,
+ self._timing_alpha,
+ taps, nfilts, nfilts/2, self._timing_max_dev)
+ self.time_recov.set_beta(self._timing_beta)
+
+ # Do differential decoding based on phase change of symbols
+ self.diffdec = gr.diff_phasor_cc()
+
+ # find closest constellation point
+ rot = 1
+ rotated_const = map(lambda pt: pt * rot, psk.constellation[arity])
+ self.slicer = gr.constellation_decoder_cb(rotated_const, range(arity))
+
+ if self._gray_code:
+ self.symbol_mapper = gr.map_bb(psk.gray_to_binary[arity])
+ else:
+ self.symbol_mapper = gr.map_bb(psk.ungray_to_binary[arity])
+
+ # unpack the k bit vector into a stream of bits
+ self.unpack = gr.unpack_k_bits_bb(self.bits_per_symbol())
+
+ if verbose:
+ self._print_verbage()
+
+ if log:
+ self._setup_logging()
+
+ # Connect
+ self.connect(self, self.agc,
+ self.clock_recov,
+ self.time_recov,
+ self.diffdec, self.slicer, self.symbol_mapper, self.unpack, self)
+
+ def samples_per_symbol(self):
+ return self._samples_per_symbol
+
+ def bits_per_symbol(self=None): # staticmethod that's also callable on an instance
+ return 1
+ bits_per_symbol = staticmethod(bits_per_symbol) # make it a static method. RTFM
+
+ def _print_verbage(self):
+ print "\nDemodulator:"
+ print "bits per symbol: %d" % self.bits_per_symbol()
+ print "Gray code: %s" % self._gray_code
+ print "RRC roll-off factor: %.2f" % self._excess_bw
+ print "Costas Loop alpha: %.2f" % self._costas_alpha
+ print "Costas Loop beta: %.2f" % self._costas_beta
+ print "Timing alpha gain: %.2f" % self._timing_alpha
+ print "Timing beta gain: %.2f" % self._timing_beta
+ print "Timing max dev: %.2f" % self._timing_max_dev
+
+ def _setup_logging(self):
+ print "Modulation logging turned on."
+ self.connect(self.pre_scaler,
+ gr.file_sink(gr.sizeof_gr_complex, "rx_prescaler.dat"))
+ self.connect(self.agc,
+ gr.file_sink(gr.sizeof_gr_complex, "rx_agc.dat"))
+ self.connect(self.rrc_filter,
+ gr.file_sink(gr.sizeof_gr_complex, "rx_rrc_filter.dat"))
+ self.connect(self.clock_recov,
+ gr.file_sink(gr.sizeof_gr_complex, "rx_clock_recov.dat"))
+ self.connect(self.time_recov,
+ gr.file_sink(gr.sizeof_gr_complex, "rx_time_recov.dat"))
+ self.connect(self.diffdec,
+ gr.file_sink(gr.sizeof_gr_complex, "rx_diffdec.dat"))
+ self.connect(self.slicer,
+ gr.file_sink(gr.sizeof_char, "rx_slicer.dat"))
+ self.connect(self.symbol_mapper,
+ gr.file_sink(gr.sizeof_char, "rx_symbol_mapper.dat"))
+ self.connect(self.unpack,
+ gr.file_sink(gr.sizeof_char, "rx_unpack.dat"))
+
+ def add_options(parser):
+ """
+ Adds DBPSK demodulation-specific options to the standard parser
+ """
+ parser.add_option("", "--excess-bw", type="float", default=_def_excess_bw,
+ help="set RRC excess bandwith factor [default=%default] (PSK)")
+ parser.add_option("", "--no-gray-code", dest="gray_code",
+ action="store_false", default=_def_gray_code,
+ help="disable gray coding on modulated bits (PSK)")
+ parser.add_option("", "--costas-alpha", type="float", default=None,
+ help="set Costas loop alpha value [default=%default] (PSK)")
+ parser.add_option("", "--gain-alpha", type="float", default=_def_timing_alpha,
+ help="set timing symbol sync loop gain alpha value [default=%default] (GMSK/PSK)")
+ parser.add_option("", "--gain-beta", type="float", default=_def_timing_beta,
+ help="set timing symbol sync loop gain beta value [default=%default] (GMSK/PSK)")
+ parser.add_option("", "--timing-max-dev", type="float", default=_def_timing_max_dev,
+ help="set timing symbol sync loop maximum deviation [default=%default] (GMSK/PSK)")
+ add_options=staticmethod(add_options)
+
+ def extract_kwargs_from_options(options):
+ """
+ Given command line options, create dictionary suitable for passing to __init__
+ """
+ return modulation_utils.extract_kwargs_from_options(
+ dbpsk2_demod.__init__, ('self',), options)
+ extract_kwargs_from_options=staticmethod(extract_kwargs_from_options)
+#
+# Add these to the mod/demod registry
+#
+modulation_utils.add_type_1_mod('dbpsk2', dbpsk2_mod)
+modulation_utils.add_type_1_demod('dbpsk2', dbpsk2_demod)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py b/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py
index 8c15d21734..42d5341685 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py
@@ -1,5 +1,5 @@
#
-# Copyright 2005,2006,2007 Free Software Foundation, Inc.
+# Copyright 2005,2006,2007,2009 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -255,8 +255,8 @@ class dqpsk_demod(gr.hier_block2):
self._mm_omega = self._samples_per_symbol
self._mm_gain_omega = .25 * self._mm_gain_mu * self._mm_gain_mu
self._costas_beta = 0.25 * self._costas_alpha * self._costas_alpha
- fmin = -0.025
- fmax = 0.025
+ fmin = -0.25
+ fmax = 0.25
self.receiver=gr.mpsk_receiver_cc(arity, pi/4.0,
self._costas_alpha, self._costas_beta,
@@ -264,7 +264,7 @@ class dqpsk_demod(gr.hier_block2):
self._mm_mu, self._mm_gain_mu,
self._mm_omega, self._mm_gain_omega,
self._mm_omega_relative_limit)
-
+
# Perform Differential decoding on the constellation
self.diffdec = gr.diff_phasor_cc()
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py b/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py
new file mode 100644
index 0000000000..9704ac98c5
--- /dev/null
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py
@@ -0,0 +1,353 @@
+#
+# Copyright 2005,2006,2007,2009 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+# See gnuradio-examples/python/digital for examples
+
+"""
+differential QPSK modulation and demodulation.
+"""
+
+from gnuradio import gr, gru, modulation_utils
+from math import pi, sqrt
+import psk
+import cmath
+from pprint import pprint
+
+# default values (used in __init__ and add_options)
+_def_samples_per_symbol = 2
+_def_excess_bw = 0.35
+_def_gray_code = True
+_def_verbose = False
+_def_log = False
+
+_def_costas_alpha = 0.01
+_def_timing_alpha = 0.100
+_def_timing_beta = 0.010
+_def_timing_max_dev = 1.5
+
+
+# /////////////////////////////////////////////////////////////////////////////
+# DQPSK modulator
+# /////////////////////////////////////////////////////////////////////////////
+
+class dqpsk2_mod(gr.hier_block2):
+
+ def __init__(self,
+ samples_per_symbol=_def_samples_per_symbol,
+ excess_bw=_def_excess_bw,
+ gray_code=_def_gray_code,
+ verbose=_def_verbose,
+ log=_def_log):
+ """
+ Hierarchical block for RRC-filtered QPSK modulation.
+
+ The input is a byte stream (unsigned char) and the
+ output is the complex modulated signal at baseband.
+
+ @param samples_per_symbol: samples per symbol >= 2
+ @type samples_per_symbol: integer
+ @param excess_bw: Root-raised cosine filter excess bandwidth
+ @type excess_bw: float
+ @param gray_code: Tell modulator to Gray code the bits
+ @type gray_code: bool
+ @param verbose: Print information about modulator?
+ @type verbose: bool
+ @param debug: Print modualtion data to files?
+ @type debug: bool
+ """
+
+ gr.hier_block2.__init__(self, "dqpsk2_mod",
+ gr.io_signature(1, 1, gr.sizeof_char), # Input signature
+ gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature
+
+ self._samples_per_symbol = samples_per_symbol
+ self._excess_bw = excess_bw
+ self._gray_code = gray_code
+
+ if not isinstance(samples_per_symbol, int) or samples_per_symbol < 2:
+ raise TypeError, ("sbp must be an integer >= 2, is %d" % samples_per_symbol)
+
+ ntaps = 11 * samples_per_symbol
+
+ arity = pow(2,self.bits_per_symbol())
+
+ # turn bytes into k-bit vectors
+ self.bytes2chunks = \
+ gr.packed_to_unpacked_bb(self.bits_per_symbol(), gr.GR_MSB_FIRST)
+
+ if self._gray_code:
+ self.symbol_mapper = gr.map_bb(psk.binary_to_gray[arity])
+ else:
+ self.symbol_mapper = gr.map_bb(psk.binary_to_ungray[arity])
+
+ self.diffenc = gr.diff_encoder_bb(arity)
+
+ rot = .707 + .707j
+ rotated_const = map(lambda pt: pt * rot, psk.constellation[arity])
+ self.chunks2symbols = gr.chunks_to_symbols_bc(rotated_const)
+
+ # pulse shaping filter
+ self.rrc_taps = gr.firdes.root_raised_cosine(
+ self._samples_per_symbol, # gain (sps since we're interpolating by sps)
+ self._samples_per_symbol, # sampling rate
+ 1.0, # symbol rate
+ self._excess_bw, # excess bandwidth (roll-off factor)
+ ntaps)
+
+ self.rrc_filter = gr.interp_fir_filter_ccf(self._samples_per_symbol, self.rrc_taps)
+
+ if verbose:
+ self._print_verbage()
+
+ if log:
+ self._setup_logging()
+
+ # Connect & Initialize base class
+ self.connect(self, self.bytes2chunks, self.symbol_mapper, self.diffenc,
+ self.chunks2symbols, self.rrc_filter, self)
+
+ def samples_per_symbol(self):
+ return self._samples_per_symbol
+
+ def bits_per_symbol(self=None): # staticmethod that's also callable on an instance
+ return 2
+ bits_per_symbol = staticmethod(bits_per_symbol) # make it a static method. RTFM
+
+ def _print_verbage(self):
+ print "\nModulator:"
+ print "bits per symbol: %d" % self.bits_per_symbol()
+ print "Gray code: %s" % self._gray_code
+ print "RRS roll-off factor: %f" % self._excess_bw
+
+ def _setup_logging(self):
+ print "Modulation logging turned on."
+ self.connect(self.bytes2chunks,
+ gr.file_sink(gr.sizeof_char, "tx_bytes2chunks.dat"))
+ self.connect(self.symbol_mapper,
+ gr.file_sink(gr.sizeof_char, "tx_graycoder.dat"))
+ self.connect(self.diffenc,
+ gr.file_sink(gr.sizeof_char, "tx_diffenc.dat"))
+ self.connect(self.chunks2symbols,
+ gr.file_sink(gr.sizeof_gr_complex, "tx_chunks2symbols.dat"))
+ self.connect(self.rrc_filter,
+ gr.file_sink(gr.sizeof_gr_complex, "tx_rrc_filter.dat"))
+
+ def add_options(parser):
+ """
+ Adds QPSK modulation-specific options to the standard parser
+ """
+ parser.add_option("", "--excess-bw", type="float", default=_def_excess_bw,
+ help="set RRC excess bandwith factor [default=%default] (PSK)")
+ parser.add_option("", "--no-gray-code", dest="gray_code",
+ action="store_false", default=_def_gray_code,
+ help="disable gray coding on modulated bits (PSK)")
+ add_options=staticmethod(add_options)
+
+
+ def extract_kwargs_from_options(options):
+ """
+ Given command line options, create dictionary suitable for passing to __init__
+ """
+ return modulation_utils.extract_kwargs_from_options(dqpsk2_mod.__init__,
+ ('self',), options)
+ extract_kwargs_from_options=staticmethod(extract_kwargs_from_options)
+
+
+# /////////////////////////////////////////////////////////////////////////////
+# DQPSK demodulator
+#
+# Differentially coherent detection of differentially encoded qpsk
+# /////////////////////////////////////////////////////////////////////////////
+
+class dqpsk2_demod(gr.hier_block2):
+
+ def __init__(self,
+ samples_per_symbol=_def_samples_per_symbol,
+ excess_bw=_def_excess_bw,
+ costas_alpha=_def_costas_alpha,
+ timing_alpha=_def_timing_alpha,
+ timing_max_dev=_def_timing_max_dev,
+ gray_code=_def_gray_code,
+ verbose=_def_verbose,
+ log=_def_log):
+ """
+ Hierarchical block for RRC-filtered DQPSK demodulation
+
+ The input is the complex modulated signal at baseband.
+ The output is a stream of bits packed 1 bit per byte (LSB)
+
+ @param samples_per_symbol: samples per symbol >= 2
+ @type samples_per_symbol: float
+ @param excess_bw: Root-raised cosine filter excess bandwidth
+ @type excess_bw: float
+ @param costas_alpha: loop filter gain
+ @type costas_alphas: float
+ @param timing_alpha: timing loop alpha gain
+ @type timing_alpha: float
+ @param timing_max: timing loop maximum rate deviations
+ @type timing_max: float
+ @param gray_code: Tell modulator to Gray code the bits
+ @type gray_code: bool
+ @param verbose: Print information about modulator?
+ @type verbose: bool
+ @param debug: Print modualtion data to files?
+ @type debug: bool
+ """
+
+ gr.hier_block2.__init__(self, "dqpsk2_demod",
+ gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
+ gr.io_signature(1, 1, gr.sizeof_char)) # Output signature
+
+ self._samples_per_symbol = samples_per_symbol
+ self._excess_bw = excess_bw
+ self._costas_alpha = costas_alpha
+ self._timing_alpha = timing_alpha
+ self._timing_beta = _def_timing_beta
+ self._timing_max_dev=timing_max_dev
+ self._gray_code = gray_code
+
+ if samples_per_symbol < 2:
+ raise TypeError, "sbp must be >= 2, is %d" % samples_per_symbol
+
+ arity = pow(2,self.bits_per_symbol())
+
+ # Automatic gain control
+ self.agc = gr.agc2_cc(0.6e-1, 1e-3, 1, 1, 100)
+ #self.agc = gr.feedforward_agc_cc(16, 2.0)
+
+ self._costas_beta = 0.25 * self._costas_alpha * self._costas_alpha
+ # Allow a frequency swing of +/- half of the sample rate
+ fmin = -0.5
+ fmax = 0.5
+
+ self.clock_recov = gr.costas_loop_cc(self._costas_alpha,
+ self._costas_beta,
+ fmax, fmin, arity)
+
+ # symbol timing recovery with RRC data filter
+ nfilts = 32
+ ntaps = 11 * samples_per_symbol*nfilts
+ taps = gr.firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(self._samples_per_symbol), self._excess_bw, ntaps)
+ self.time_recov = gr.pfb_clock_sync_ccf(self._samples_per_symbol,
+ self._timing_alpha,
+ taps, nfilts, nfilts/2, self._timing_max_dev)
+ self.time_recov.set_beta(self._timing_beta)
+
+ # Perform Differential decoding on the constellation
+ self.diffdec = gr.diff_phasor_cc()
+
+ # find closest constellation point
+ rot = 1
+ rotated_const = map(lambda pt: pt * rot, psk.constellation[arity])
+ self.slicer = gr.constellation_decoder_cb(rotated_const, range(arity))
+
+ if self._gray_code:
+ self.symbol_mapper = gr.map_bb(psk.gray_to_binary[arity])
+ else:
+ self.symbol_mapper = gr.map_bb(psk.ungray_to_binary[arity])
+
+ # unpack the k bit vector into a stream of bits
+ self.unpack = gr.unpack_k_bits_bb(self.bits_per_symbol())
+
+ if verbose:
+ self._print_verbage()
+
+ if log:
+ self._setup_logging()
+
+ # Connect
+ self.connect(self, self.agc,
+ self.clock_recov,
+ self.time_recov,
+ self.diffdec, self.slicer, self.symbol_mapper, self.unpack, self)
+
+ def samples_per_symbol(self):
+ return self._samples_per_symbol
+
+ def bits_per_symbol(self=None): # staticmethod that's also callable on an instance
+ return 2
+ bits_per_symbol = staticmethod(bits_per_symbol) # make it a static method. RTFM
+
+ def _print_verbage(self):
+ print "\nDemodulator:"
+ print "bits per symbol: %d" % self.bits_per_symbol()
+ print "Gray code: %s" % self._gray_code
+ print "RRC roll-off factor: %.2f" % self._excess_bw
+ print "Costas Loop alpha: %.2e" % self._costas_alpha
+ print "Costas Loop beta: %.2e" % self._costas_beta
+ print "Timing alpha gain: %.2f" % self._timing_alpha
+ print "Timing beta gain: %.2f" % self._timing_beta
+ print "Timing max dev: %.2f" % self._timing_max_dev
+
+ def _setup_logging(self):
+ print "Modulation logging turned on."
+ self.connect(self.pre_scaler,
+ gr.file_sink(gr.sizeof_gr_complex, "rx_prescaler.dat"))
+ self.connect(self.agc,
+ gr.file_sink(gr.sizeof_gr_complex, "rx_agc.dat"))
+ self.connect(self.rrc_filter,
+ gr.file_sink(gr.sizeof_gr_complex, "rx_rrc_filter.dat"))
+ self.connect(self.clock_recov,
+ gr.file_sink(gr.sizeof_gr_complex, "rx_clock_recov.dat"))
+ self.connect(self.time_recov,
+ gr.file_sink(gr.sizeof_gr_complex, "rx_time_recov.dat"))
+ self.connect(self.diffdec,
+ gr.file_sink(gr.sizeof_gr_complex, "rx_diffdec.dat"))
+ self.connect(self.slicer,
+ gr.file_sink(gr.sizeof_char, "rx_slicer.dat"))
+ self.connect(self.symbol_mapper,
+ gr.file_sink(gr.sizeof_char, "rx_gray_decoder.dat"))
+ self.connect(self.unpack,
+ gr.file_sink(gr.sizeof_char, "rx_unpack.dat"))
+
+ def add_options(parser):
+ """
+ Adds modulation-specific options to the standard parser
+ """
+ parser.add_option("", "--excess-bw", type="float", default=_def_excess_bw,
+ help="set RRC excess bandwith factor [default=%default] (PSK)")
+ parser.add_option("", "--no-gray-code", dest="gray_code",
+ action="store_false", default=_def_gray_code,
+ help="disable gray coding on modulated bits (PSK)")
+ parser.add_option("", "--costas-alpha", type="float", default=_def_costas_alpha,
+ help="set Costas loop alpha value [default=%default] (PSK)")
+ parser.add_option("", "--gain-alpha", type="float", default=_def_timing_alpha,
+ help="set timing symbol sync loop gain alpha value [default=%default] (GMSK/PSK)")
+ parser.add_option("", "--gain-beta", type="float", default=_def_timing_beta,
+ help="set timing symbol sync loop gain beta value [default=%default] (GMSK/PSK)")
+ parser.add_option("", "--timing-max-dev", type="float", default=_def_timing_max_dev,
+ help="set timing symbol sync loop maximum deviation [default=%default] (GMSK/PSK)")
+ add_options=staticmethod(add_options)
+
+ def extract_kwargs_from_options(options):
+ """
+ Given command line options, create dictionary suitable for passing to __init__
+ """
+ return modulation_utils.extract_kwargs_from_options(
+ dqpsk2_demod.__init__, ('self',), options)
+ extract_kwargs_from_options=staticmethod(extract_kwargs_from_options)
+
+
+#
+# Add these to the mod/demod registry
+#
+modulation_utils.add_type_1_mod('dqpsk2', dqpsk2_mod)
+modulation_utils.add_type_1_demod('dqpsk2', dqpsk2_demod)
diff --git a/gnuradio-examples/Makefile.am b/gnuradio-examples/Makefile.am
index 360ae8b41f..9ea890c120 100644
--- a/gnuradio-examples/Makefile.am
+++ b/gnuradio-examples/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2004,2007 Free Software Foundation, Inc.
+# Copyright 2004,2007,2009 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -23,5 +23,5 @@ include $(top_srcdir)/Makefile.common
SUBDIRS = c++
if PYTHON
-SUBDIRS += python
+SUBDIRS += python grc
endif
diff --git a/grc/examples/.gitignore b/gnuradio-examples/grc/.gitignore
index b336cc7cec..b336cc7cec 100644
--- a/grc/examples/.gitignore
+++ b/gnuradio-examples/grc/.gitignore
diff --git a/grc/examples/Makefile.am b/gnuradio-examples/grc/Makefile.am
index 78321ce0a8..97417c5a22 100644
--- a/grc/examples/Makefile.am
+++ b/gnuradio-examples/grc/Makefile.am
@@ -28,6 +28,11 @@ dist_audiodata_DATA = \
audio/dial_tone.grc \
audio/cvsd_sweep.grc
+demoddatadir = $(grc_examples_prefix)/demod
+dist_demoddata_DATA = \
+ demod/mpsk_demod.grc \
+ demod/pam_timing.grc
+
simpledatadir = $(grc_examples_prefix)/simple
dist_simpledata_DATA = \
simple/ber_simulation.grc \
diff --git a/grc/examples/audio/cvsd_sweep.grc b/gnuradio-examples/grc/audio/cvsd_sweep.grc
index 8d0b385cef..8d0b385cef 100644
--- a/grc/examples/audio/cvsd_sweep.grc
+++ b/gnuradio-examples/grc/audio/cvsd_sweep.grc
diff --git a/grc/examples/audio/dial_tone.grc b/gnuradio-examples/grc/audio/dial_tone.grc
index ac8cbef279..ac8cbef279 100644
--- a/grc/examples/audio/dial_tone.grc
+++ b/gnuradio-examples/grc/audio/dial_tone.grc
diff --git a/gnuradio-examples/grc/demod/mpsk_demod.grc b/gnuradio-examples/grc/demod/mpsk_demod.grc
new file mode 100644
index 0000000000..08108dcba0
--- /dev/null
+++ b/gnuradio-examples/grc/demod/mpsk_demod.grc
@@ -0,0 +1,586 @@
+<?xml version='1.0' encoding='ASCII'?>
+<flow_graph>
+ <timestamp>Mon Oct 5 18:34:52 2009</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>id</key>
+ <value>mpsk_demod</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>MPSK Demod Demo</value>
+ </param>
+ <param>
+ <key>author</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>1280, 1024</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>wx_gui</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>Custom</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(10, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>32000</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(10, 170)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>random_source_x</key>
+ <param>
+ <key>id</key>
+ <value>random_source_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>2**8</value>
+ </param>
+ <param>
+ <key>num_samps</key>
+ <value>10000</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(155, 160)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blks2_dxpsk_mod</key>
+ <param>
+ <key>id</key>
+ <value>blks2_dxpsk_mod_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>dqpsk</value>
+ </param>
+ <param>
+ <key>samples_per_symbol</key>
+ <value>samps_per_sym</value>
+ </param>
+ <param>
+ <key>excess_bw</key>
+ <value>0.35</value>
+ </param>
+ <param>
+ <key>gray_code</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>verbose</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>log</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(391, 54)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_throttle</key>
+ <param>
+ <key>id</key>
+ <value>gr_throttle_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>samples_per_second</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(654, 142)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>samps_per_sym</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(7, 89)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_channel_model</key>
+ <param>
+ <key>id</key>
+ <value>gr_channel_model_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>noise_voltage</key>
+ <value>noise</value>
+ </param>
+ <param>
+ <key>freq_offset</key>
+ <value>freq_off</value>
+ </param>
+ <param>
+ <key>epsilon</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>42</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(487, 282)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_slider</key>
+ <param>
+ <key>id</key>
+ <value>noise</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Noise</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>.1</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>100</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>float_converter</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(259, 353)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_slider</key>
+ <param>
+ <key>id</key>
+ <value>freq_off</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Freq Offset</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>-.5</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>.5</value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>1000</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>float_converter</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(126, 345)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>notebook</key>
+ <param>
+ <key>id</key>
+ <value>notebook</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.NB_TOP</value>
+ </param>
+ <param>
+ <key>labels</key>
+ <value>['Constellation', 'Spectrum']</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(520, 407)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_constellationsink2</key>
+ <param>
+ <key>id</key>
+ <value>wxgui_constellationsink2_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>Constellation Plot</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>frame_rate</key>
+ <value>5</value>
+ </param>
+ <param>
+ <key>const_size</key>
+ <value>2048</value>
+ </param>
+ <param>
+ <key>M</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>theta</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha</key>
+ <value>0.005</value>
+ </param>
+ <param>
+ <key>fmax</key>
+ <value>0.06</value>
+ </param>
+ <param>
+ <key>mu</key>
+ <value>0.5</value>
+ </param>
+ <param>
+ <key>gain_mu</key>
+ <value>0.005</value>
+ </param>
+ <param>
+ <key>symbol_rate</key>
+ <value>samp_rate/4.</value>
+ </param>
+ <param>
+ <key>omega_limit</key>
+ <value>0.005</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value>notebook, 0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(824, 212)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_fftsink2</key>
+ <param>
+ <key>id</key>
+ <value>wxgui_fftsink2_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>FFT Plot</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>baseband_freq</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>y_per_div</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>y_divs</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ref_level</key>
+ <value>50</value>
+ </param>
+ <param>
+ <key>ref_scale</key>
+ <value>2.0</value>
+ </param>
+ <param>
+ <key>fft_size</key>
+ <value>1024</value>
+ </param>
+ <param>
+ <key>fft_rate</key>
+ <value>30</value>
+ </param>
+ <param>
+ <key>peak_hold</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>average</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>avg_alpha</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value>notebook, 1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(847, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>random_source_x_0</source_block_id>
+ <sink_block_id>blks2_dxpsk_mod_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_throttle_0</source_block_id>
+ <sink_block_id>wxgui_constellationsink2_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_throttle_0</source_block_id>
+ <sink_block_id>wxgui_fftsink2_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blks2_dxpsk_mod_0</source_block_id>
+ <sink_block_id>gr_channel_model_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_channel_model_0</source_block_id>
+ <sink_block_id>gr_throttle_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+</flow_graph>
diff --git a/gnuradio-examples/grc/demod/pam_timing.grc b/gnuradio-examples/grc/demod/pam_timing.grc
new file mode 100644
index 0000000000..4e2a2f8614
--- /dev/null
+++ b/gnuradio-examples/grc/demod/pam_timing.grc
@@ -0,0 +1,1424 @@
+<?xml version='1.0' encoding='ASCII'?>
+<flow_graph>
+ <timestamp>Mon Oct 12 17:54:59 2009</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>id</key>
+ <value>top_block</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value></value>
+ </param>
+ <param>
+ <key>author</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>1280, 1024</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>wx_gui</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>Custom</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(10, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_uchar_to_float</key>
+ <param>
+ <key>id</key>
+ <value>gr_uchar_to_float_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(217, 108)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_uchar_to_float</key>
+ <param>
+ <key>id</key>
+ <value>gr_uchar_to_float_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(216, 273)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>32000</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(128, 9)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_slider</key>
+ <param>
+ <key>id</key>
+ <value>freq_offset</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Frequency Offset</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>-0.5</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>0.5</value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>1000</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>float_converter</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(293, 684)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>rrctaps</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>firdes.root_raised_cosine(nfilts,1.0,1.0/(spb*nfilts), .35, int(11*spb*nfilts))</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(513, 679)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>random_source_x</key>
+ <param>
+ <key>id</key>
+ <value>random_source_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>pam_amp</value>
+ </param>
+ <param>
+ <key>num_samps</key>
+ <value>10000</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(13, 80)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>random_source_x</key>
+ <param>
+ <key>id</key>
+ <value>random_source_x_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>pam_amp</value>
+ </param>
+ <param>
+ <key>num_samps</key>
+ <value>10000</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(15, 245)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>const_source_x</key>
+ <param>
+ <key>id</key>
+ <value>const_source_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>const</key>
+ <value>-0.5*(pam_amp-1)</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(213, 197)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>const_source_x</key>
+ <param>
+ <key>id</key>
+ <value>const_source_x_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>const</key>
+ <value>-0.5*(pam_amp-1)</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(200, 360)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_scopesink2</key>
+ <param>
+ <key>id</key>
+ <value>wxgui_scopesink2_0_0_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>Scope Plot</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>v_scale</key>
+ <value>1.25</value>
+ </param>
+ <param>
+ <key>t_scale</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ac_couple</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>xy_mode</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value>notebook_0,2</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1111, 767)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_scopesink2</key>
+ <param>
+ <key>id</key>
+ <value>wxgui_scopesink2_0_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>Scope Plot</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>v_scale</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>t_scale</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ac_couple</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>xy_mode</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value>notebook_0,1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1112, 881)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_channel_model</key>
+ <param>
+ <key>id</key>
+ <value>gr_channel_model_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>noise_voltage</key>
+ <value>noise_amp</value>
+ </param>
+ <param>
+ <key>freq_offset</key>
+ <value>freq_offset</value>
+ </param>
+ <param>
+ <key>epsilon</key>
+ <value>interpratio</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>42</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(59, 543)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_throttle</key>
+ <param>
+ <key>id</key>
+ <value>gr_throttle_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>samples_per_second</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(290, 575)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>notebook</key>
+ <param>
+ <key>id</key>
+ <value>notebook_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.NB_TOP</value>
+ </param>
+ <param>
+ <key>labels</key>
+ <value>['error', 'phase', 'freq', 'Resampled Signal']</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(729, 769)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_scopesink2</key>
+ <param>
+ <key>id</key>
+ <value>wxgui_scopesink2_0_0_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>Error</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>v_scale</key>
+ <value>.5</value>
+ </param>
+ <param>
+ <key>t_scale</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ac_couple</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>xy_mode</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value>notebook_0,3</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1115, 358)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_add_xx</key>
+ <param>
+ <key>id</key>
+ <value>gr_add_xx_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(440, 167)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_add_xx</key>
+ <param>
+ <key>id</key>
+ <value>gr_add_xx_0_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(430, 330)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_float_to_complex</key>
+ <param>
+ <key>id</key>
+ <value>gr_float_to_complex_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(590, 184)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_scopesink2</key>
+ <param>
+ <key>id</key>
+ <value>wxgui_scopesink2_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>Scope Plot</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>v_scale</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>t_scale</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ac_couple</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>xy_mode</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1116, 500)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>nfilts</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>32</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(435, 686)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_pfb_clock_sync_ccf</key>
+ <param>
+ <key>id</key>
+ <value>gr_pfb_clock_sync_ccf_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>sps</key>
+ <value>spb</value>
+ </param>
+ <param>
+ <key>alpha</key>
+ <value>alpha</value>
+ </param>
+ <param>
+ <key>beta</key>
+ <value>beta</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>rrctaps</value>
+ </param>
+ <param>
+ <key>filter_size</key>
+ <value>nfilts</value>
+ </param>
+ <param>
+ <key>init_phase</key>
+ <value>16</value>
+ </param>
+ <param>
+ <key>max_dev</key>
+ <value>1.5</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(512, 527)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_slider</key>
+ <param>
+ <key>id</key>
+ <value>noise_amp</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Channel Noise</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>1000</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>float_converter</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(168, 684)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_slider</key>
+ <param>
+ <key>id</key>
+ <value>interpratio</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Timing Offset</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>1.00</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0.99</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>1.01</value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>1000</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>float_converter</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(40, 684)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>spb_gen</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(119, 841)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_slider</key>
+ <param>
+ <key>id</key>
+ <value>beta</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Timing Beta</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>0.1</value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>1000</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>float_converter</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(668, 5)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_slider</key>
+ <param>
+ <key>id</key>
+ <value>alpha</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Timing Alpha</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>1000</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>float_converter</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(552, 4)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_scopesink2</key>
+ <param>
+ <key>id</key>
+ <value>wxgui_scopesink2_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>Error</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>v_scale</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>t_scale</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ac_couple</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>xy_mode</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value>notebook_0,0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1110, 651)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>root_raised_cosine_filter</key>
+ <param>
+ <key>id</key>
+ <value>root_raised_cosine_filter_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>interp_fir_filter_ccf</value>
+ </param>
+ <param>
+ <key>decim</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>interp</key>
+ <value>spb_gen</value>
+ </param>
+ <param>
+ <key>gain</key>
+ <value>2*spb_gen</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>sym_rate</key>
+ <value>1./spb_gen</value>
+ </param>
+ <param>
+ <key>alpha</key>
+ <value>0.35</value>
+ </param>
+ <param>
+ <key>ntaps</key>
+ <value>11*spb_gen</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(834, 157)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blks2_pfb_arb_resampler_ccf</key>
+ <param>
+ <key>id</key>
+ <value>blks2_pfb_arb_resampler_ccf_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>float(spb)/float(spb_gen)</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>firdes.low_pass(128, 128, 0.45, 0.1)</value>
+ </param>
+ <param>
+ <key>size</key>
+ <value>128</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(617, 374)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_multiply_const_vxx</key>
+ <param>
+ <key>id</key>
+ <value>gr_multiply_const_vxx_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>const</key>
+ <value>sig_amp</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1096, 197)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>pam_amp</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(223, 9)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>spb</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>4.1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(32, 842)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>sig_amp</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(315, 9)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>gr_pfb_clock_sync_ccf_0</source_block_id>
+ <sink_block_id>wxgui_scopesink2_0_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_pfb_clock_sync_ccf_0</source_block_id>
+ <sink_block_id>wxgui_scopesink2_0_0_0</sink_block_id>
+ <source_key>3</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_pfb_clock_sync_ccf_0</source_block_id>
+ <sink_block_id>wxgui_scopesink2_0_0_0_0</sink_block_id>
+ <source_key>2</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>random_source_x_0</source_block_id>
+ <sink_block_id>gr_uchar_to_float_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_uchar_to_float_0</source_block_id>
+ <sink_block_id>gr_add_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>const_source_x_0</source_block_id>
+ <sink_block_id>gr_add_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_uchar_to_float_0_0</source_block_id>
+ <sink_block_id>gr_add_xx_0_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>const_source_x_0_0</source_block_id>
+ <sink_block_id>gr_add_xx_0_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>random_source_x_0_0</source_block_id>
+ <sink_block_id>gr_uchar_to_float_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blks2_pfb_arb_resampler_ccf_0</source_block_id>
+ <sink_block_id>gr_channel_model_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blks2_pfb_arb_resampler_ccf_0</source_block_id>
+ <sink_block_id>wxgui_scopesink2_0_0_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_channel_model_0</source_block_id>
+ <sink_block_id>gr_throttle_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_throttle_0</source_block_id>
+ <sink_block_id>gr_pfb_clock_sync_ccf_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_pfb_clock_sync_ccf_0</source_block_id>
+ <sink_block_id>wxgui_scopesink2_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_add_xx_0</source_block_id>
+ <sink_block_id>gr_float_to_complex_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_add_xx_0_1</source_block_id>
+ <sink_block_id>gr_float_to_complex_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_float_to_complex_0</source_block_id>
+ <sink_block_id>root_raised_cosine_filter_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>root_raised_cosine_filter_0</source_block_id>
+ <sink_block_id>gr_multiply_const_vxx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_multiply_const_vxx_0</source_block_id>
+ <sink_block_id>blks2_pfb_arb_resampler_ccf_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+</flow_graph>
diff --git a/grc/examples/simple/ber_simulation.grc b/gnuradio-examples/grc/simple/ber_simulation.grc
index 618add29c3..618add29c3 100644
--- a/grc/examples/simple/ber_simulation.grc
+++ b/gnuradio-examples/grc/simple/ber_simulation.grc
diff --git a/grc/examples/simple/dpsk_loopback.grc b/gnuradio-examples/grc/simple/dpsk_loopback.grc
index 6a507c98da..6a507c98da 100644
--- a/grc/examples/simple/dpsk_loopback.grc
+++ b/gnuradio-examples/grc/simple/dpsk_loopback.grc
diff --git a/grc/examples/simple/var_sink_taps.grc b/gnuradio-examples/grc/simple/var_sink_taps.grc
index 07207850ee..07207850ee 100644
--- a/grc/examples/simple/var_sink_taps.grc
+++ b/gnuradio-examples/grc/simple/var_sink_taps.grc
diff --git a/grc/examples/simple/variable_config.grc b/gnuradio-examples/grc/simple/variable_config.grc
index 95c287cce7..95c287cce7 100644
--- a/grc/examples/simple/variable_config.grc
+++ b/gnuradio-examples/grc/simple/variable_config.grc
diff --git a/grc/examples/trellis/interference_cancellation.grc b/gnuradio-examples/grc/trellis/interference_cancellation.grc
index e93babd787..e93babd787 100644
--- a/grc/examples/trellis/interference_cancellation.grc
+++ b/gnuradio-examples/grc/trellis/interference_cancellation.grc
diff --git a/grc/examples/trellis/readme.txt b/gnuradio-examples/grc/trellis/readme.txt
index d620fd6282..d620fd6282 100644
--- a/grc/examples/trellis/readme.txt
+++ b/gnuradio-examples/grc/trellis/readme.txt
diff --git a/grc/examples/usrp/usrp2_const_wave.grc b/gnuradio-examples/grc/usrp/usrp2_const_wave.grc
index fdbd7c1f39..fdbd7c1f39 100644
--- a/grc/examples/usrp/usrp2_const_wave.grc
+++ b/gnuradio-examples/grc/usrp/usrp2_const_wave.grc
diff --git a/grc/examples/usrp/usrp2_dpsk_mod.grc b/gnuradio-examples/grc/usrp/usrp2_dpsk_mod.grc
index e9f9b41ea9..e9f9b41ea9 100644
--- a/grc/examples/usrp/usrp2_dpsk_mod.grc
+++ b/gnuradio-examples/grc/usrp/usrp2_dpsk_mod.grc
diff --git a/grc/examples/usrp/usrp2_fft.grc b/gnuradio-examples/grc/usrp/usrp2_fft.grc
index 134bd46146..134bd46146 100644
--- a/grc/examples/usrp/usrp2_fft.grc
+++ b/gnuradio-examples/grc/usrp/usrp2_fft.grc
diff --git a/grc/examples/usrp/usrp_two_tone_loopback.grc b/gnuradio-examples/grc/usrp/usrp_two_tone_loopback.grc
index 3df9770444..3df9770444 100644
--- a/grc/examples/usrp/usrp_two_tone_loopback.grc
+++ b/gnuradio-examples/grc/usrp/usrp_two_tone_loopback.grc
diff --git a/grc/examples/usrp/usrp_wbfm_receive.grc b/gnuradio-examples/grc/usrp/usrp_wbfm_receive.grc
index 8f53475ab5..8f53475ab5 100644
--- a/grc/examples/usrp/usrp_wbfm_receive.grc
+++ b/gnuradio-examples/grc/usrp/usrp_wbfm_receive.grc
diff --git a/grc/examples/xmlrpc/readme.txt b/gnuradio-examples/grc/xmlrpc/readme.txt
index c1f87c1cb5..c1f87c1cb5 100644
--- a/grc/examples/xmlrpc/readme.txt
+++ b/gnuradio-examples/grc/xmlrpc/readme.txt
diff --git a/grc/examples/xmlrpc/xmlrpc_client.grc b/gnuradio-examples/grc/xmlrpc/xmlrpc_client.grc
index 3bb4e7ed3b..3bb4e7ed3b 100644
--- a/grc/examples/xmlrpc/xmlrpc_client.grc
+++ b/gnuradio-examples/grc/xmlrpc/xmlrpc_client.grc
diff --git a/grc/examples/xmlrpc/xmlrpc_client_script.py b/gnuradio-examples/grc/xmlrpc/xmlrpc_client_script.py
index 956fa07fb7..956fa07fb7 100644
--- a/grc/examples/xmlrpc/xmlrpc_client_script.py
+++ b/gnuradio-examples/grc/xmlrpc/xmlrpc_client_script.py
diff --git a/grc/examples/xmlrpc/xmlrpc_server.grc b/gnuradio-examples/grc/xmlrpc/xmlrpc_server.grc
index dc539ef1b1..dc539ef1b1 100644
--- a/grc/examples/xmlrpc/xmlrpc_server.grc
+++ b/gnuradio-examples/grc/xmlrpc/xmlrpc_server.grc
diff --git a/gnuradio-examples/python/digital/benchmark_qt_loopback.py b/gnuradio-examples/python/digital/benchmark_qt_loopback.py
index e43bffa263..35cc2e376d 100755
--- a/gnuradio-examples/python/digital/benchmark_qt_loopback.py
+++ b/gnuradio-examples/python/digital/benchmark_qt_loopback.py
@@ -52,7 +52,7 @@ class dialog_box(QtGui.QMainWindow):
self.set_frequency(self.fg.frequency_offset())
self.set_time_offset(self.fg.timing_offset())
- self.set_gain_mu(self.fg.rx_gain_mu())
+ self.set_gain_mu(self.fg.rx_timing_gain_alpha())
self.set_alpha(self.fg.rx_alpha())
# Add the qtsnk widgets to the hlayout box
@@ -158,7 +158,7 @@ class dialog_box(QtGui.QMainWindow):
def gainMuEditText(self):
try:
gain = self.gui.gainMuEdit.text().toDouble()[0]
- self.fg.set_rx_gain_mu(gain)
+ self.fg.set_rx_timing_gain_alpha(gain)
except RuntimeError:
pass
@@ -202,7 +202,7 @@ class my_top_block(gr.top_block):
self.rxpath = receive_path(demod_class, rx_callback, options)
# FIXME: do better exposure to lower issues for control
- self._gain_mu = self.rxpath.packet_receiver._demodulator._mm_gain_mu
+ self._timing_gain_alpha = self.rxpath.packet_receiver._demodulator._timing_alpha
self._alpha = self.rxpath.packet_receiver._demodulator._costas_alpha
if channelon:
@@ -240,16 +240,21 @@ class my_top_block(gr.top_block):
# Connect to the QT sinks
# FIXME: make better exposure to receiver from rxpath
- self.receiver = self.rxpath.packet_receiver._demodulator.receiver
+ self.freq_recov = self.rxpath.packet_receiver._demodulator.clock_recov
+ self.time_recov = self.rxpath.packet_receiver._demodulator.time_recov
+ self.freq_recov.set_alpha(0)
+ self.freq_recov.set_beta(0)
+ self.time_recov.set_alpha(2)
+ self.time_recov.set_beta(0.02)
self.connect(self.channel, self.snk_tx)
- self.connect(self.receiver, self.snk_rx)
+ self.connect(self.time_recov, self.snk_rx)
pyTxQt = self.snk_tx.pyqwidget()
pyTx = sip.wrapinstance(pyTxQt, QtGui.QWidget)
-
+
pyRxQt = self.snk_rx.pyqwidget()
pyRx = sip.wrapinstance(pyRxQt, QtGui.QWidget)
-
+
self.main_box = dialog_box(pyTx, pyRx, self)
self.main_box.show()
@@ -299,17 +304,15 @@ class my_top_block(gr.top_block):
# Receiver Parameters
- def rx_gain_mu(self):
- return self._gain_mu
+ def rx_timing_gain_alpha(self):
+ return self._timing_gain_alpha
- def rx_gain_omega(self):
- return self.gain_omega
+ def rx_timing_gain_beta(self):
+ return self._timing_gain_beta
- def set_rx_gain_mu(self, gain):
- self._gain_mu = gain
- self.gain_omega = .25 * self._gain_mu * self._gain_mu
- self.receiver.set_gain_mu(self._gain_mu)
- self.receiver.set_gain_omega(self.gain_omega)
+ def set_rx_timing_gain_alpha(self, gain):
+ self._timing_gain_alpha = gain
+ self.time_recov.set_gain(self._timing_gain_alpha)
def rx_alpha(self):
return self._alpha
@@ -320,8 +323,8 @@ class my_top_block(gr.top_block):
def set_rx_alpha(self, alpha):
self._alpha = alpha
self.beta = .25 * self._alpha * self._alpha
- self.receiver.set_alpha(self._alpha)
- self.receiver.set_beta(self.beta)
+ #self.freq_recov.set_alpha(self._alpha)
+ #self.freq_recov.set_beta(self.beta)
diff --git a/gnuradio-examples/python/digital/benchmark_qt_loopback2.py b/gnuradio-examples/python/digital/benchmark_qt_loopback2.py
new file mode 100755
index 0000000000..101dd68d68
--- /dev/null
+++ b/gnuradio-examples/python/digital/benchmark_qt_loopback2.py
@@ -0,0 +1,488 @@
+#!/usr/bin/env python
+
+from gnuradio import gr, gru, modulation_utils
+from gnuradio import eng_notation
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
+import random, time, struct, sys, os, math
+
+from threading import Thread
+
+# from current dir
+from transmit_path import transmit_path
+from receive_path import receive_path
+
+try:
+ from gnuradio.qtgui import qtgui
+ from PyQt4 import QtGui, QtCore
+ import sip
+except ImportError:
+ print "Please install gr-qtgui."
+ sys.exit(1)
+
+try:
+ from qt_digital_window2 import Ui_DigitalWindow
+except ImportError:
+ print "Error: could not find qt_digital_window2.py:"
+ print "\t\"pyuic4 qt_digital_window2.ui -o qt_digital_window2.py\""
+ sys.exit(1)
+
+
+#print os.getpid()
+#raw_input()
+
+
+# ////////////////////////////////////////////////////////////////////
+# Define the QT Interface and Control Dialog
+# ////////////////////////////////////////////////////////////////////
+
+
+class dialog_box(QtGui.QMainWindow):
+ def __init__(self, snkTx, snkRx, fg, parent=None):
+
+ QtGui.QWidget.__init__(self, parent)
+ self.gui = Ui_DigitalWindow()
+ self.gui.setupUi(self)
+
+ self.fg = fg
+
+ self.set_sample_rate(self.fg.sample_rate())
+
+ self.set_snr(self.fg.snr())
+ self.set_frequency(self.fg.frequency_offset())
+ self.set_time_offset(self.fg.timing_offset())
+
+ self.set_alpha_time(self.fg.rx_timing_gain_alpha())
+ self.set_beta_time(self.fg.rx_timing_gain_beta())
+ self.set_alpha_freq(self.fg.rx_freq_gain_alpha())
+
+ # Add the qtsnk widgets to the hlayout box
+ self.gui.sinkLayout.addWidget(snkTx)
+ self.gui.sinkLayout.addWidget(snkRx)
+
+
+ # Connect up some signals
+ self.connect(self.gui.pauseButton, QtCore.SIGNAL("clicked()"),
+ self.pauseFg)
+
+ self.connect(self.gui.sampleRateEdit, QtCore.SIGNAL("editingFinished()"),
+ self.sampleRateEditText)
+
+ self.connect(self.gui.snrEdit, QtCore.SIGNAL("editingFinished()"),
+ self.snrEditText)
+ self.connect(self.gui.freqEdit, QtCore.SIGNAL("editingFinished()"),
+ self.freqEditText)
+ self.connect(self.gui.timeEdit, QtCore.SIGNAL("editingFinished()"),
+ self.timeEditText)
+
+ self.connect(self.gui.alphaTimeEdit, QtCore.SIGNAL("editingFinished()"),
+ self.alphaTimeEditText)
+ self.connect(self.gui.betaTimeEdit, QtCore.SIGNAL("editingFinished()"),
+ self.betaTimeEditText)
+ self.connect(self.gui.alphaFreqEdit, QtCore.SIGNAL("editingFinished()"),
+ self.alphaFreqEditText)
+
+ # Build a timer to update the packet number and PER fields
+ self.update_delay = 250 # time between updating packet rate fields
+ self.pkt_timer = QtCore.QTimer(self)
+ self.connect(self.pkt_timer, QtCore.SIGNAL("timeout()"),
+ self.updatePacketInfo)
+ self.pkt_timer.start(self.update_delay)
+
+ def pauseFg(self):
+ if(self.gui.pauseButton.text() == "Pause"):
+ self.fg.stop()
+ self.fg.wait()
+ self.gui.pauseButton.setText("Unpause")
+ else:
+ self.fg.start()
+ self.gui.pauseButton.setText("Pause")
+
+ # Accessor functions for Gui to manipulate system parameters
+ def set_sample_rate(self, sr):
+ ssr = eng_notation.num_to_str(sr)
+ self.gui.sampleRateEdit.setText(QtCore.QString("%1").arg(ssr))
+
+ def sampleRateEditText(self):
+ try:
+ rate = self.gui.sampleRateEdit.text().toAscii()
+ srate = eng_notation.str_to_num(rate)
+ #self.fg.set_sample_rate(srate)
+ except RuntimeError:
+ pass
+
+
+ # Accessor functions for Gui to manipulate channel model
+ def set_snr(self, snr):
+ self.gui.snrEdit.setText(QtCore.QString("%1").arg(snr))
+
+ def set_frequency(self, fo):
+ self.gui.freqEdit.setText(QtCore.QString("%1").arg(fo))
+
+ def set_time_offset(self, to):
+ self.gui.timeEdit.setText(QtCore.QString("%1").arg(to))
+
+ def snrEditText(self):
+ try:
+ snr = self.gui.snrEdit.text().toDouble()[0]
+ self.fg.set_snr(snr)
+ except RuntimeError:
+ pass
+
+ def freqEditText(self):
+ try:
+ freq = self.gui.freqEdit.text().toDouble()[0]
+ self.fg.set_frequency_offset(freq)
+ except RuntimeError:
+ pass
+
+ def timeEditText(self):
+ try:
+ to = self.gui.timeEdit.text().toDouble()[0]
+ self.fg.set_timing_offset(to)
+ except RuntimeError:
+ pass
+
+
+ # Accessor functions for Gui to manipulate receiver parameters
+ def set_alpha_time(self, alpha):
+ self.gui.alphaTimeEdit.setText(QtCore.QString("%1").arg(alpha))
+
+ def set_beta_time(self, beta):
+ self.gui.betaTimeEdit.setText(QtCore.QString("%1").arg(beta))
+
+ def set_alpha_freq(self, alpha):
+ self.gui.alphaFreqEdit.setText(QtCore.QString("%1").arg(alpha))
+
+ def alphaFreqEditText(self):
+ try:
+ alpha = self.gui.alphaFreqEdit.text().toDouble()[0]
+ self.fg.set_rx_freq_gain_alpha(alpha)
+ except RuntimeError:
+ pass
+
+ def alphaTimeEditText(self):
+ try:
+ alpha = self.gui.alphaTimeEdit.text().toDouble()[0]
+ self.fg.set_rx_timing_gain_alpha(alpha)
+ except RuntimeError:
+ pass
+
+ def betaTimeEditText(self):
+ try:
+ beta = self.gui.betaTimeEdit.text().toDouble()[0]
+ self.fg.set_rx_timing_gain_beta(beta)
+ except RuntimeError:
+ pass
+
+ # Accessor functions for packet error reporting
+ def updatePacketInfo(self):
+ # Pull these globals in from the main thread
+ global n_rcvd, n_right, pktno
+
+ if(pktno > 0):
+ per = float(n_rcvd - n_right)/float(pktno)
+ else:
+ per = 0
+ self.gui.pktsRcvdEdit.setText(QtCore.QString("%1").arg(n_rcvd))
+ self.gui.pktsCorrectEdit.setText(QtCore.QString("%1").arg(n_right))
+ self.gui.perEdit.setText(QtCore.QString("%1").arg(per))
+
+
+
+# ////////////////////////////////////////////////////////////////////
+# Define the GNU Radio Top Block
+# ////////////////////////////////////////////////////////////////////
+
+
+
+class my_top_block(gr.top_block):
+ def __init__(self, mod_class, demod_class, rx_callback, options):
+ gr.top_block.__init__(self)
+
+ self._sample_rate = options.sample_rate
+
+ channelon = True;
+
+ self.gui_on = options.gui
+
+ self._frequency_offset = options.frequency_offset
+ self._timing_offset = options.timing_offset
+ self._tx_amplitude = options.tx_amplitude
+ self._snr_dB = options.snr
+
+ self._noise_voltage = self.get_noise_voltage(self._snr_dB)
+
+ self.txpath = transmit_path(mod_class, options)
+ self.throttle = gr.throttle(gr.sizeof_gr_complex, self.sample_rate())
+ self.rxpath = receive_path(demod_class, rx_callback, options)
+
+ # FIXME: do better exposure to lower issues for control
+ self._timing_gain_alpha = self.rxpath.packet_receiver._demodulator._timing_alpha
+ self._timing_gain_beta = self.rxpath.packet_receiver._demodulator._timing_beta
+ self._freq_gain_alpha = self.rxpath.packet_receiver._demodulator._costas_alpha
+
+ if channelon:
+ self.channel = gr.channel_model(self._noise_voltage,
+ self.frequency_offset(),
+ self.timing_offset())
+
+ if options.discontinuous:
+ z = 20000*[0,]
+ self.zeros = gr.vector_source_c(z, True)
+ packet_size = 5*((4+8+4+1500+4) * 8)
+ self.mux = gr.stream_mux(gr.sizeof_gr_complex, [packet_size-0, int(9e5)])
+
+ # Connect components
+ self.connect(self.txpath, self.throttle, (self.mux,0))
+ self.connect(self.zeros, (self.mux,1))
+ self.connect(self.mux, self.channel, self.rxpath)
+
+ else:
+ self.connect(self.txpath, self.throttle, self.channel, self.rxpath)
+
+ if self.gui_on:
+ self.qapp = QtGui.QApplication(sys.argv)
+ fftsize = 2048
+
+ self.snk_tx = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS,
+ 0, 1,
+ "Tx", True, True, False, True, True)
+ self.snk_rx = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS,
+ 0, 1,
+ "Rx", True, True, False, True, True)
+
+ self.snk_tx.set_frequency_axis(-80, 0)
+ self.snk_rx.set_frequency_axis(-60, 20)
+
+ # Connect to the QT sinks
+ # FIXME: make better exposure to receiver from rxpath
+ self.freq_recov = self.rxpath.packet_receiver._demodulator.clock_recov
+ self.time_recov = self.rxpath.packet_receiver._demodulator.time_recov
+ self.freq_recov.set_alpha(self._freq_gain_alpha)
+ self.freq_recov.set_beta(0.25*self._freq_gain_alpha*self._freq_gain_alpha)
+ self.time_recov.set_alpha(self._timing_gain_alpha)
+ self.time_recov.set_beta(self._timing_gain_beta)
+ self.connect(self.channel, self.snk_tx)
+ self.connect(self.time_recov, self.snk_rx)
+
+ pyTxQt = self.snk_tx.pyqwidget()
+ pyTx = sip.wrapinstance(pyTxQt, QtGui.QWidget)
+
+ pyRxQt = self.snk_rx.pyqwidget()
+ pyRx = sip.wrapinstance(pyRxQt, QtGui.QWidget)
+
+ self.main_box = dialog_box(pyTx, pyRx, self)
+ self.main_box.show()
+
+ else:
+ # Connect components
+ self.connect(self.txpath, self.throttle, self.rxpath)
+
+
+
+ # System Parameters
+ def sample_rate(self):
+ return self._sample_rate
+
+ def set_sample_rate(self, sr):
+ self._sample_rate = sr
+ #self.throttle.set_samples_per_second(self._sample_rate)
+
+ # Channel Model Parameters
+ def snr(self):
+ return self._snr_dB
+
+ def set_snr(self, snr):
+ self._snr_dB = snr
+ self._noise_voltage = self.get_noise_voltage(self._snr_dB)
+ self.channel.set_noise_voltage(self._noise_voltage)
+
+ def get_noise_voltage(self, SNR):
+ snr = 10.0**(SNR/10.0)
+ power_in_signal = abs(self._tx_amplitude)**2
+ noise_power = power_in_signal/snr
+ noise_voltage = math.sqrt(noise_power)
+ return noise_voltage
+
+ def frequency_offset(self):
+ return self._frequency_offset * self.sample_rate()
+
+ def set_frequency_offset(self, fo):
+ self._frequency_offset = fo / self.sample_rate()
+ self.channel.set_frequency_offset(self._frequency_offset)
+
+ def timing_offset(self):
+ return self._timing_offset
+
+ def set_timing_offset(self, to):
+ self._timing_offset = to
+ self.channel.set_timing_offset(self._timing_offset)
+
+
+ # Receiver Parameters
+ def rx_timing_gain_alpha(self):
+ return self._timing_gain_alpha
+
+ def rx_timing_gain_beta(self):
+ return self._timing_gain_beta
+
+ def set_rx_timing_gain_alpha(self, gain):
+ self._timing_gain_alpha = gain
+ self.time_recov.set_alpha(self._timing_gain_alpha)
+
+ def set_rx_timing_gain_beta(self, gain):
+ self._timing_gain_beta = gain
+ self.time_recov.set_beta(self._timing_gain_beta)
+
+ def rx_freq_gain_alpha(self):
+ return self._freq_gain_alpha
+
+ def rx_freq_gain_beta(self):
+ return self._freq_gain_beta
+
+ def set_rx_freq_gain_alpha(self, alpha):
+ self._freq_gain_alpha = alpha
+ self._freq_gain_beta = .25 * self._freq_gain_alpha * self._freq_gain_alpha
+ self.freq_recov.set_alpha(self._freq_gain_alpha)
+ self.freq_recov.set_beta(self._freq_gain_beta)
+
+
+
+# /////////////////////////////////////////////////////////////////////////////
+# Thread to handle the packet sending procedure
+# Operates in parallel with qApp.exec_()
+# /////////////////////////////////////////////////////////////////////////////
+
+
+
+class th_send(Thread):
+ def __init__(self, send_fnc, megs, sz):
+ Thread.__init__(self)
+ self.send = send_fnc
+ self.nbytes = int(1e6 * megs)
+ self.pkt_size = int(sz)
+
+ def run(self):
+ # generate and send packets
+ n = 0
+ pktno = 0
+
+ while n < self.nbytes:
+ self.send(struct.pack('!H', pktno & 0xffff) +
+ (self.pkt_size - 2) * chr(pktno & 0xff))
+ n += self.pkt_size
+ pktno += 1
+
+ self.send(eof=True)
+
+ def stop(self):
+ self.nbytes = 0
+
+
+
+# /////////////////////////////////////////////////////////////////////////////
+# main
+# /////////////////////////////////////////////////////////////////////////////
+
+
+
+def main():
+
+ global n_rcvd, n_right, pktno
+
+ n_rcvd = 0
+ n_right = 0
+ pktno = 0
+
+ def rx_callback(ok, payload):
+ global n_rcvd, n_right, pktno
+ (pktno,) = struct.unpack('!H', payload[0:2])
+ n_rcvd += 1
+ if ok:
+ n_right += 1
+
+ if not options.gui:
+ print "ok = %5s pktno = %4d n_rcvd = %4d n_right = %4d" % (
+ ok, pktno, n_rcvd, n_right)
+
+
+ def send_pkt(payload='', eof=False):
+ return tb.txpath.send_pkt(payload, eof)
+
+ mods = modulation_utils.type_1_mods()
+ demods = modulation_utils.type_1_demods()
+
+ parser = OptionParser(option_class=eng_option, conflict_handler="resolve")
+ expert_grp = parser.add_option_group("Expert")
+ channel_grp = parser.add_option_group("Channel")
+
+ parser.add_option("-m", "--modulation", type="choice", choices=mods.keys(),
+ default='dbpsk',
+ help="Select modulation from: %s [default=%%default]"
+ % (', '.join(mods.keys()),))
+
+ parser.add_option("-s", "--size", type="eng_float", default=1500,
+ help="set packet size [default=%default]")
+ parser.add_option("-M", "--megabytes", type="eng_float", default=1.0,
+ help="set megabytes to transmit [default=%default]")
+ parser.add_option("","--discontinuous", action="store_true", default=False,
+ help="enable discontinous transmission (bursts of 5 packets)")
+ parser.add_option("-G", "--gui", action="store_true", default=False,
+ help="Turn on the GUI [default=%default]")
+
+ channel_grp.add_option("", "--sample-rate", type="eng_float", default=1e5,
+ help="set speed of channel/simulation rate to RATE [default=%default]")
+ channel_grp.add_option("", "--snr", type="eng_float", default=30,
+ help="set the SNR of the channel in dB [default=%default]")
+ channel_grp.add_option("", "--frequency-offset", type="eng_float", default=0,
+ help="set frequency offset introduced by channel [default=%default]")
+ channel_grp.add_option("", "--timing-offset", type="eng_float", default=1.0,
+ help="set timing offset introduced by channel [default=%default]")
+ channel_grp.add_option("", "--seed", action="store_true", default=False,
+ help="use a random seed for AWGN noise [default=%default]")
+
+ transmit_path.add_options(parser, expert_grp)
+ receive_path.add_options(parser, expert_grp)
+
+ for mod in mods.values():
+ mod.add_options(expert_grp)
+ for demod in demods.values():
+ demod.add_options(expert_grp)
+
+ (options, args) = parser.parse_args ()
+
+ if len(args) != 0:
+ parser.print_help()
+ sys.exit(1)
+
+ r = gr.enable_realtime_scheduling()
+ if r != gr.RT_OK:
+ print "Warning: failed to enable realtime scheduling"
+
+ # Create an instance of a hierarchical block
+ tb = my_top_block(mods[options.modulation],
+ demods[options.modulation],
+ rx_callback, options)
+ tb.start()
+
+ packet_sender = th_send(send_pkt, options.megabytes, options.size)
+ packet_sender.start()
+
+ if(options.gui):
+ tb.qapp.exec_()
+ packet_sender.stop()
+ else:
+ # Process until done; hack in to the join to stop on an interrupt
+ while(packet_sender.isAlive()):
+ try:
+ packet_sender.join(1)
+ except KeyboardInterrupt:
+ packet_sender.stop()
+
+
+if __name__ == '__main__':
+ try:
+ main()
+ except KeyboardInterrupt:
+ pass
diff --git a/gnuradio-examples/python/digital/qt_digital_window.py b/gnuradio-examples/python/digital/qt_digital_window.py
index e3feb57c93..6e0f25212e 100644
--- a/gnuradio-examples/python/digital/qt_digital_window.py
+++ b/gnuradio-examples/python/digital/qt_digital_window.py
@@ -2,8 +2,8 @@
# Form implementation generated from reading ui file 'qt_digital_window.ui'
#
-# Created: Fri Jul 3 10:03:54 2009
-# by: PyQt4 UI code generator 4.4.3
+# Created: Tue Oct 6 11:27:37 2009
+# by: PyQt4 UI code generator 4.4.4
#
# WARNING! All changes made in this file will be lost!
@@ -12,53 +12,63 @@ from PyQt4 import QtCore, QtGui
class Ui_DigitalWindow(object):
def setupUi(self, DigitalWindow):
DigitalWindow.setObjectName("DigitalWindow")
- DigitalWindow.resize(1050, 752)
+ DigitalWindow.resize(1019, 754)
self.centralwidget = QtGui.QWidget(DigitalWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtGui.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
- self.verticalLayout_2 = QtGui.QVBoxLayout()
- self.verticalLayout_2.setObjectName("verticalLayout_2")
- self.sysBox = QtGui.QGroupBox(self.centralwidget)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.sysBox.sizePolicy().hasHeightForWidth())
- self.sysBox.setSizePolicy(sizePolicy)
- self.sysBox.setMinimumSize(QtCore.QSize(240, 60))
- self.sysBox.setMaximumSize(QtCore.QSize(240, 16777215))
- self.sysBox.setObjectName("sysBox")
- self.formLayoutWidget = QtGui.QWidget(self.sysBox)
- self.formLayoutWidget.setGeometry(QtCore.QRect(10, 20, 221, 31))
- self.formLayoutWidget.setObjectName("formLayoutWidget")
- self.formLayout = QtGui.QFormLayout(self.formLayoutWidget)
- self.formLayout.setSizeConstraint(QtGui.QLayout.SetFixedSize)
- self.formLayout.setVerticalSpacing(20)
- self.formLayout.setObjectName("formLayout")
- self.sampleRateEdit = QtGui.QLineEdit(self.formLayoutWidget)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.sampleRateEdit.sizePolicy().hasHeightForWidth())
- self.sampleRateEdit.setSizePolicy(sizePolicy)
- self.sampleRateEdit.setMinimumSize(QtCore.QSize(100, 26))
- self.sampleRateEdit.setMaximumSize(QtCore.QSize(100, 26))
- self.sampleRateEdit.setObjectName("sampleRateEdit")
- self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.sampleRateEdit)
- self.sampleRateLabel = QtGui.QLabel(self.formLayoutWidget)
+ self.verticalLayout_3 = QtGui.QVBoxLayout()
+ self.verticalLayout_3.setObjectName("verticalLayout_3")
+ self.rxBox = QtGui.QGroupBox(self.centralwidget)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.sampleRateLabel.sizePolicy().hasHeightForWidth())
- self.sampleRateLabel.setSizePolicy(sizePolicy)
- self.sampleRateLabel.setMinimumSize(QtCore.QSize(0, 20))
- self.sampleRateLabel.setMaximumSize(QtCore.QSize(16777215, 20))
- self.sampleRateLabel.setObjectName("sampleRateLabel")
- self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.sampleRateLabel)
- self.verticalLayout_2.addWidget(self.sysBox)
- spacerItem = QtGui.QSpacerItem(20, 60, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
- self.verticalLayout_2.addItem(spacerItem)
- self.gridLayout.addLayout(self.verticalLayout_2, 2, 0, 1, 1)
+ sizePolicy.setHeightForWidth(self.rxBox.sizePolicy().hasHeightForWidth())
+ self.rxBox.setSizePolicy(sizePolicy)
+ self.rxBox.setMinimumSize(QtCore.QSize(180, 90))
+ self.rxBox.setMaximumSize(QtCore.QSize(180, 16777215))
+ self.rxBox.setObjectName("rxBox")
+ self.formLayoutWidget_3 = QtGui.QWidget(self.rxBox)
+ self.formLayoutWidget_3.setGeometry(QtCore.QRect(10, 20, 141, 61))
+ self.formLayoutWidget_3.setObjectName("formLayoutWidget_3")
+ self.formLayout_3 = QtGui.QFormLayout(self.formLayoutWidget_3)
+ self.formLayout_3.setSizeConstraint(QtGui.QLayout.SetFixedSize)
+ self.formLayout_3.setObjectName("formLayout_3")
+ self.gainMuLabel = QtGui.QLabel(self.formLayoutWidget_3)
+ self.gainMuLabel.setObjectName("gainMuLabel")
+ self.formLayout_3.setWidget(0, QtGui.QFormLayout.LabelRole, self.gainMuLabel)
+ self.alphaLabel = QtGui.QLabel(self.formLayoutWidget_3)
+ self.alphaLabel.setObjectName("alphaLabel")
+ self.formLayout_3.setWidget(1, QtGui.QFormLayout.LabelRole, self.alphaLabel)
+ self.gainMuEdit = QtGui.QLineEdit(self.formLayoutWidget_3)
+ self.gainMuEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.gainMuEdit.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.gainMuEdit.setObjectName("gainMuEdit")
+ self.formLayout_3.setWidget(0, QtGui.QFormLayout.FieldRole, self.gainMuEdit)
+ self.alphaEdit = QtGui.QLineEdit(self.formLayoutWidget_3)
+ self.alphaEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.alphaEdit.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.alphaEdit.setObjectName("alphaEdit")
+ self.formLayout_3.setWidget(1, QtGui.QFormLayout.FieldRole, self.alphaEdit)
+ self.verticalLayout_3.addWidget(self.rxBox)
+ spacerItem = QtGui.QSpacerItem(20, 30, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
+ self.verticalLayout_3.addItem(spacerItem)
+ self.gridLayout.addLayout(self.verticalLayout_3, 2, 2, 1, 1)
+ self.verticalLayout = QtGui.QVBoxLayout()
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.pauseButton = QtGui.QPushButton(self.centralwidget)
+ self.pauseButton.setMinimumSize(QtCore.QSize(80, 0))
+ self.pauseButton.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.pauseButton.setObjectName("pauseButton")
+ self.verticalLayout.addWidget(self.pauseButton)
+ spacerItem1 = QtGui.QSpacerItem(20, 60, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
+ self.verticalLayout.addItem(spacerItem1)
+ self.closeButton = QtGui.QPushButton(self.centralwidget)
+ self.closeButton.setMinimumSize(QtCore.QSize(80, 0))
+ self.closeButton.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.closeButton.setObjectName("closeButton")
+ self.verticalLayout.addWidget(self.closeButton)
+ self.gridLayout.addLayout(self.verticalLayout, 2, 5, 1, 1)
self.channelModeBox = QtGui.QGroupBox(self.centralwidget)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
@@ -69,7 +79,7 @@ class Ui_DigitalWindow(object):
self.channelModeBox.setMaximumSize(QtCore.QSize(245, 16777215))
self.channelModeBox.setObjectName("channelModeBox")
self.formLayoutWidget_2 = QtGui.QWidget(self.channelModeBox)
- self.formLayoutWidget_2.setGeometry(QtCore.QRect(10, 20, 231, 98))
+ self.formLayoutWidget_2.setGeometry(QtCore.QRect(10, 20, 221, 98))
self.formLayoutWidget_2.setObjectName("formLayoutWidget_2")
self.formLayout_2 = QtGui.QFormLayout(self.formLayoutWidget_2)
self.formLayout_2.setSizeConstraint(QtGui.QLayout.SetFixedSize)
@@ -79,83 +89,69 @@ class Ui_DigitalWindow(object):
self.snrLabel.setObjectName("snrLabel")
self.formLayout_2.setWidget(0, QtGui.QFormLayout.LabelRole, self.snrLabel)
self.snrEdit = QtGui.QLineEdit(self.formLayoutWidget_2)
- self.snrEdit.setMinimumSize(QtCore.QSize(100, 0))
- self.snrEdit.setMaximumSize(QtCore.QSize(100, 16777215))
+ self.snrEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.snrEdit.setMaximumSize(QtCore.QSize(80, 16777215))
self.snrEdit.setObjectName("snrEdit")
self.formLayout_2.setWidget(0, QtGui.QFormLayout.FieldRole, self.snrEdit)
self.freqLabel = QtGui.QLabel(self.formLayoutWidget_2)
self.freqLabel.setObjectName("freqLabel")
self.formLayout_2.setWidget(1, QtGui.QFormLayout.LabelRole, self.freqLabel)
self.freqEdit = QtGui.QLineEdit(self.formLayoutWidget_2)
- self.freqEdit.setMinimumSize(QtCore.QSize(100, 0))
- self.freqEdit.setMaximumSize(QtCore.QSize(100, 16777215))
+ self.freqEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.freqEdit.setMaximumSize(QtCore.QSize(80, 16777215))
self.freqEdit.setObjectName("freqEdit")
self.formLayout_2.setWidget(1, QtGui.QFormLayout.FieldRole, self.freqEdit)
self.timeLabel = QtGui.QLabel(self.formLayoutWidget_2)
self.timeLabel.setObjectName("timeLabel")
self.formLayout_2.setWidget(2, QtGui.QFormLayout.LabelRole, self.timeLabel)
self.timeEdit = QtGui.QLineEdit(self.formLayoutWidget_2)
- self.timeEdit.setMinimumSize(QtCore.QSize(100, 0))
- self.timeEdit.setMaximumSize(QtCore.QSize(100, 16777215))
+ self.timeEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.timeEdit.setMaximumSize(QtCore.QSize(80, 16777215))
self.timeEdit.setObjectName("timeEdit")
self.formLayout_2.setWidget(2, QtGui.QFormLayout.FieldRole, self.timeEdit)
self.gridLayout.addWidget(self.channelModeBox, 2, 1, 1, 1)
- self.verticalLayout_5 = QtGui.QVBoxLayout()
- self.verticalLayout_5.setObjectName("verticalLayout_5")
- self.sinkFrame = QtGui.QFrame(self.centralwidget)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_2 = QtGui.QVBoxLayout()
+ self.verticalLayout_2.setObjectName("verticalLayout_2")
+ self.sysBox = QtGui.QGroupBox(self.centralwidget)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.sinkFrame.sizePolicy().hasHeightForWidth())
- self.sinkFrame.setSizePolicy(sizePolicy)
- self.sinkFrame.setMinimumSize(QtCore.QSize(1000, 550))
- self.sinkFrame.setFrameShape(QtGui.QFrame.StyledPanel)
- self.sinkFrame.setFrameShadow(QtGui.QFrame.Raised)
- self.sinkFrame.setObjectName("sinkFrame")
- self.gridLayout_2 = QtGui.QGridLayout(self.sinkFrame)
- self.gridLayout_2.setObjectName("gridLayout_2")
- self.sinkLayout = QtGui.QHBoxLayout()
- self.sinkLayout.setObjectName("sinkLayout")
- self.gridLayout_2.addLayout(self.sinkLayout, 1, 0, 1, 1)
- self.verticalLayout_5.addWidget(self.sinkFrame)
- self.gridLayout.addLayout(self.verticalLayout_5, 0, 0, 1, 6)
- self.verticalLayout_3 = QtGui.QVBoxLayout()
- self.verticalLayout_3.setObjectName("verticalLayout_3")
- self.rxBox = QtGui.QGroupBox(self.centralwidget)
+ sizePolicy.setHeightForWidth(self.sysBox.sizePolicy().hasHeightForWidth())
+ self.sysBox.setSizePolicy(sizePolicy)
+ self.sysBox.setMinimumSize(QtCore.QSize(240, 60))
+ self.sysBox.setMaximumSize(QtCore.QSize(240, 16777215))
+ self.sysBox.setObjectName("sysBox")
+ self.formLayoutWidget = QtGui.QWidget(self.sysBox)
+ self.formLayoutWidget.setGeometry(QtCore.QRect(10, 20, 211, 31))
+ self.formLayoutWidget.setObjectName("formLayoutWidget")
+ self.formLayout = QtGui.QFormLayout(self.formLayoutWidget)
+ self.formLayout.setSizeConstraint(QtGui.QLayout.SetFixedSize)
+ self.formLayout.setVerticalSpacing(20)
+ self.formLayout.setObjectName("formLayout")
+ self.sampleRateEdit = QtGui.QLineEdit(self.formLayoutWidget)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.rxBox.sizePolicy().hasHeightForWidth())
- self.rxBox.setSizePolicy(sizePolicy)
- self.rxBox.setMinimumSize(QtCore.QSize(180, 90))
- self.rxBox.setMaximumSize(QtCore.QSize(180, 16777215))
- self.rxBox.setObjectName("rxBox")
- self.formLayoutWidget_3 = QtGui.QWidget(self.rxBox)
- self.formLayoutWidget_3.setGeometry(QtCore.QRect(10, 20, 161, 61))
- self.formLayoutWidget_3.setObjectName("formLayoutWidget_3")
- self.formLayout_3 = QtGui.QFormLayout(self.formLayoutWidget_3)
- self.formLayout_3.setSizeConstraint(QtGui.QLayout.SetFixedSize)
- self.formLayout_3.setObjectName("formLayout_3")
- self.gainMuLabel = QtGui.QLabel(self.formLayoutWidget_3)
- self.gainMuLabel.setObjectName("gainMuLabel")
- self.formLayout_3.setWidget(0, QtGui.QFormLayout.LabelRole, self.gainMuLabel)
- self.alphaLabel = QtGui.QLabel(self.formLayoutWidget_3)
- self.alphaLabel.setObjectName("alphaLabel")
- self.formLayout_3.setWidget(1, QtGui.QFormLayout.LabelRole, self.alphaLabel)
- self.gainMuEdit = QtGui.QLineEdit(self.formLayoutWidget_3)
- self.gainMuEdit.setMinimumSize(QtCore.QSize(100, 0))
- self.gainMuEdit.setMaximumSize(QtCore.QSize(100, 16777215))
- self.gainMuEdit.setObjectName("gainMuEdit")
- self.formLayout_3.setWidget(0, QtGui.QFormLayout.FieldRole, self.gainMuEdit)
- self.alphaEdit = QtGui.QLineEdit(self.formLayoutWidget_3)
- self.alphaEdit.setMinimumSize(QtCore.QSize(100, 0))
- self.alphaEdit.setMaximumSize(QtCore.QSize(100, 16777215))
- self.alphaEdit.setObjectName("alphaEdit")
- self.formLayout_3.setWidget(1, QtGui.QFormLayout.FieldRole, self.alphaEdit)
- self.verticalLayout_3.addWidget(self.rxBox)
- spacerItem1 = QtGui.QSpacerItem(20, 30, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
- self.verticalLayout_3.addItem(spacerItem1)
- self.gridLayout.addLayout(self.verticalLayout_3, 2, 2, 1, 1)
+ sizePolicy.setHeightForWidth(self.sampleRateEdit.sizePolicy().hasHeightForWidth())
+ self.sampleRateEdit.setSizePolicy(sizePolicy)
+ self.sampleRateEdit.setMinimumSize(QtCore.QSize(60, 26))
+ self.sampleRateEdit.setMaximumSize(QtCore.QSize(80, 26))
+ self.sampleRateEdit.setObjectName("sampleRateEdit")
+ self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.sampleRateEdit)
+ self.sampleRateLabel = QtGui.QLabel(self.formLayoutWidget)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.sampleRateLabel.sizePolicy().hasHeightForWidth())
+ self.sampleRateLabel.setSizePolicy(sizePolicy)
+ self.sampleRateLabel.setMinimumSize(QtCore.QSize(0, 20))
+ self.sampleRateLabel.setMaximumSize(QtCore.QSize(16777215, 20))
+ self.sampleRateLabel.setObjectName("sampleRateLabel")
+ self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.sampleRateLabel)
+ self.verticalLayout_2.addWidget(self.sysBox)
+ spacerItem2 = QtGui.QSpacerItem(20, 60, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
+ self.verticalLayout_2.addItem(spacerItem2)
+ self.gridLayout.addLayout(self.verticalLayout_2, 2, 0, 1, 1)
self.rxBox_2 = QtGui.QGroupBox(self.centralwidget)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
@@ -166,7 +162,7 @@ class Ui_DigitalWindow(object):
self.rxBox_2.setMaximumSize(QtCore.QSize(265, 125))
self.rxBox_2.setObjectName("rxBox_2")
self.formLayoutWidget_4 = QtGui.QWidget(self.rxBox_2)
- self.formLayoutWidget_4.setGeometry(QtCore.QRect(10, 20, 201, 92))
+ self.formLayoutWidget_4.setGeometry(QtCore.QRect(10, 20, 181, 92))
self.formLayoutWidget_4.setObjectName("formLayoutWidget_4")
self.formLayout_4 = QtGui.QFormLayout(self.formLayoutWidget_4)
self.formLayout_4.setSizeConstraint(QtGui.QLayout.SetFixedSize)
@@ -181,41 +177,45 @@ class Ui_DigitalWindow(object):
self.perLabel.setObjectName("perLabel")
self.formLayout_4.setWidget(2, QtGui.QFormLayout.LabelRole, self.perLabel)
self.pktsRcvdEdit = QtGui.QLineEdit(self.formLayoutWidget_4)
- self.pktsRcvdEdit.setMinimumSize(QtCore.QSize(100, 0))
- self.pktsRcvdEdit.setMaximumSize(QtCore.QSize(100, 16777215))
+ self.pktsRcvdEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.pktsRcvdEdit.setMaximumSize(QtCore.QSize(80, 16777215))
self.pktsRcvdEdit.setObjectName("pktsRcvdEdit")
self.formLayout_4.setWidget(0, QtGui.QFormLayout.FieldRole, self.pktsRcvdEdit)
self.pktsCorrectEdit = QtGui.QLineEdit(self.formLayoutWidget_4)
- self.pktsCorrectEdit.setMinimumSize(QtCore.QSize(100, 0))
- self.pktsCorrectEdit.setMaximumSize(QtCore.QSize(100, 16777215))
+ self.pktsCorrectEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.pktsCorrectEdit.setMaximumSize(QtCore.QSize(80, 16777215))
self.pktsCorrectEdit.setObjectName("pktsCorrectEdit")
self.formLayout_4.setWidget(1, QtGui.QFormLayout.FieldRole, self.pktsCorrectEdit)
self.perEdit = QtGui.QLineEdit(self.formLayoutWidget_4)
- self.perEdit.setMinimumSize(QtCore.QSize(100, 0))
- self.perEdit.setMaximumSize(QtCore.QSize(100, 16777215))
+ self.perEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.perEdit.setMaximumSize(QtCore.QSize(80, 16777215))
self.perEdit.setObjectName("perEdit")
self.formLayout_4.setWidget(2, QtGui.QFormLayout.FieldRole, self.perEdit)
self.gridLayout.addWidget(self.rxBox_2, 2, 3, 1, 1)
- spacerItem2 = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
- self.gridLayout.addItem(spacerItem2, 2, 4, 1, 1)
- self.verticalLayout = QtGui.QVBoxLayout()
- self.verticalLayout.setObjectName("verticalLayout")
- self.pauseButton = QtGui.QPushButton(self.centralwidget)
- self.pauseButton.setMinimumSize(QtCore.QSize(80, 0))
- self.pauseButton.setMaximumSize(QtCore.QSize(80, 16777215))
- self.pauseButton.setObjectName("pauseButton")
- self.verticalLayout.addWidget(self.pauseButton)
- spacerItem3 = QtGui.QSpacerItem(20, 60, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
- self.verticalLayout.addItem(spacerItem3)
- self.closeButton = QtGui.QPushButton(self.centralwidget)
- self.closeButton.setMinimumSize(QtCore.QSize(80, 0))
- self.closeButton.setMaximumSize(QtCore.QSize(80, 16777215))
- self.closeButton.setObjectName("closeButton")
- self.verticalLayout.addWidget(self.closeButton)
- self.gridLayout.addLayout(self.verticalLayout, 2, 5, 1, 1)
+ spacerItem3 = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridLayout.addItem(spacerItem3, 2, 4, 1, 1)
+ self.verticalLayout_5 = QtGui.QVBoxLayout()
+ self.verticalLayout_5.setObjectName("verticalLayout_5")
+ self.sinkFrame = QtGui.QFrame(self.centralwidget)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.sinkFrame.sizePolicy().hasHeightForWidth())
+ self.sinkFrame.setSizePolicy(sizePolicy)
+ self.sinkFrame.setMinimumSize(QtCore.QSize(500, 550))
+ self.sinkFrame.setFrameShape(QtGui.QFrame.StyledPanel)
+ self.sinkFrame.setFrameShadow(QtGui.QFrame.Raised)
+ self.sinkFrame.setObjectName("sinkFrame")
+ self.gridLayout_2 = QtGui.QGridLayout(self.sinkFrame)
+ self.gridLayout_2.setObjectName("gridLayout_2")
+ self.sinkLayout = QtGui.QHBoxLayout()
+ self.sinkLayout.setObjectName("sinkLayout")
+ self.gridLayout_2.addLayout(self.sinkLayout, 1, 0, 1, 1)
+ self.verticalLayout_5.addWidget(self.sinkFrame)
+ self.gridLayout.addLayout(self.verticalLayout_5, 0, 0, 1, 6)
DigitalWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(DigitalWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1050, 24))
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1019, 25))
self.menubar.setObjectName("menubar")
self.menuFile = QtGui.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile")
@@ -237,21 +237,21 @@ class Ui_DigitalWindow(object):
def retranslateUi(self, DigitalWindow):
DigitalWindow.setWindowTitle(QtGui.QApplication.translate("DigitalWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
- self.sysBox.setTitle(QtGui.QApplication.translate("DigitalWindow", "System Parameters", None, QtGui.QApplication.UnicodeUTF8))
- self.sampleRateLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Sample Rate (sps)", None, QtGui.QApplication.UnicodeUTF8))
+ self.rxBox.setTitle(QtGui.QApplication.translate("DigitalWindow", "Receiver Parameters", None, QtGui.QApplication.UnicodeUTF8))
+ self.gainMuLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Gain mu", None, QtGui.QApplication.UnicodeUTF8))
+ self.alphaLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Alpha", None, QtGui.QApplication.UnicodeUTF8))
+ self.pauseButton.setText(QtGui.QApplication.translate("DigitalWindow", "Pause", None, QtGui.QApplication.UnicodeUTF8))
+ self.closeButton.setText(QtGui.QApplication.translate("DigitalWindow", "Close", None, QtGui.QApplication.UnicodeUTF8))
self.channelModeBox.setTitle(QtGui.QApplication.translate("DigitalWindow", "Channel Model Parameters", None, QtGui.QApplication.UnicodeUTF8))
self.snrLabel.setText(QtGui.QApplication.translate("DigitalWindow", "SNR (dB)", None, QtGui.QApplication.UnicodeUTF8))
self.freqLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Frequency Offset (Hz)", None, QtGui.QApplication.UnicodeUTF8))
self.timeLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Timing Offset", None, QtGui.QApplication.UnicodeUTF8))
- self.rxBox.setTitle(QtGui.QApplication.translate("DigitalWindow", "Receiver Parameters", None, QtGui.QApplication.UnicodeUTF8))
- self.gainMuLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Gain mu", None, QtGui.QApplication.UnicodeUTF8))
- self.alphaLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Alpha", None, QtGui.QApplication.UnicodeUTF8))
+ self.sysBox.setTitle(QtGui.QApplication.translate("DigitalWindow", "System Parameters", None, QtGui.QApplication.UnicodeUTF8))
+ self.sampleRateLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Sample Rate (sps)", None, QtGui.QApplication.UnicodeUTF8))
self.rxBox_2.setTitle(QtGui.QApplication.translate("DigitalWindow", "Received Packet Info", None, QtGui.QApplication.UnicodeUTF8))
self.pktsRcvdLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Packets Rcvd.", None, QtGui.QApplication.UnicodeUTF8))
self.pktsCorrectLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Packets Correct", None, QtGui.QApplication.UnicodeUTF8))
self.perLabel.setText(QtGui.QApplication.translate("DigitalWindow", "PER", None, QtGui.QApplication.UnicodeUTF8))
- self.pauseButton.setText(QtGui.QApplication.translate("DigitalWindow", "Pause", None, QtGui.QApplication.UnicodeUTF8))
- self.closeButton.setText(QtGui.QApplication.translate("DigitalWindow", "Close", None, QtGui.QApplication.UnicodeUTF8))
self.menuFile.setTitle(QtGui.QApplication.translate("DigitalWindow", "&File", None, QtGui.QApplication.UnicodeUTF8))
self.actionExit.setText(QtGui.QApplication.translate("DigitalWindow", "E&xit", None, QtGui.QApplication.UnicodeUTF8))
diff --git a/gnuradio-examples/python/digital/qt_digital_window.ui b/gnuradio-examples/python/digital/qt_digital_window.ui
index 413801ec71..a0af196edc 100644
--- a/gnuradio-examples/python/digital/qt_digital_window.ui
+++ b/gnuradio-examples/python/digital/qt_digital_window.ui
@@ -1,105 +1,102 @@
-<ui version="4.0" >
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
<class>DigitalWindow</class>
- <widget class="QMainWindow" name="DigitalWindow" >
- <property name="geometry" >
+ <widget class="QMainWindow" name="DigitalWindow">
+ <property name="geometry">
<rect>
<x>0</x>
<y>0</y>
- <width>1050</width>
- <height>752</height>
+ <width>1019</width>
+ <height>754</height>
</rect>
</property>
- <property name="windowTitle" >
+ <property name="windowTitle">
<string>MainWindow</string>
</property>
- <widget class="QWidget" name="centralwidget" >
- <layout class="QGridLayout" name="gridLayout" >
- <item row="2" column="0" >
- <layout class="QVBoxLayout" name="verticalLayout_2" >
+ <widget class="QWidget" name="centralwidget">
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="2" column="2">
+ <layout class="QVBoxLayout" name="verticalLayout_3">
<item>
- <widget class="QGroupBox" name="sysBox" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <widget class="QGroupBox" name="rxBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="minimumSize" >
+ <property name="minimumSize">
<size>
- <width>240</width>
- <height>60</height>
+ <width>180</width>
+ <height>90</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
- <width>240</width>
+ <width>180</width>
<height>16777215</height>
</size>
</property>
- <property name="title" >
- <string>System Parameters</string>
+ <property name="title">
+ <string>Receiver Parameters</string>
</property>
- <widget class="QWidget" name="formLayoutWidget" >
- <property name="geometry" >
+ <widget class="QWidget" name="formLayoutWidget_3">
+ <property name="geometry">
<rect>
<x>10</x>
<y>20</y>
- <width>221</width>
- <height>31</height>
+ <width>141</width>
+ <height>61</height>
</rect>
</property>
- <layout class="QFormLayout" name="formLayout" >
- <property name="sizeConstraint" >
+ <layout class="QFormLayout" name="formLayout_3">
+ <property name="sizeConstraint">
<enum>QLayout::SetFixedSize</enum>
</property>
- <property name="verticalSpacing" >
- <number>20</number>
- </property>
- <item row="0" column="1" >
- <widget class="QLineEdit" name="sampleRateEdit" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
+ <item row="0" column="0">
+ <widget class="QLabel" name="gainMuLabel">
+ <property name="text">
+ <string>Gain mu</string>
</property>
- <property name="minimumSize" >
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="alphaLabel">
+ <property name="text">
+ <string>Alpha</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="gainMuEdit">
+ <property name="minimumSize">
<size>
- <width>100</width>
- <height>26</height>
+ <width>60</width>
+ <height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
- <width>100</width>
- <height>26</height>
+ <width>80</width>
+ <height>16777215</height>
</size>
</property>
</widget>
</item>
- <item row="0" column="0" >
- <widget class="QLabel" name="sampleRateLabel" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize" >
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="alphaEdit">
+ <property name="minimumSize">
<size>
- <width>0</width>
- <height>20</height>
+ <width>60</width>
+ <height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
- <width>16777215</width>
- <height>20</height>
+ <width>80</width>
+ <height>16777215</height>
</size>
</property>
- <property name="text" >
- <string>Sample Rate (sps)</string>
- </property>
</widget>
</item>
</layout>
@@ -107,14 +104,53 @@
</widget>
</item>
<item>
- <spacer name="verticalSpacer_2" >
- <property name="orientation" >
+ <spacer name="verticalSpacer_4">
+ <property name="orientation">
<enum>Qt::Vertical</enum>
</property>
- <property name="sizeType" >
+ <property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
- <property name="sizeHint" stdset="0" >
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="5">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QPushButton" name="pauseButton">
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Pause</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>60</height>
@@ -122,111 +158,130 @@
</property>
</spacer>
</item>
+ <item>
+ <widget class="QPushButton" name="closeButton">
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
</layout>
</item>
- <item row="2" column="1" >
- <widget class="QGroupBox" name="channelModeBox" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <item row="2" column="1">
+ <widget class="QGroupBox" name="channelModeBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="minimumSize" >
+ <property name="minimumSize">
<size>
<width>245</width>
<height>130</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
<width>245</width>
<height>16777215</height>
</size>
</property>
- <property name="title" >
+ <property name="title">
<string>Channel Model Parameters</string>
</property>
- <widget class="QWidget" name="formLayoutWidget_2" >
- <property name="geometry" >
+ <widget class="QWidget" name="formLayoutWidget_2">
+ <property name="geometry">
<rect>
<x>10</x>
<y>20</y>
- <width>231</width>
+ <width>221</width>
<height>98</height>
</rect>
</property>
- <layout class="QFormLayout" name="formLayout_2" >
- <property name="sizeConstraint" >
+ <layout class="QFormLayout" name="formLayout_2">
+ <property name="sizeConstraint">
<enum>QLayout::SetFixedSize</enum>
</property>
- <property name="fieldGrowthPolicy" >
+ <property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
- <item row="0" column="0" >
- <widget class="QLabel" name="snrLabel" >
- <property name="text" >
+ <item row="0" column="0">
+ <widget class="QLabel" name="snrLabel">
+ <property name="text">
<string>SNR (dB)</string>
</property>
</widget>
</item>
- <item row="0" column="1" >
- <widget class="QLineEdit" name="snrEdit" >
- <property name="minimumSize" >
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="snrEdit">
+ <property name="minimumSize">
<size>
- <width>100</width>
+ <width>60</width>
<height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
- <width>100</width>
+ <width>80</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
- <item row="1" column="0" >
- <widget class="QLabel" name="freqLabel" >
- <property name="text" >
+ <item row="1" column="0">
+ <widget class="QLabel" name="freqLabel">
+ <property name="text">
<string>Frequency Offset (Hz)</string>
</property>
</widget>
</item>
- <item row="1" column="1" >
- <widget class="QLineEdit" name="freqEdit" >
- <property name="minimumSize" >
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="freqEdit">
+ <property name="minimumSize">
<size>
- <width>100</width>
+ <width>60</width>
<height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
- <width>100</width>
+ <width>80</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
- <item row="2" column="0" >
- <widget class="QLabel" name="timeLabel" >
- <property name="text" >
+ <item row="2" column="0">
+ <widget class="QLabel" name="timeLabel">
+ <property name="text">
<string>Timing Offset</string>
</property>
</widget>
</item>
- <item row="2" column="1" >
- <widget class="QLineEdit" name="timeEdit" >
- <property name="minimumSize" >
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="timeEdit">
+ <property name="minimumSize">
<size>
- <width>100</width>
+ <width>60</width>
<height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
- <width>100</width>
+ <width>80</width>
<height>16777215</height>
</size>
</property>
@@ -236,121 +291,92 @@
</widget>
</widget>
</item>
- <item row="0" column="0" colspan="6" >
- <layout class="QVBoxLayout" name="verticalLayout_5" >
- <item>
- <widget class="QFrame" name="sinkFrame" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize" >
- <size>
- <width>1000</width>
- <height>550</height>
- </size>
- </property>
- <property name="frameShape" >
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow" >
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout_2" >
- <item row="1" column="0" >
- <layout class="QHBoxLayout" name="sinkLayout" />
- </item>
- </layout>
- <zorder>verticalLayoutWidget</zorder>
- <zorder>verticalLayoutWidget</zorder>
- </widget>
- </item>
- </layout>
- </item>
- <item row="2" column="2" >
- <layout class="QVBoxLayout" name="verticalLayout_3" >
+ <item row="2" column="0">
+ <layout class="QVBoxLayout" name="verticalLayout_2">
<item>
- <widget class="QGroupBox" name="rxBox" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <widget class="QGroupBox" name="sysBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="minimumSize" >
+ <property name="minimumSize">
<size>
- <width>180</width>
- <height>90</height>
+ <width>240</width>
+ <height>60</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
- <width>180</width>
+ <width>240</width>
<height>16777215</height>
</size>
</property>
- <property name="title" >
- <string>Receiver Parameters</string>
+ <property name="title">
+ <string>System Parameters</string>
</property>
- <widget class="QWidget" name="formLayoutWidget_3" >
- <property name="geometry" >
+ <widget class="QWidget" name="formLayoutWidget">
+ <property name="geometry">
<rect>
<x>10</x>
<y>20</y>
- <width>161</width>
- <height>61</height>
+ <width>211</width>
+ <height>31</height>
</rect>
</property>
- <layout class="QFormLayout" name="formLayout_3" >
- <property name="sizeConstraint" >
+ <layout class="QFormLayout" name="formLayout">
+ <property name="sizeConstraint">
<enum>QLayout::SetFixedSize</enum>
</property>
- <item row="0" column="0" >
- <widget class="QLabel" name="gainMuLabel" >
- <property name="text" >
- <string>Gain mu</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0" >
- <widget class="QLabel" name="alphaLabel" >
- <property name="text" >
- <string>Alpha</string>
+ <property name="verticalSpacing">
+ <number>20</number>
+ </property>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="sampleRateEdit">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QLineEdit" name="gainMuEdit" >
- <property name="minimumSize" >
+ <property name="minimumSize">
<size>
- <width>100</width>
- <height>0</height>
+ <width>60</width>
+ <height>26</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
- <width>100</width>
- <height>16777215</height>
+ <width>80</width>
+ <height>26</height>
</size>
</property>
</widget>
</item>
- <item row="1" column="1" >
- <widget class="QLineEdit" name="alphaEdit" >
- <property name="minimumSize" >
+ <item row="0" column="0">
+ <widget class="QLabel" name="sampleRateLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
<size>
- <width>100</width>
- <height>0</height>
+ <width>0</width>
+ <height>20</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
- <width>100</width>
- <height>16777215</height>
+ <width>16777215</width>
+ <height>20</height>
</size>
</property>
+ <property name="text">
+ <string>Sample Rate (sps)</string>
+ </property>
</widget>
</item>
</layout>
@@ -358,123 +384,123 @@
</widget>
</item>
<item>
- <spacer name="verticalSpacer_4" >
- <property name="orientation" >
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
<enum>Qt::Vertical</enum>
</property>
- <property name="sizeType" >
+ <property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
- <property name="sizeHint" stdset="0" >
+ <property name="sizeHint" stdset="0">
<size>
<width>20</width>
- <height>30</height>
+ <height>60</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
- <item row="2" column="3" >
- <widget class="QGroupBox" name="rxBox_2" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <item row="2" column="3">
+ <widget class="QGroupBox" name="rxBox_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="minimumSize" >
+ <property name="minimumSize">
<size>
<width>220</width>
<height>125</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
<width>265</width>
<height>125</height>
</size>
</property>
- <property name="title" >
+ <property name="title">
<string>Received Packet Info</string>
</property>
- <widget class="QWidget" name="formLayoutWidget_4" >
- <property name="geometry" >
+ <widget class="QWidget" name="formLayoutWidget_4">
+ <property name="geometry">
<rect>
<x>10</x>
<y>20</y>
- <width>201</width>
+ <width>181</width>
<height>92</height>
</rect>
</property>
- <layout class="QFormLayout" name="formLayout_4" >
- <property name="sizeConstraint" >
+ <layout class="QFormLayout" name="formLayout_4">
+ <property name="sizeConstraint">
<enum>QLayout::SetFixedSize</enum>
</property>
- <item row="0" column="0" >
- <widget class="QLabel" name="pktsRcvdLabel" >
- <property name="text" >
+ <item row="0" column="0">
+ <widget class="QLabel" name="pktsRcvdLabel">
+ <property name="text">
<string>Packets Rcvd.</string>
</property>
</widget>
</item>
- <item row="1" column="0" >
- <widget class="QLabel" name="pktsCorrectLabel" >
- <property name="text" >
+ <item row="1" column="0">
+ <widget class="QLabel" name="pktsCorrectLabel">
+ <property name="text">
<string>Packets Correct</string>
</property>
</widget>
</item>
- <item row="2" column="0" >
- <widget class="QLabel" name="perLabel" >
- <property name="text" >
+ <item row="2" column="0">
+ <widget class="QLabel" name="perLabel">
+ <property name="text">
<string>PER</string>
</property>
</widget>
</item>
- <item row="0" column="1" >
- <widget class="QLineEdit" name="pktsRcvdEdit" >
- <property name="minimumSize" >
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="pktsRcvdEdit">
+ <property name="minimumSize">
<size>
- <width>100</width>
+ <width>60</width>
<height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
- <width>100</width>
+ <width>80</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
- <item row="1" column="1" >
- <widget class="QLineEdit" name="pktsCorrectEdit" >
- <property name="minimumSize" >
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="pktsCorrectEdit">
+ <property name="minimumSize">
<size>
- <width>100</width>
+ <width>60</width>
<height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
- <width>100</width>
+ <width>80</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
- <item row="2" column="1" >
- <widget class="QLineEdit" name="perEdit" >
- <property name="minimumSize" >
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="perEdit">
+ <property name="minimumSize">
<size>
- <width>100</width>
+ <width>60</width>
<height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
- <width>100</width>
+ <width>80</width>
<height>16777215</height>
</size>
</property>
@@ -484,12 +510,12 @@
</widget>
</widget>
</item>
- <item row="2" column="4" >
- <spacer name="horizontalSpacer" >
- <property name="orientation" >
+ <item row="2" column="4">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
- <property name="sizeHint" stdset="0" >
+ <property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
@@ -497,95 +523,64 @@
</property>
</spacer>
</item>
- <item row="2" column="5" >
- <layout class="QVBoxLayout" name="verticalLayout" >
+ <item row="0" column="0" colspan="6">
+ <layout class="QVBoxLayout" name="verticalLayout_5">
<item>
- <widget class="QPushButton" name="pauseButton" >
- <property name="minimumSize" >
- <size>
- <width>80</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>80</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text" >
- <string>Pause</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer" >
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType" >
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>20</width>
- <height>60</height>
- </size>
+ <widget class="QFrame" name="sinkFrame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- </spacer>
- </item>
- <item>
- <widget class="QPushButton" name="closeButton" >
- <property name="minimumSize" >
+ <property name="minimumSize">
<size>
- <width>80</width>
- <height>0</height>
+ <width>500</width>
+ <height>550</height>
</size>
</property>
- <property name="maximumSize" >
- <size>
- <width>80</width>
- <height>16777215</height>
- </size>
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
</property>
- <property name="text" >
- <string>Close</string>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
</property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="1" column="0">
+ <layout class="QHBoxLayout" name="sinkLayout"/>
+ </item>
+ </layout>
</widget>
</item>
</layout>
</item>
</layout>
- <zorder>sinkFrame</zorder>
<zorder>channelModeBox</zorder>
- <zorder>verticalLayoutWidget</zorder>
- <zorder>verticalLayoutWidget</zorder>
- <zorder>rxBox</zorder>
<zorder></zorder>
<zorder>rxBox_2</zorder>
<zorder>horizontalSpacer</zorder>
<zorder></zorder>
</widget>
- <widget class="QMenuBar" name="menubar" >
- <property name="geometry" >
+ <widget class="QMenuBar" name="menubar">
+ <property name="geometry">
<rect>
<x>0</x>
<y>0</y>
- <width>1050</width>
- <height>24</height>
+ <width>1019</width>
+ <height>25</height>
</rect>
</property>
- <widget class="QMenu" name="menuFile" >
- <property name="title" >
+ <widget class="QMenu" name="menuFile">
+ <property name="title">
<string>&amp;File</string>
</property>
- <addaction name="actionExit" />
+ <addaction name="actionExit"/>
</widget>
- <addaction name="menuFile" />
+ <addaction name="menuFile"/>
</widget>
- <widget class="QStatusBar" name="statusbar" />
- <action name="actionExit" >
- <property name="text" >
+ <widget class="QStatusBar" name="statusbar"/>
+ <action name="actionExit">
+ <property name="text">
<string>E&amp;xit</string>
</property>
</action>
@@ -603,11 +598,11 @@
<receiver>DigitalWindow</receiver>
<slot>close()</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>322</x>
<y>623</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>66</x>
<y>561</y>
</hint>
@@ -619,11 +614,11 @@
<receiver>DigitalWindow</receiver>
<slot>close()</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>617</x>
<y>327</y>
</hint>
diff --git a/gnuradio-examples/python/digital/qt_digital_window2.py b/gnuradio-examples/python/digital/qt_digital_window2.py
new file mode 100644
index 0000000000..f111e37721
--- /dev/null
+++ b/gnuradio-examples/python/digital/qt_digital_window2.py
@@ -0,0 +1,261 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'qt_digital_window.ui'
+#
+# Created: Mon Oct 12 12:10:54 2009
+# by: PyQt4 UI code generator 4.4.3
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+class Ui_DigitalWindow(object):
+ def setupUi(self, DigitalWindow):
+ DigitalWindow.setObjectName("DigitalWindow")
+ DigitalWindow.resize(1019, 754)
+ self.centralwidget = QtGui.QWidget(DigitalWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.gridLayout = QtGui.QGridLayout(self.centralwidget)
+ self.gridLayout.setObjectName("gridLayout")
+ self.verticalLayout_2 = QtGui.QVBoxLayout()
+ self.verticalLayout_2.setObjectName("verticalLayout_2")
+ self.sysBox = QtGui.QGroupBox(self.centralwidget)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.sysBox.sizePolicy().hasHeightForWidth())
+ self.sysBox.setSizePolicy(sizePolicy)
+ self.sysBox.setMinimumSize(QtCore.QSize(240, 60))
+ self.sysBox.setMaximumSize(QtCore.QSize(240, 16777215))
+ self.sysBox.setObjectName("sysBox")
+ self.formLayoutWidget = QtGui.QWidget(self.sysBox)
+ self.formLayoutWidget.setGeometry(QtCore.QRect(10, 20, 211, 31))
+ self.formLayoutWidget.setObjectName("formLayoutWidget")
+ self.formLayout = QtGui.QFormLayout(self.formLayoutWidget)
+ self.formLayout.setSizeConstraint(QtGui.QLayout.SetFixedSize)
+ self.formLayout.setVerticalSpacing(20)
+ self.formLayout.setObjectName("formLayout")
+ self.sampleRateEdit = QtGui.QLineEdit(self.formLayoutWidget)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.sampleRateEdit.sizePolicy().hasHeightForWidth())
+ self.sampleRateEdit.setSizePolicy(sizePolicy)
+ self.sampleRateEdit.setMinimumSize(QtCore.QSize(60, 26))
+ self.sampleRateEdit.setMaximumSize(QtCore.QSize(80, 26))
+ self.sampleRateEdit.setObjectName("sampleRateEdit")
+ self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.sampleRateEdit)
+ self.sampleRateLabel = QtGui.QLabel(self.formLayoutWidget)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.sampleRateLabel.sizePolicy().hasHeightForWidth())
+ self.sampleRateLabel.setSizePolicy(sizePolicy)
+ self.sampleRateLabel.setMinimumSize(QtCore.QSize(0, 20))
+ self.sampleRateLabel.setMaximumSize(QtCore.QSize(16777215, 20))
+ self.sampleRateLabel.setObjectName("sampleRateLabel")
+ self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.sampleRateLabel)
+ self.verticalLayout_2.addWidget(self.sysBox)
+ spacerItem = QtGui.QSpacerItem(20, 60, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
+ self.verticalLayout_2.addItem(spacerItem)
+ self.gridLayout.addLayout(self.verticalLayout_2, 2, 0, 1, 1)
+ self.verticalLayout_5 = QtGui.QVBoxLayout()
+ self.verticalLayout_5.setObjectName("verticalLayout_5")
+ self.sinkFrame = QtGui.QFrame(self.centralwidget)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.sinkFrame.sizePolicy().hasHeightForWidth())
+ self.sinkFrame.setSizePolicy(sizePolicy)
+ self.sinkFrame.setMinimumSize(QtCore.QSize(500, 550))
+ self.sinkFrame.setFrameShape(QtGui.QFrame.StyledPanel)
+ self.sinkFrame.setFrameShadow(QtGui.QFrame.Raised)
+ self.sinkFrame.setObjectName("sinkFrame")
+ self.gridLayout_2 = QtGui.QGridLayout(self.sinkFrame)
+ self.gridLayout_2.setObjectName("gridLayout_2")
+ self.sinkLayout = QtGui.QHBoxLayout()
+ self.sinkLayout.setObjectName("sinkLayout")
+ self.gridLayout_2.addLayout(self.sinkLayout, 1, 0, 1, 1)
+ self.verticalLayout_5.addWidget(self.sinkFrame)
+ self.gridLayout.addLayout(self.verticalLayout_5, 0, 0, 1, 6)
+ self.channelModeBox = QtGui.QGroupBox(self.centralwidget)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.channelModeBox.sizePolicy().hasHeightForWidth())
+ self.channelModeBox.setSizePolicy(sizePolicy)
+ self.channelModeBox.setMinimumSize(QtCore.QSize(245, 130))
+ self.channelModeBox.setMaximumSize(QtCore.QSize(245, 16777215))
+ self.channelModeBox.setObjectName("channelModeBox")
+ self.formLayoutWidget_2 = QtGui.QWidget(self.channelModeBox)
+ self.formLayoutWidget_2.setGeometry(QtCore.QRect(10, 20, 221, 98))
+ self.formLayoutWidget_2.setObjectName("formLayoutWidget_2")
+ self.formLayout_2 = QtGui.QFormLayout(self.formLayoutWidget_2)
+ self.formLayout_2.setSizeConstraint(QtGui.QLayout.SetFixedSize)
+ self.formLayout_2.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow)
+ self.formLayout_2.setObjectName("formLayout_2")
+ self.snrLabel = QtGui.QLabel(self.formLayoutWidget_2)
+ self.snrLabel.setObjectName("snrLabel")
+ self.formLayout_2.setWidget(0, QtGui.QFormLayout.LabelRole, self.snrLabel)
+ self.snrEdit = QtGui.QLineEdit(self.formLayoutWidget_2)
+ self.snrEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.snrEdit.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.snrEdit.setObjectName("snrEdit")
+ self.formLayout_2.setWidget(0, QtGui.QFormLayout.FieldRole, self.snrEdit)
+ self.freqLabel = QtGui.QLabel(self.formLayoutWidget_2)
+ self.freqLabel.setObjectName("freqLabel")
+ self.formLayout_2.setWidget(1, QtGui.QFormLayout.LabelRole, self.freqLabel)
+ self.freqEdit = QtGui.QLineEdit(self.formLayoutWidget_2)
+ self.freqEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.freqEdit.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.freqEdit.setObjectName("freqEdit")
+ self.formLayout_2.setWidget(1, QtGui.QFormLayout.FieldRole, self.freqEdit)
+ self.timeLabel = QtGui.QLabel(self.formLayoutWidget_2)
+ self.timeLabel.setObjectName("timeLabel")
+ self.formLayout_2.setWidget(2, QtGui.QFormLayout.LabelRole, self.timeLabel)
+ self.timeEdit = QtGui.QLineEdit(self.formLayoutWidget_2)
+ self.timeEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.timeEdit.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.timeEdit.setObjectName("timeEdit")
+ self.formLayout_2.setWidget(2, QtGui.QFormLayout.FieldRole, self.timeEdit)
+ self.gridLayout.addWidget(self.channelModeBox, 2, 1, 1, 1)
+ self.rxBox_2 = QtGui.QGroupBox(self.centralwidget)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.rxBox_2.sizePolicy().hasHeightForWidth())
+ self.rxBox_2.setSizePolicy(sizePolicy)
+ self.rxBox_2.setMinimumSize(QtCore.QSize(220, 125))
+ self.rxBox_2.setMaximumSize(QtCore.QSize(265, 125))
+ self.rxBox_2.setObjectName("rxBox_2")
+ self.formLayoutWidget_4 = QtGui.QWidget(self.rxBox_2)
+ self.formLayoutWidget_4.setGeometry(QtCore.QRect(10, 20, 248, 188))
+ self.formLayoutWidget_4.setObjectName("formLayoutWidget_4")
+ self.formLayout_4 = QtGui.QFormLayout(self.formLayoutWidget_4)
+ self.formLayout_4.setSizeConstraint(QtGui.QLayout.SetFixedSize)
+ self.formLayout_4.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow)
+ self.formLayout_4.setObjectName("formLayout_4")
+ self.pktsRcvdLabel = QtGui.QLabel(self.formLayoutWidget_4)
+ self.pktsRcvdLabel.setObjectName("pktsRcvdLabel")
+ self.formLayout_4.setWidget(0, QtGui.QFormLayout.LabelRole, self.pktsRcvdLabel)
+ self.pktsRcvdEdit = QtGui.QLineEdit(self.formLayoutWidget_4)
+ self.pktsRcvdEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.pktsRcvdEdit.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.pktsRcvdEdit.setObjectName("pktsRcvdEdit")
+ self.formLayout_4.setWidget(0, QtGui.QFormLayout.FieldRole, self.pktsRcvdEdit)
+ self.pktsCorrectLabel = QtGui.QLabel(self.formLayoutWidget_4)
+ self.pktsCorrectLabel.setObjectName("pktsCorrectLabel")
+ self.formLayout_4.setWidget(1, QtGui.QFormLayout.LabelRole, self.pktsCorrectLabel)
+ self.pktsCorrectEdit = QtGui.QLineEdit(self.formLayoutWidget_4)
+ self.pktsCorrectEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.pktsCorrectEdit.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.pktsCorrectEdit.setObjectName("pktsCorrectEdit")
+ self.formLayout_4.setWidget(1, QtGui.QFormLayout.FieldRole, self.pktsCorrectEdit)
+ self.perLabel = QtGui.QLabel(self.formLayoutWidget_4)
+ self.perLabel.setObjectName("perLabel")
+ self.formLayout_4.setWidget(2, QtGui.QFormLayout.LabelRole, self.perLabel)
+ self.perEdit = QtGui.QLineEdit(self.formLayoutWidget_4)
+ self.perEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.perEdit.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.perEdit.setObjectName("perEdit")
+ self.formLayout_4.setWidget(2, QtGui.QFormLayout.FieldRole, self.perEdit)
+ self.gridLayout.addWidget(self.rxBox_2, 2, 3, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.gridLayout.addItem(spacerItem1, 2, 4, 1, 1)
+ self.verticalLayout = QtGui.QVBoxLayout()
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.pauseButton = QtGui.QPushButton(self.centralwidget)
+ self.pauseButton.setMinimumSize(QtCore.QSize(80, 0))
+ self.pauseButton.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.pauseButton.setObjectName("pauseButton")
+ self.verticalLayout.addWidget(self.pauseButton)
+ spacerItem2 = QtGui.QSpacerItem(20, 60, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
+ self.verticalLayout.addItem(spacerItem2)
+ self.closeButton = QtGui.QPushButton(self.centralwidget)
+ self.closeButton.setMinimumSize(QtCore.QSize(80, 0))
+ self.closeButton.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.closeButton.setObjectName("closeButton")
+ self.verticalLayout.addWidget(self.closeButton)
+ self.gridLayout.addLayout(self.verticalLayout, 2, 5, 1, 1)
+ self.rxBox = QtGui.QGroupBox(self.centralwidget)
+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.rxBox.sizePolicy().hasHeightForWidth())
+ self.rxBox.setSizePolicy(sizePolicy)
+ self.rxBox.setMinimumSize(QtCore.QSize(180, 120))
+ self.rxBox.setMaximumSize(QtCore.QSize(180, 16777215))
+ self.rxBox.setObjectName("rxBox")
+ self.formLayoutWidget_3 = QtGui.QWidget(self.rxBox)
+ self.formLayoutWidget_3.setGeometry(QtCore.QRect(10, 10, 161, 101))
+ self.formLayoutWidget_3.setObjectName("formLayoutWidget_3")
+ self.formLayout_3 = QtGui.QFormLayout(self.formLayoutWidget_3)
+ self.formLayout_3.setSizeConstraint(QtGui.QLayout.SetFixedSize)
+ self.formLayout_3.setObjectName("formLayout_3")
+ self.alphaTimeLabel = QtGui.QLabel(self.formLayoutWidget_3)
+ self.alphaTimeLabel.setObjectName("alphaTimeLabel")
+ self.formLayout_3.setWidget(0, QtGui.QFormLayout.LabelRole, self.alphaTimeLabel)
+ self.alphaFreqLabel = QtGui.QLabel(self.formLayoutWidget_3)
+ self.alphaFreqLabel.setObjectName("alphaFreqLabel")
+ self.formLayout_3.setWidget(2, QtGui.QFormLayout.LabelRole, self.alphaFreqLabel)
+ self.alphaTimeEdit = QtGui.QLineEdit(self.formLayoutWidget_3)
+ self.alphaTimeEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.alphaTimeEdit.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.alphaTimeEdit.setObjectName("alphaTimeEdit")
+ self.formLayout_3.setWidget(0, QtGui.QFormLayout.FieldRole, self.alphaTimeEdit)
+ self.alphaFreqEdit = QtGui.QLineEdit(self.formLayoutWidget_3)
+ self.alphaFreqEdit.setMinimumSize(QtCore.QSize(60, 0))
+ self.alphaFreqEdit.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.alphaFreqEdit.setObjectName("alphaFreqEdit")
+ self.formLayout_3.setWidget(2, QtGui.QFormLayout.FieldRole, self.alphaFreqEdit)
+ self.betaTimeEdit = QtGui.QLineEdit(self.formLayoutWidget_3)
+ self.betaTimeEdit.setMaximumSize(QtCore.QSize(80, 16777215))
+ self.betaTimeEdit.setObjectName("betaTimeEdit")
+ self.formLayout_3.setWidget(1, QtGui.QFormLayout.FieldRole, self.betaTimeEdit)
+ self.betaTimeLabel = QtGui.QLabel(self.formLayoutWidget_3)
+ self.betaTimeLabel.setObjectName("betaTimeLabel")
+ self.formLayout_3.setWidget(1, QtGui.QFormLayout.LabelRole, self.betaTimeLabel)
+ self.gridLayout.addWidget(self.rxBox, 2, 2, 1, 1)
+ DigitalWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtGui.QMenuBar(DigitalWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1019, 24))
+ self.menubar.setObjectName("menubar")
+ self.menuFile = QtGui.QMenu(self.menubar)
+ self.menuFile.setObjectName("menuFile")
+ DigitalWindow.setMenuBar(self.menubar)
+ self.statusbar = QtGui.QStatusBar(DigitalWindow)
+ self.statusbar.setObjectName("statusbar")
+ DigitalWindow.setStatusBar(self.statusbar)
+ self.actionExit = QtGui.QAction(DigitalWindow)
+ self.actionExit.setObjectName("actionExit")
+ self.menuFile.addAction(self.actionExit)
+ self.menubar.addAction(self.menuFile.menuAction())
+
+ self.retranslateUi(DigitalWindow)
+ QtCore.QObject.connect(self.closeButton, QtCore.SIGNAL("clicked()"), DigitalWindow.close)
+ QtCore.QObject.connect(self.actionExit, QtCore.SIGNAL("triggered()"), DigitalWindow.close)
+ QtCore.QMetaObject.connectSlotsByName(DigitalWindow)
+ DigitalWindow.setTabOrder(self.snrEdit, self.freqEdit)
+ DigitalWindow.setTabOrder(self.freqEdit, self.timeEdit)
+
+ def retranslateUi(self, DigitalWindow):
+ DigitalWindow.setWindowTitle(QtGui.QApplication.translate("DigitalWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
+ self.sysBox.setTitle(QtGui.QApplication.translate("DigitalWindow", "System Parameters", None, QtGui.QApplication.UnicodeUTF8))
+ self.sampleRateLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Sample Rate (sps)", None, QtGui.QApplication.UnicodeUTF8))
+ self.channelModeBox.setTitle(QtGui.QApplication.translate("DigitalWindow", "Channel Model Parameters", None, QtGui.QApplication.UnicodeUTF8))
+ self.snrLabel.setText(QtGui.QApplication.translate("DigitalWindow", "SNR (dB)", None, QtGui.QApplication.UnicodeUTF8))
+ self.freqLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Frequency Offset (Hz)", None, QtGui.QApplication.UnicodeUTF8))
+ self.timeLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Timing Offset", None, QtGui.QApplication.UnicodeUTF8))
+ self.rxBox_2.setTitle(QtGui.QApplication.translate("DigitalWindow", "Received Packet Info", None, QtGui.QApplication.UnicodeUTF8))
+ self.pktsRcvdLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Packets Rcvd.", None, QtGui.QApplication.UnicodeUTF8))
+ self.pktsCorrectLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Packets Correct", None, QtGui.QApplication.UnicodeUTF8))
+ self.perLabel.setText(QtGui.QApplication.translate("DigitalWindow", "PER", None, QtGui.QApplication.UnicodeUTF8))
+ self.pauseButton.setText(QtGui.QApplication.translate("DigitalWindow", "Pause", None, QtGui.QApplication.UnicodeUTF8))
+ self.closeButton.setText(QtGui.QApplication.translate("DigitalWindow", "Close", None, QtGui.QApplication.UnicodeUTF8))
+ self.rxBox.setTitle(QtGui.QApplication.translate("DigitalWindow", "Receiver Parameters", None, QtGui.QApplication.UnicodeUTF8))
+ self.alphaTimeLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Alpha: time", None, QtGui.QApplication.UnicodeUTF8))
+ self.alphaFreqLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Alpha: freq", None, QtGui.QApplication.UnicodeUTF8))
+ self.betaTimeLabel.setText(QtGui.QApplication.translate("DigitalWindow", "Beta: time", None, QtGui.QApplication.UnicodeUTF8))
+ self.menuFile.setTitle(QtGui.QApplication.translate("DigitalWindow", "&File", None, QtGui.QApplication.UnicodeUTF8))
+ self.actionExit.setText(QtGui.QApplication.translate("DigitalWindow", "E&xit", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/gnuradio-examples/python/digital/qt_digital_window2.ui b/gnuradio-examples/python/digital/qt_digital_window2.ui
new file mode 100644
index 0000000000..dc20ed798b
--- /dev/null
+++ b/gnuradio-examples/python/digital/qt_digital_window2.ui
@@ -0,0 +1,637 @@
+<ui version="4.0" >
+ <class>DigitalWindow</class>
+ <widget class="QMainWindow" name="DigitalWindow" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1019</width>
+ <height>754</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MainWindow</string>
+ </property>
+ <widget class="QWidget" name="centralwidget" >
+ <layout class="QGridLayout" name="gridLayout" >
+ <item row="2" column="0" >
+ <layout class="QVBoxLayout" name="verticalLayout_2" >
+ <item>
+ <widget class="QGroupBox" name="sysBox" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>240</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>240</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="title" >
+ <string>System Parameters</string>
+ </property>
+ <widget class="QWidget" name="formLayoutWidget" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>211</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <layout class="QFormLayout" name="formLayout" >
+ <property name="sizeConstraint" >
+ <enum>QLayout::SetFixedSize</enum>
+ </property>
+ <property name="verticalSpacing" >
+ <number>20</number>
+ </property>
+ <item row="0" column="1" >
+ <widget class="QLineEdit" name="sampleRateEdit" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>60</width>
+ <height>26</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>80</width>
+ <height>26</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="sampleRateLabel" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>16777215</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="text" >
+ <string>Sample Rate (sps)</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>60</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" colspan="6" >
+ <layout class="QVBoxLayout" name="verticalLayout_5" >
+ <item>
+ <widget class="QFrame" name="sinkFrame" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>500</width>
+ <height>550</height>
+ </size>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2" >
+ <item row="1" column="0" >
+ <layout class="QHBoxLayout" name="sinkLayout" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QGroupBox" name="channelModeBox" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>245</width>
+ <height>130</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>245</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="title" >
+ <string>Channel Model Parameters</string>
+ </property>
+ <widget class="QWidget" name="formLayoutWidget_2" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>221</width>
+ <height>98</height>
+ </rect>
+ </property>
+ <layout class="QFormLayout" name="formLayout_2" >
+ <property name="sizeConstraint" >
+ <enum>QLayout::SetFixedSize</enum>
+ </property>
+ <property name="fieldGrowthPolicy" >
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="snrLabel" >
+ <property name="text" >
+ <string>SNR (dB)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLineEdit" name="snrEdit" >
+ <property name="minimumSize" >
+ <size>
+ <width>60</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="freqLabel" >
+ <property name="text" >
+ <string>Frequency Offset (Hz)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLineEdit" name="freqEdit" >
+ <property name="minimumSize" >
+ <size>
+ <width>60</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="timeLabel" >
+ <property name="text" >
+ <string>Timing Offset</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLineEdit" name="timeEdit" >
+ <property name="minimumSize" >
+ <size>
+ <width>60</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <zorder>formLayoutWidget_2</zorder>
+ <zorder>rxBox</zorder>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QGroupBox" name="rxBox_2" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>220</width>
+ <height>125</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>265</width>
+ <height>125</height>
+ </size>
+ </property>
+ <property name="title" >
+ <string>Received Packet Info</string>
+ </property>
+ <widget class="QWidget" name="formLayoutWidget_4" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>248</width>
+ <height>188</height>
+ </rect>
+ </property>
+ <layout class="QFormLayout" name="formLayout_4" >
+ <property name="sizeConstraint" >
+ <enum>QLayout::SetFixedSize</enum>
+ </property>
+ <property name="fieldGrowthPolicy" >
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="pktsRcvdLabel" >
+ <property name="text" >
+ <string>Packets Rcvd.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLineEdit" name="pktsRcvdEdit" >
+ <property name="minimumSize" >
+ <size>
+ <width>60</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="pktsCorrectLabel" >
+ <property name="text" >
+ <string>Packets Correct</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLineEdit" name="pktsCorrectEdit" >
+ <property name="minimumSize" >
+ <size>
+ <width>60</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="perLabel" >
+ <property name="text" >
+ <string>PER</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLineEdit" name="perEdit" >
+ <property name="minimumSize" >
+ <size>
+ <width>60</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ <zorder>pktsRcvdLabel</zorder>
+ <zorder>pktsCorrectLabel</zorder>
+ <zorder>perLabel</zorder>
+ <zorder>pktsRcvdEdit</zorder>
+ <zorder>pktsCorrectEdit</zorder>
+ <zorder>perEdit</zorder>
+ <zorder>rxBox</zorder>
+ </widget>
+ </widget>
+ </item>
+ <item row="2" column="4" >
+ <spacer name="horizontalSpacer" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="5" >
+ <layout class="QVBoxLayout" name="verticalLayout" >
+ <item>
+ <widget class="QPushButton" name="pauseButton" >
+ <property name="minimumSize" >
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text" >
+ <string>Pause</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>60</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="closeButton" >
+ <property name="minimumSize" >
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text" >
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QGroupBox" name="rxBox" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>180</width>
+ <height>120</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>180</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="title" >
+ <string>Receiver Parameters</string>
+ </property>
+ <widget class="QWidget" name="formLayoutWidget_3" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>161</width>
+ <height>101</height>
+ </rect>
+ </property>
+ <layout class="QFormLayout" name="formLayout_3" >
+ <property name="sizeConstraint" >
+ <enum>QLayout::SetFixedSize</enum>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="alphaTimeLabel" >
+ <property name="text" >
+ <string>Alpha: time</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="alphaFreqLabel" >
+ <property name="text" >
+ <string>Alpha: freq</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLineEdit" name="alphaTimeEdit" >
+ <property name="minimumSize" >
+ <size>
+ <width>60</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLineEdit" name="alphaFreqEdit" >
+ <property name="minimumSize" >
+ <size>
+ <width>60</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLineEdit" name="betaTimeEdit" >
+ <property name="maximumSize" >
+ <size>
+ <width>80</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="betaTimeLabel" >
+ <property name="text" >
+ <string>Beta: time</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ <zorder>channelModeBox</zorder>
+ <zorder></zorder>
+ <zorder>rxBox_2</zorder>
+ <zorder>horizontalSpacer</zorder>
+ <zorder></zorder>
+ <zorder>rxBox</zorder>
+ </widget>
+ <widget class="QMenuBar" name="menubar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1019</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuFile" >
+ <property name="title" >
+ <string>&amp;File</string>
+ </property>
+ <addaction name="actionExit" />
+ </widget>
+ <addaction name="menuFile" />
+ </widget>
+ <widget class="QStatusBar" name="statusbar" />
+ <action name="actionExit" >
+ <property name="text" >
+ <string>E&amp;xit</string>
+ </property>
+ </action>
+ </widget>
+ <tabstops>
+ <tabstop>snrEdit</tabstop>
+ <tabstop>freqEdit</tabstop>
+ <tabstop>timeEdit</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>closeButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DigitalWindow</receiver>
+ <slot>close()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>322</x>
+ <y>623</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>66</x>
+ <y>561</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>actionExit</sender>
+ <signal>triggered()</signal>
+ <receiver>DigitalWindow</receiver>
+ <slot>close()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>-1</x>
+ <y>-1</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>617</x>
+ <y>327</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/gr-qtgui/src/lib/spectrumdisplayform.ui b/gr-qtgui/src/lib/spectrumdisplayform.ui
index 1458488a0d..cb7b4f9967 100644
--- a/gr-qtgui/src/lib/spectrumdisplayform.ui
+++ b/gr-qtgui/src/lib/spectrumdisplayform.ui
@@ -1,157 +1,158 @@
-<ui version="4.0" >
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
<class>SpectrumDisplayForm</class>
- <widget class="QWidget" name="SpectrumDisplayForm" >
- <property name="geometry" >
+ <widget class="QWidget" name="SpectrumDisplayForm">
+ <property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>657</width>
- <height>536</height>
+ <height>543</height>
</rect>
</property>
- <property name="windowTitle" >
+ <property name="windowTitle">
<string>Spectrum Display</string>
</property>
- <layout class="QGridLayout" name="gridLayout" >
- <item row="1" column="3" >
- <widget class="QComboBox" name="FFTSizeComboBox" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="1" column="3">
+ <widget class="QComboBox" name="FFTSizeComboBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
<width>120</width>
<height>16777215</height>
</size>
</property>
<item>
- <property name="text" >
+ <property name="text">
<string>1024</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>2048</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>4096</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>8192</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>16384</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>32768</string>
</property>
</item>
</widget>
</item>
- <item row="1" column="2" >
- <widget class="QLabel" name="FFTSizeLabel" >
- <property name="text" >
+ <item row="1" column="2">
+ <widget class="QLabel" name="FFTSizeLabel">
+ <property name="text">
<string>FFT Size:</string>
</property>
- <property name="alignment" >
+ <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
- <property name="wordWrap" >
+ <property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="1" column="0" >
- <widget class="QCheckBox" name="UseRFFrequenciesCheckBox" >
- <property name="text" >
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="UseRFFrequenciesCheckBox">
+ <property name="text">
<string>Display RF Frequencies</string>
</property>
</widget>
</item>
- <item row="3" column="0" >
- <layout class="QHBoxLayout" name="horizontalLayout" >
+ <item row="3" column="0">
+ <layout class="QHBoxLayout" name="horizontalLayout">
<item>
- <widget class="QLabel" name="WindowLbl" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <widget class="QLabel" name="WindowLbl">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="text" >
+ <property name="text">
<string>Window:</string>
</property>
- <property name="alignment" >
+ <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
- <property name="wordWrap" >
+ <property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
- <widget class="QComboBox" name="WindowComboBox" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <widget class="QComboBox" name="WindowComboBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="minimumSize" >
+ <property name="minimumSize">
<size>
<width>120</width>
<height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
<width>120</width>
<height>16777215</height>
</size>
</property>
- <property name="font" >
+ <property name="font">
<font>
<pointsize>9</pointsize>
</font>
</property>
<item>
- <property name="text" >
+ <property name="text">
<string>Hamming</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>Hann</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>Blackman</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>Rectangular</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>Kaiser</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>Blackman-harris</string>
</property>
</item>
@@ -159,180 +160,180 @@
</item>
</layout>
</item>
- <item row="0" column="0" colspan="4" >
- <widget class="QTabWidget" name="SpectrumTypeTab" >
- <property name="currentIndex" >
+ <item row="0" column="0" colspan="4">
+ <widget class="QTabWidget" name="SpectrumTypeTab">
+ <property name="currentIndex">
<number>0</number>
</property>
- <widget class="QWidget" name="FrequencyPage" >
- <attribute name="title" >
+ <widget class="QWidget" name="FrequencyPage">
+ <attribute name="title">
<string>Frequency Display</string>
</attribute>
- <layout class="QVBoxLayout" name="verticalLayout" >
+ <layout class="QVBoxLayout" name="verticalLayout">
<item>
- <layout class="QVBoxLayout" name="verticalLayout_2" >
+ <layout class="QVBoxLayout" name="verticalLayout_2">
<item>
- <widget class="QFrame" name="FrequencyPlotDisplayFrame" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
+ <widget class="QFrame" name="FrequencyPlotDisplayFrame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="minimumSize" >
+ <property name="minimumSize">
<size>
- <width>615</width>
+ <width>400</width>
<height>332</height>
</size>
</property>
- <property name="sizeIncrement" >
+ <property name="sizeIncrement">
<size>
<width>1</width>
<height>1</height>
</size>
</property>
- <property name="frameShape" >
+ <property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
- <property name="frameShadow" >
+ <property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
</widget>
</item>
<item>
- <layout class="QGridLayout" name="gridLayout_2" >
- <item row="1" column="0" >
- <widget class="QCheckBox" name="MaxHoldCheckBox" >
- <property name="text" >
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="MaxHoldCheckBox">
+ <property name="text">
<string>Max Hold</string>
</property>
- <property name="checked" >
+ <property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="2" column="0" >
- <widget class="QCheckBox" name="MinHoldCheckBox" >
- <property name="text" >
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="MinHoldCheckBox">
+ <property name="text">
<string>Min Hold</string>
</property>
- <property name="checked" >
+ <property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="1" column="3" >
- <widget class="QLabel" name="PowerLabel" >
- <property name="minimumSize" >
+ <item row="1" column="3">
+ <widget class="QLabel" name="PowerLabel">
+ <property name="minimumSize">
<size>
<width>50</width>
<height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
<width>50</width>
<height>16777215</height>
</size>
</property>
- <property name="text" >
+ <property name="text">
<string>Power</string>
</property>
- <property name="alignment" >
+ <property name="alignment">
<set>Qt::AlignCenter</set>
</property>
- <property name="wordWrap" >
+ <property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="1" column="1" >
- <widget class="QPushButton" name="MaxHoldResetBtn" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <item row="1" column="1">
+ <widget class="QPushButton" name="MaxHoldResetBtn">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="minimumSize" >
+ <property name="minimumSize">
<size>
<width>25</width>
<height>0</height>
</size>
</property>
- <property name="text" >
+ <property name="text">
<string>Reset</string>
</property>
</widget>
</item>
- <item row="1" column="4" >
- <widget class="QLabel" name="AvgLabel" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <item row="1" column="4">
+ <widget class="QLabel" name="AvgLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="minimumSize" >
+ <property name="minimumSize">
<size>
<width>62</width>
<height>0</height>
</size>
</property>
- <property name="text" >
+ <property name="text">
<string>Average</string>
</property>
- <property name="alignment" >
+ <property name="alignment">
<set>Qt::AlignCenter</set>
</property>
- <property name="wordWrap" >
+ <property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="2" column="1" >
- <widget class="QPushButton" name="MinHoldResetBtn" >
- <property name="text" >
+ <item row="2" column="1">
+ <widget class="QPushButton" name="MinHoldResetBtn">
+ <property name="text">
<string>Reset</string>
</property>
</widget>
</item>
- <item row="2" column="4" >
- <widget class="QSpinBox" name="AvgLineEdit" />
+ <item row="2" column="4">
+ <widget class="QSpinBox" name="AvgLineEdit"/>
</item>
- <item row="2" column="3" >
- <widget class="QLineEdit" name="PowerLineEdit" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <item row="2" column="3">
+ <widget class="QLineEdit" name="PowerLineEdit">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="minimumSize" >
+ <property name="minimumSize">
<size>
<width>50</width>
<height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
<width>50</width>
<height>16777215</height>
</size>
</property>
- <property name="text" >
+ <property name="text">
<string>1</string>
</property>
</widget>
</item>
- <item row="1" column="2" >
- <spacer name="horizontalSpacer_2" >
- <property name="orientation" >
+ <item row="1" column="2">
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
- <property name="sizeHint" stdset="0" >
+ <property name="sizeHint" stdset="0">
<size>
- <width>325</width>
+ <width>200</width>
<height>20</height>
</size>
</property>
@@ -344,410 +345,402 @@
</item>
</layout>
</widget>
- <widget class="QWidget" name="WaterfallPage" >
- <attribute name="title" >
+ <widget class="QWidget" name="WaterfallPage">
+ <attribute name="title">
<string>Waterfall Display</string>
</attribute>
- <layout class="QGridLayout" name="gridLayout_3" >
- <item row="0" column="0" >
- <widget class="QLabel" name="textLabel1" >
- <property name="maximumSize" >
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QLabel" name="textLabel1">
+ <property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
- <property name="text" >
+ <property name="text">
<string>Intensity Display:</string>
</property>
- <property name="wordWrap" >
+ <property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="0" column="2" >
- <widget class="QwtWheel" name="WaterfallMaximumIntensityWheel" >
- <property name="minimumSize" >
+ <item row="0" column="2">
+ <widget class="QwtWheel" name="WaterfallMaximumIntensityWheel">
+ <property name="minimumSize">
<size>
<width>200</width>
<height>0</height>
</size>
</property>
- <property name="mouseTracking" >
+ <property name="mouseTracking">
<bool>true</bool>
</property>
- <property name="focusPolicy" >
+ <property name="focusPolicy">
<enum>Qt::WheelFocus</enum>
</property>
- <property name="valid" >
+ <property name="valid">
<bool>true</bool>
</property>
- <property name="totalAngle" >
+ <property name="totalAngle">
<double>200.000000000000000</double>
</property>
- <property name="viewAngle" >
+ <property name="viewAngle">
<double>20.000000000000000</double>
</property>
- <property name="mass" >
+ <property name="mass">
<double>0.000000000000000</double>
</property>
</widget>
</item>
- <item row="0" column="3" >
- <widget class="QLabel" name="WaterfallMaximumIntensityLabel" >
- <property name="maximumSize" >
+ <item row="0" column="3">
+ <widget class="QLabel" name="WaterfallMaximumIntensityLabel">
+ <property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
- <property name="text" >
+ <property name="text">
<string>100 dB</string>
</property>
- <property name="wordWrap" >
+ <property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="1" column="0" colspan="4" >
- <widget class="QFrame" name="WaterfallPlotDisplayFrame" >
- <property name="minimumSize" >
+ <item row="1" column="0" colspan="4">
+ <widget class="QFrame" name="WaterfallPlotDisplayFrame">
+ <property name="minimumSize">
<size>
<width>617</width>
<height>338</height>
</size>
</property>
- <property name="frameShape" >
+ <property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
- <property name="frameShadow" >
+ <property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
</widget>
</item>
- <item row="2" column="2" >
- <widget class="QwtWheel" name="WaterfallMinimumIntensityWheel" >
- <property name="minimumSize" >
+ <item row="2" column="2">
+ <widget class="QwtWheel" name="WaterfallMinimumIntensityWheel">
+ <property name="minimumSize">
<size>
<width>200</width>
<height>0</height>
</size>
</property>
- <property name="valid" >
+ <property name="valid">
<bool>true</bool>
</property>
- <property name="totalAngle" >
+ <property name="totalAngle">
<double>200.000000000000000</double>
</property>
- <property name="viewAngle" >
+ <property name="viewAngle">
<double>20.000000000000000</double>
</property>
- <property name="mass" >
+ <property name="mass">
<double>0.000000000000000</double>
</property>
</widget>
</item>
- <item row="2" column="3" >
- <widget class="QLabel" name="WaterfallMinimumIntensityLabel" >
- <property name="maximumSize" >
+ <item row="2" column="3">
+ <widget class="QLabel" name="WaterfallMinimumIntensityLabel">
+ <property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
- <property name="text" >
+ <property name="text">
<string>-100 dB</string>
</property>
- <property name="wordWrap" >
+ <property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="2" column="0" colspan="2" >
- <widget class="QPushButton" name="WaterfallAutoScaleBtn" >
- <property name="maximumSize" >
+ <item row="2" column="0" colspan="2">
+ <widget class="QPushButton" name="WaterfallAutoScaleBtn">
+ <property name="maximumSize">
<size>
<width>80</width>
<height>16777215</height>
</size>
</property>
- <property name="toolTip" >
+ <property name="toolTip">
<string>Scales the Intensity to the current data extremes.</string>
</property>
- <property name="text" >
+ <property name="text">
<string>Auto Scale</string>
</property>
</widget>
</item>
- <item row="0" column="1" >
- <widget class="QComboBox" name="WaterfallIntensityComboBox" >
- <property name="maximumSize" >
+ <item row="0" column="1">
+ <widget class="QComboBox" name="WaterfallIntensityComboBox">
+ <property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<item>
- <property name="text" >
+ <property name="text">
<string>Color</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>White Hot</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>Black Hot</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>Incandescent</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>User Defined</string>
</property>
</item>
</widget>
</item>
</layout>
- <zorder>textLabel1</zorder>
- <zorder>WaterfallMaximumIntensityWheel</zorder>
- <zorder>WaterfallMaximumIntensityLabel</zorder>
- <zorder>WaterfallPlotDisplayFrame</zorder>
- <zorder>WaterfallMinimumIntensityWheel</zorder>
- <zorder>WaterfallMinimumIntensityLabel</zorder>
- <zorder>WaterfallAutoScaleBtn</zorder>
- <zorder>WaterfallIntensityComboBox</zorder>
</widget>
- <widget class="QWidget" name="Waterfall3DPage" >
- <attribute name="title" >
+ <widget class="QWidget" name="Waterfall3DPage">
+ <attribute name="title">
<string>3D Waterfall Display</string>
</attribute>
- <layout class="QGridLayout" name="gridLayout_6" >
- <item row="0" column="0" >
- <widget class="QLabel" name="textLabel1_2" >
- <property name="minimumSize" >
+ <layout class="QGridLayout" name="gridLayout_6">
+ <item row="0" column="0">
+ <widget class="QLabel" name="textLabel1_2">
+ <property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
- <property name="text" >
+ <property name="text">
<string>Intensity Display:</string>
</property>
- <property name="wordWrap" >
+ <property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="0" column="1" >
- <widget class="QComboBox" name="Waterfall3DIntensityComboBox" >
- <property name="maximumSize" >
+ <item row="0" column="1">
+ <widget class="QComboBox" name="Waterfall3DIntensityComboBox">
+ <property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<item>
- <property name="text" >
+ <property name="text">
<string>Color</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>White Hot</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>Black Hot</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>Incandescent</string>
</property>
</item>
<item>
- <property name="text" >
+ <property name="text">
<string>User Defined</string>
</property>
</item>
</widget>
</item>
- <item row="0" column="2" >
- <widget class="QwtWheel" name="Waterfall3DMaximumIntensityWheel" >
- <property name="minimumSize" >
+ <item row="0" column="2">
+ <widget class="QwtWheel" name="Waterfall3DMaximumIntensityWheel">
+ <property name="minimumSize">
<size>
<width>200</width>
<height>0</height>
</size>
</property>
- <property name="mouseTracking" >
+ <property name="mouseTracking">
<bool>true</bool>
</property>
- <property name="focusPolicy" >
+ <property name="focusPolicy">
<enum>Qt::WheelFocus</enum>
</property>
- <property name="valid" >
+ <property name="valid">
<bool>true</bool>
</property>
- <property name="totalAngle" >
+ <property name="totalAngle">
<double>200.000000000000000</double>
</property>
- <property name="viewAngle" >
+ <property name="viewAngle">
<double>20.000000000000000</double>
</property>
- <property name="mass" >
+ <property name="mass">
<double>0.000000000000000</double>
</property>
</widget>
</item>
- <item row="0" column="3" >
- <widget class="QLabel" name="Waterfall3DMaximumIntensityLabel" >
- <property name="maximumSize" >
+ <item row="0" column="3">
+ <widget class="QLabel" name="Waterfall3DMaximumIntensityLabel">
+ <property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
- <property name="text" >
+ <property name="text">
<string>100 dB</string>
</property>
- <property name="wordWrap" >
+ <property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="1" column="0" colspan="4" >
- <widget class="QFrame" name="Waterfall3DPlotDisplayFrame" >
- <property name="frameShape" >
+ <item row="1" column="0" colspan="4">
+ <widget class="QFrame" name="Waterfall3DPlotDisplayFrame">
+ <property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
- <property name="frameShadow" >
+ <property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
</widget>
</item>
- <item row="2" column="0" colspan="2" >
- <widget class="QPushButton" name="Waterfall3DAutoScaleBtn" >
- <property name="minimumSize" >
+ <item row="2" column="0" colspan="2">
+ <widget class="QPushButton" name="Waterfall3DAutoScaleBtn">
+ <property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
- <property name="maximumSize" >
+ <property name="maximumSize">
<size>
<width>80</width>
<height>16777215</height>
</size>
</property>
- <property name="sizeIncrement" >
+ <property name="sizeIncrement">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
- <property name="toolTip" >
+ <property name="toolTip">
<string>Scales the Intensity to the current data extremes.</string>
</property>
- <property name="text" >
+ <property name="text">
<string>Auto Scale</string>
</property>
</widget>
</item>
- <item row="2" column="2" >
- <widget class="QwtWheel" name="Waterfall3DMinimumIntensityWheel" >
- <property name="minimumSize" >
+ <item row="2" column="2">
+ <widget class="QwtWheel" name="Waterfall3DMinimumIntensityWheel">
+ <property name="minimumSize">
<size>
<width>200</width>
<height>0</height>
</size>
</property>
- <property name="valid" >
+ <property name="valid">
<bool>true</bool>
</property>
- <property name="totalAngle" >
+ <property name="totalAngle">
<double>200.000000000000000</double>
</property>
- <property name="viewAngle" >
+ <property name="viewAngle">
<double>20.000000000000000</double>
</property>
- <property name="mass" >
+ <property name="mass">
<double>0.000000000000000</double>
</property>
</widget>
</item>
- <item row="2" column="3" >
- <widget class="QLabel" name="Waterfall3DMinimumIntensityLabel" >
- <property name="maximumSize" >
+ <item row="2" column="3">
+ <widget class="QLabel" name="Waterfall3DMinimumIntensityLabel">
+ <property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
- <property name="text" >
+ <property name="text">
<string>-100 dB</string>
</property>
- <property name="wordWrap" >
+ <property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
- <widget class="QWidget" name="TimeDomainPage" >
- <attribute name="title" >
+ <widget class="QWidget" name="TimeDomainPage">
+ <attribute name="title">
<string>Time Domain Display</string>
</attribute>
- <layout class="QGridLayout" name="gridLayout_4" >
- <item row="0" column="0" >
- <widget class="QFrame" name="TimeDomainDisplayFrame" >
- <property name="minimumSize" >
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="0" column="0">
+ <widget class="QFrame" name="TimeDomainDisplayFrame">
+ <property name="minimumSize">
<size>
<width>617</width>
<height>404</height>
</size>
</property>
- <property name="frameShape" >
+ <property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
- <property name="frameShadow" >
+ <property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
</widget>
</item>
</layout>
</widget>
- <widget class="QWidget" name="ConstellationPage" >
- <attribute name="title" >
+ <widget class="QWidget" name="ConstellationPage">
+ <attribute name="title">
<string>Constellation Display</string>
</attribute>
- <layout class="QGridLayout" name="gridLayout_5" >
- <item row="0" column="0" >
- <widget class="QFrame" name="ConstellationDisplayFrame" >
- <property name="minimumSize" >
+ <layout class="QGridLayout" name="gridLayout_5">
+ <item row="0" column="0">
+ <widget class="QFrame" name="ConstellationDisplayFrame">
+ <property name="minimumSize">
<size>
<width>617</width>
<height>406</height>
</size>
</property>
- <property name="frameShape" >
+ <property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
- <property name="frameShadow" >
+ <property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
</widget>
@@ -758,7 +751,7 @@
</item>
</layout>
</widget>
- <layoutdefault spacing="6" margin="11" />
+ <layoutdefault spacing="6" margin="11"/>
<pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
<customwidgets>
<customwidget>
@@ -775,14 +768,14 @@
<tabstop>WaterfallMinimumIntensityWheel</tabstop>
</tabstops>
<includes>
- <include location="global" >SpectrumGUIClass.h</include>
- <include location="global" >FrequencyDisplayPlot.h</include>
- <include location="global" >WaterfallDisplayPlot.h</include>
- <include location="global" >Waterfall3DDisplayPlot.h</include>
- <include location="global" >TimeDomainDisplayPlot.h</include>
- <include location="global" >qvalidator.h</include>
- <include location="global" >vector</include>
- <include location="local" >qwt_wheel.h</include>
+ <include location="global">SpectrumGUIClass.h</include>
+ <include location="global">FrequencyDisplayPlot.h</include>
+ <include location="global">WaterfallDisplayPlot.h</include>
+ <include location="global">Waterfall3DDisplayPlot.h</include>
+ <include location="global">TimeDomainDisplayPlot.h</include>
+ <include location="global">qvalidator.h</include>
+ <include location="global">vector</include>
+ <include location="local">qwt_wheel.h</include>
</includes>
<resources/>
<connections>
@@ -792,11 +785,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>MaxHoldCheckBox_toggled(bool)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>22</x>
<y>324</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -808,11 +801,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>MaxHoldResetBtn_clicked()</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>107</x>
<y>324</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -824,11 +817,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>MinHoldCheckBox_toggled(bool)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>22</x>
<y>349</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -840,11 +833,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>MinHoldResetBtn_clicked()</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>107</x>
<y>349</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -856,11 +849,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>PowerLineEdit_textChanged(QString)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>482</x>
<y>344</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -872,11 +865,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>WindowTypeChanged(int)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>20</x>
<y>20</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -888,11 +881,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>UseRFFrequenciesCB(bool)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>20</x>
<y>20</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -904,11 +897,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>waterfallMaximumIntensityChangedCB(double)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>217</x>
<y>44</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -920,11 +913,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>waterfallMinimumIntensityChangedCB(double)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>217</x>
<y>349</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -936,11 +929,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>waterfall3DMaximumIntensityChangedCB(double)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>217</x>
<y>44</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -952,11 +945,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>waterfall3DMinimumIntensityChangedCB(double)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>217</x>
<y>349</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -968,11 +961,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>FFTComboBoxSelectedCB(QString)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>20</x>
<y>20</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -984,11 +977,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>WaterfallAutoScaleBtnCB()</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>22</x>
<y>349</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -1000,11 +993,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>Waterfall3DAutoScaleBtnCB()</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>22</x>
<y>349</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -1016,11 +1009,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>WaterfallIntensityColorTypeChanged(int)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>92</x>
<y>44</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -1032,11 +1025,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>Waterfall3DIntensityColorTypeChanged(int)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>92</x>
<y>44</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
@@ -1048,11 +1041,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>TabChanged(int)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>314</x>
<y>189</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>316</x>
<y>217</y>
</hint>
@@ -1064,11 +1057,11 @@
<receiver>SpectrumDisplayForm</receiver>
<slot>AvgLineEdit_valueChanged(int)</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>604</x>
<y>421</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>328</x>
<y>260</y>
</hint>
diff --git a/gr-utils/src/python/pyqt_plot.py b/gr-utils/src/python/pyqt_plot.py
index 98977da975..5650135abf 100644
--- a/gr-utils/src/python/pyqt_plot.py
+++ b/gr-utils/src/python/pyqt_plot.py
@@ -2,8 +2,8 @@
# Form implementation generated from reading ui file 'pyqt_plot.ui'
#
-# Created: Tue Sep 1 23:02:36 2009
-# by: PyQt4 UI code generator 4.4.3
+# Created: Tue Oct 6 10:39:58 2009
+# by: PyQt4 UI code generator 4.4.4
#
# WARNING! All changes made in this file will be lost!
@@ -12,7 +12,7 @@ from PyQt4 import QtCore, QtGui
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
- MainWindow.resize(927, 718)
+ MainWindow.resize(927, 696)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtGui.QGridLayout(self.centralwidget)
@@ -20,123 +20,8 @@ class Ui_MainWindow(object):
self.plotHBar = QtGui.QScrollBar(self.centralwidget)
self.plotHBar.setOrientation(QtCore.Qt.Horizontal)
self.plotHBar.setObjectName("plotHBar")
- self.gridLayout.addWidget(self.plotHBar, 1, 0, 1, 3)
- self.filePosBox = QtGui.QGroupBox(self.centralwidget)
- self.filePosBox.setMinimumSize(QtCore.QSize(0, 120))
- self.filePosBox.setObjectName("filePosBox")
- self.gridLayout_4 = QtGui.QGridLayout(self.filePosBox)
- self.gridLayout_4.setObjectName("gridLayout_4")
- self.filePosLayout = QtGui.QFormLayout()
- self.filePosLayout.setObjectName("filePosLayout")
- self.filePosStartLineEdit = QtGui.QLineEdit(self.filePosBox)
- self.filePosStartLineEdit.setMinimumSize(QtCore.QSize(50, 0))
- self.filePosStartLineEdit.setMaximumSize(QtCore.QSize(100, 16777215))
- self.filePosStartLineEdit.setObjectName("filePosStartLineEdit")
- self.filePosLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.filePosStartLineEdit)
- self.filePosStopLabel = QtGui.QLabel(self.filePosBox)
- self.filePosStopLabel.setObjectName("filePosStopLabel")
- self.filePosLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.filePosStopLabel)
- self.filePosStopLineEdit = QtGui.QLineEdit(self.filePosBox)
- self.filePosStopLineEdit.setMinimumSize(QtCore.QSize(50, 0))
- self.filePosStopLineEdit.setMaximumSize(QtCore.QSize(100, 16777215))
- self.filePosStopLineEdit.setObjectName("filePosStopLineEdit")
- self.filePosLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.filePosStopLineEdit)
- self.filePosLengthLabel = QtGui.QLabel(self.filePosBox)
- self.filePosLengthLabel.setObjectName("filePosLengthLabel")
- self.filePosLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.filePosLengthLabel)
- self.filePosLengthLineEdit = QtGui.QLineEdit(self.filePosBox)
- self.filePosLengthLineEdit.setMinimumSize(QtCore.QSize(50, 0))
- self.filePosLengthLineEdit.setMaximumSize(QtCore.QSize(100, 16777215))
- self.filePosLengthLineEdit.setObjectName("filePosLengthLineEdit")
- self.filePosLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.filePosLengthLineEdit)
- self.filePosStartLabel = QtGui.QLabel(self.filePosBox)
- self.filePosStartLabel.setObjectName("filePosStartLabel")
- self.filePosLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.filePosStartLabel)
- self.gridLayout_4.addLayout(self.filePosLayout, 0, 0, 1, 1)
- self.fileTimeLayout = QtGui.QFormLayout()
- self.fileTimeLayout.setObjectName("fileTimeLayout")
- self.fileTimeStartLabel = QtGui.QLabel(self.filePosBox)
- self.fileTimeStartLabel.setObjectName("fileTimeStartLabel")
- self.fileTimeLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.fileTimeStartLabel)
- self.fileTimeStartLineEdit = QtGui.QLineEdit(self.filePosBox)
- self.fileTimeStartLineEdit.setMinimumSize(QtCore.QSize(50, 0))
- self.fileTimeStartLineEdit.setMaximumSize(QtCore.QSize(100, 16777215))
- self.fileTimeStartLineEdit.setObjectName("fileTimeStartLineEdit")
- self.fileTimeLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.fileTimeStartLineEdit)
- self.fileTimeStopLabel = QtGui.QLabel(self.filePosBox)
- self.fileTimeStopLabel.setObjectName("fileTimeStopLabel")
- self.fileTimeLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.fileTimeStopLabel)
- self.fileTimeStopLineEdit = QtGui.QLineEdit(self.filePosBox)
- self.fileTimeStopLineEdit.setMinimumSize(QtCore.QSize(50, 0))
- self.fileTimeStopLineEdit.setMaximumSize(QtCore.QSize(100, 16777215))
- self.fileTimeStopLineEdit.setObjectName("fileTimeStopLineEdit")
- self.fileTimeLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.fileTimeStopLineEdit)
- self.fileTimeLengthLabel = QtGui.QLabel(self.filePosBox)
- self.fileTimeLengthLabel.setObjectName("fileTimeLengthLabel")
- self.fileTimeLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.fileTimeLengthLabel)
- self.fileTimeLengthLineEdit = QtGui.QLineEdit(self.filePosBox)
- self.fileTimeLengthLineEdit.setMinimumSize(QtCore.QSize(50, 0))
- self.fileTimeLengthLineEdit.setMaximumSize(QtCore.QSize(100, 16777215))
- self.fileTimeLengthLineEdit.setObjectName("fileTimeLengthLineEdit")
- self.fileTimeLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.fileTimeLengthLineEdit)
- self.gridLayout_4.addLayout(self.fileTimeLayout, 0, 1, 1, 1)
- self.gridLayout.addWidget(self.filePosBox, 2, 0, 1, 1)
- self.displayGroupBox = QtGui.QGroupBox(self.centralwidget)
- self.displayGroupBox.setMinimumSize(QtCore.QSize(170, 0))
- self.displayGroupBox.setObjectName("displayGroupBox")
- self.gridLayout_2 = QtGui.QGridLayout(self.displayGroupBox)
- self.gridLayout_2.setObjectName("gridLayout_2")
- self.colorComboBox = QtGui.QComboBox(self.displayGroupBox)
- self.colorComboBox.setObjectName("colorComboBox")
- self.gridLayout_2.addWidget(self.colorComboBox, 0, 0, 1, 2)
- self.lineWidthSpinBox = QtGui.QSpinBox(self.displayGroupBox)
- self.lineWidthSpinBox.setMinimumSize(QtCore.QSize(100, 0))
- self.lineWidthSpinBox.setMaximumSize(QtCore.QSize(100, 16777215))
- self.lineWidthSpinBox.setObjectName("lineWidthSpinBox")
- self.gridLayout_2.addWidget(self.lineWidthSpinBox, 1, 1, 1, 1)
- self.lineWidthLabel = QtGui.QLabel(self.displayGroupBox)
- self.lineWidthLabel.setObjectName("lineWidthLabel")
- self.gridLayout_2.addWidget(self.lineWidthLabel, 1, 0, 1, 1)
- self.lineStyleLabel = QtGui.QLabel(self.displayGroupBox)
- self.lineStyleLabel.setObjectName("lineStyleLabel")
- self.gridLayout_2.addWidget(self.lineStyleLabel, 2, 0, 1, 1)
- self.lineStyleComboBox = QtGui.QComboBox(self.displayGroupBox)
- self.lineStyleComboBox.setMinimumSize(QtCore.QSize(100, 0))
- self.lineStyleComboBox.setMaximumSize(QtCore.QSize(100, 16777215))
- self.lineStyleComboBox.setObjectName("lineStyleComboBox")
- self.gridLayout_2.addWidget(self.lineStyleComboBox, 2, 1, 1, 1)
- self.styleSizeLabel = QtGui.QLabel(self.displayGroupBox)
- self.styleSizeLabel.setObjectName("styleSizeLabel")
- self.gridLayout_2.addWidget(self.styleSizeLabel, 3, 0, 1, 1)
- self.styleSizeSpinBox = QtGui.QSpinBox(self.displayGroupBox)
- self.styleSizeSpinBox.setMinimumSize(QtCore.QSize(100, 0))
- self.styleSizeSpinBox.setMaximumSize(QtCore.QSize(100, 16777215))
- self.styleSizeSpinBox.setObjectName("styleSizeSpinBox")
- self.gridLayout_2.addWidget(self.styleSizeSpinBox, 3, 1, 1, 1)
- self.gridLayout.addWidget(self.displayGroupBox, 2, 2, 1, 1)
- self.sysGroupBox = QtGui.QGroupBox(self.centralwidget)
- self.sysGroupBox.setMinimumSize(QtCore.QSize(200, 0))
- self.sysGroupBox.setObjectName("sysGroupBox")
- self.formLayout = QtGui.QFormLayout(self.sysGroupBox)
- self.formLayout.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow)
- self.formLayout.setObjectName("formLayout")
- self.sampleRateLabel = QtGui.QLabel(self.sysGroupBox)
- self.sampleRateLabel.setObjectName("sampleRateLabel")
- self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.sampleRateLabel)
- self.sampleRateLineEdit = QtGui.QLineEdit(self.sysGroupBox)
- self.sampleRateLineEdit.setMinimumSize(QtCore.QSize(50, 0))
- self.sampleRateLineEdit.setMaximumSize(QtCore.QSize(100, 16777215))
- self.sampleRateLineEdit.setObjectName("sampleRateLineEdit")
- self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.sampleRateLineEdit)
- self.gridLayout.addWidget(self.sysGroupBox, 2, 1, 1, 1)
- self.frame = QtGui.QFrame(self.centralwidget)
- self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
- self.frame.setFrameShadow(QtGui.QFrame.Raised)
- self.frame.setObjectName("frame")
- self.gridLayout_3 = QtGui.QGridLayout(self.frame)
- self.gridLayout_3.setObjectName("gridLayout_3")
- self.tabGroup = QtGui.QTabWidget(self.frame)
- self.tabGroup.setMinimumSize(QtCore.QSize(0, 0))
+ self.gridLayout.addWidget(self.plotHBar, 2, 0, 1, 2)
+ self.tabGroup = QtGui.QTabWidget(self.centralwidget)
self.tabGroup.setObjectName("tabGroup")
self.timeTab = QtGui.QWidget()
self.timeTab.setObjectName("timeTab")
@@ -156,14 +41,14 @@ class Ui_MainWindow(object):
self.formLayout_4 = QtGui.QFormLayout(self.fftPropBox)
self.formLayout_4.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow)
self.formLayout_4.setObjectName("formLayout_4")
- self.psdFFTSizeLabel = QtGui.QLabel(self.fftPropBox)
- self.psdFFTSizeLabel.setObjectName("psdFFTSizeLabel")
- self.formLayout_4.setWidget(0, QtGui.QFormLayout.LabelRole, self.psdFFTSizeLabel)
self.psdFFTComboBox = QtGui.QComboBox(self.fftPropBox)
self.psdFFTComboBox.setMinimumSize(QtCore.QSize(96, 0))
self.psdFFTComboBox.setMaximumSize(QtCore.QSize(96, 16777215))
self.psdFFTComboBox.setObjectName("psdFFTComboBox")
self.formLayout_4.setWidget(0, QtGui.QFormLayout.FieldRole, self.psdFFTComboBox)
+ self.psdFFTSizeLabel = QtGui.QLabel(self.fftPropBox)
+ self.psdFFTSizeLabel.setObjectName("psdFFTSizeLabel")
+ self.formLayout_4.setWidget(0, QtGui.QFormLayout.LabelRole, self.psdFFTSizeLabel)
self.horizontalLayout_2.addWidget(self.fftPropBox)
self.freqPlot = Qwt5.QwtPlot(self.freqTab)
self.freqPlot.setObjectName("freqPlot")
@@ -190,11 +75,90 @@ class Ui_MainWindow(object):
self.specPlot.setObjectName("specPlot")
self.horizontalLayout_3.addWidget(self.specPlot)
self.tabGroup.addTab(self.specTab, "")
- self.gridLayout_3.addWidget(self.tabGroup, 0, 0, 1, 1)
- self.gridLayout.addWidget(self.frame, 0, 0, 1, 3)
+ self.gridLayout.addWidget(self.tabGroup, 1, 0, 1, 1)
+ self.filePosBox = QtGui.QGroupBox(self.centralwidget)
+ self.filePosBox.setMinimumSize(QtCore.QSize(0, 120))
+ self.filePosBox.setObjectName("filePosBox")
+ self.formLayoutWidget_2 = QtGui.QWidget(self.filePosBox)
+ self.formLayoutWidget_2.setGeometry(QtCore.QRect(0, 20, 160, 92))
+ self.formLayoutWidget_2.setObjectName("formLayoutWidget_2")
+ self.filePosLayout = QtGui.QFormLayout(self.formLayoutWidget_2)
+ self.filePosLayout.setObjectName("filePosLayout")
+ self.filePosStartLabel = QtGui.QLabel(self.formLayoutWidget_2)
+ self.filePosStartLabel.setObjectName("filePosStartLabel")
+ self.filePosLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.filePosStartLabel)
+ self.filePosStartLineEdit = QtGui.QLineEdit(self.formLayoutWidget_2)
+ self.filePosStartLineEdit.setObjectName("filePosStartLineEdit")
+ self.filePosLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.filePosStartLineEdit)
+ self.filePosStopLabel = QtGui.QLabel(self.formLayoutWidget_2)
+ self.filePosStopLabel.setObjectName("filePosStopLabel")
+ self.filePosLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.filePosStopLabel)
+ self.filePosStopLineEdit = QtGui.QLineEdit(self.formLayoutWidget_2)
+ self.filePosStopLineEdit.setObjectName("filePosStopLineEdit")
+ self.filePosLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.filePosStopLineEdit)
+ self.filePosLengthLabel = QtGui.QLabel(self.formLayoutWidget_2)
+ self.filePosLengthLabel.setObjectName("filePosLengthLabel")
+ self.filePosLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.filePosLengthLabel)
+ self.filePosLengthLineEdit = QtGui.QLineEdit(self.formLayoutWidget_2)
+ self.filePosLengthLineEdit.setObjectName("filePosLengthLineEdit")
+ self.filePosLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.filePosLengthLineEdit)
+ self.formLayoutWidget_4 = QtGui.QWidget(self.filePosBox)
+ self.formLayoutWidget_4.setGeometry(QtCore.QRect(180, 20, 231, 92))
+ self.formLayoutWidget_4.setObjectName("formLayoutWidget_4")
+ self.fileTimeLayout = QtGui.QFormLayout(self.formLayoutWidget_4)
+ self.fileTimeLayout.setObjectName("fileTimeLayout")
+ self.fileTimeStartLabel = QtGui.QLabel(self.formLayoutWidget_4)
+ self.fileTimeStartLabel.setObjectName("fileTimeStartLabel")
+ self.fileTimeLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.fileTimeStartLabel)
+ self.fileTimeStartLineEdit = QtGui.QLineEdit(self.formLayoutWidget_4)
+ self.fileTimeStartLineEdit.setObjectName("fileTimeStartLineEdit")
+ self.fileTimeLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.fileTimeStartLineEdit)
+ self.fileTimeStopLabel = QtGui.QLabel(self.formLayoutWidget_4)
+ self.fileTimeStopLabel.setObjectName("fileTimeStopLabel")
+ self.fileTimeLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.fileTimeStopLabel)
+ self.fileTimeStopLineEdit = QtGui.QLineEdit(self.formLayoutWidget_4)
+ self.fileTimeStopLineEdit.setObjectName("fileTimeStopLineEdit")
+ self.fileTimeLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.fileTimeStopLineEdit)
+ self.fileTimeLengthLabel = QtGui.QLabel(self.formLayoutWidget_4)
+ self.fileTimeLengthLabel.setObjectName("fileTimeLengthLabel")
+ self.fileTimeLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.fileTimeLengthLabel)
+ self.fileTimeLengthLineEdit = QtGui.QLineEdit(self.formLayoutWidget_4)
+ self.fileTimeLengthLineEdit.setObjectName("fileTimeLengthLineEdit")
+ self.fileTimeLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.fileTimeLengthLineEdit)
+ self.sysGroupBox = QtGui.QGroupBox(self.filePosBox)
+ self.sysGroupBox.setGeometry(QtCore.QRect(530, 0, 200, 120))
+ self.sysGroupBox.setMinimumSize(QtCore.QSize(200, 0))
+ self.sysGroupBox.setObjectName("sysGroupBox")
+ self.formLayoutWidget_3 = QtGui.QWidget(self.sysGroupBox)
+ self.formLayoutWidget_3.setGeometry(QtCore.QRect(0, 20, 191, 91))
+ self.formLayoutWidget_3.setObjectName("formLayoutWidget_3")
+ self.formLayout_2 = QtGui.QFormLayout(self.formLayoutWidget_3)
+ self.formLayout_2.setObjectName("formLayout_2")
+ self.sampleRateLabel = QtGui.QLabel(self.formLayoutWidget_3)
+ self.sampleRateLabel.setObjectName("sampleRateLabel")
+ self.formLayout_2.setWidget(0, QtGui.QFormLayout.LabelRole, self.sampleRateLabel)
+ self.sampleRateLineEdit = QtGui.QLineEdit(self.formLayoutWidget_3)
+ self.sampleRateLineEdit.setMinimumSize(QtCore.QSize(0, 0))
+ self.sampleRateLineEdit.setObjectName("sampleRateLineEdit")
+ self.formLayout_2.setWidget(0, QtGui.QFormLayout.FieldRole, self.sampleRateLineEdit)
+ self.displayGroupBox = QtGui.QGroupBox(self.filePosBox)
+ self.displayGroupBox.setGeometry(QtCore.QRect(730, 0, 170, 120))
+ self.displayGroupBox.setMinimumSize(QtCore.QSize(170, 0))
+ self.displayGroupBox.setObjectName("displayGroupBox")
+ self.verticalLayoutWidget = QtGui.QWidget(self.displayGroupBox)
+ self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 20, 160, 91))
+ self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
+ self.verticalLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.colorComboBox = QtGui.QComboBox(self.verticalLayoutWidget)
+ self.colorComboBox.setObjectName("colorComboBox")
+ self.verticalLayout.addWidget(self.colorComboBox)
+ spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.verticalLayout.addItem(spacerItem)
+ self.gridLayout.addWidget(self.filePosBox, 3, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 927, 24))
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 927, 25))
self.menubar.setObjectName("menubar")
self.menu_File = QtGui.QMenu(self.menubar)
self.menu_File.setObjectName("menu_File")
@@ -220,30 +184,28 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
+ self.tabGroup.setTabText(self.tabGroup.indexOf(self.timeTab), QtGui.QApplication.translate("MainWindow", "Time Domain", None, QtGui.QApplication.UnicodeUTF8))
+ self.fftPropBox.setTitle(QtGui.QApplication.translate("MainWindow", "FFT Properties", None, QtGui.QApplication.UnicodeUTF8))
+ self.psdFFTSizeLabel.setText(QtGui.QApplication.translate("MainWindow", "FFT Size", None, QtGui.QApplication.UnicodeUTF8))
+ self.tabGroup.setTabText(self.tabGroup.indexOf(self.freqTab), QtGui.QApplication.translate("MainWindow", "Frequency Domain", None, QtGui.QApplication.UnicodeUTF8))
+ self.groupBox.setTitle(QtGui.QApplication.translate("MainWindow", "Spectrogram Properties", None, QtGui.QApplication.UnicodeUTF8))
+ self.specFFTLabel.setText(QtGui.QApplication.translate("MainWindow", "FFT Size", None, QtGui.QApplication.UnicodeUTF8))
+ self.tabGroup.setTabText(self.tabGroup.indexOf(self.specTab), QtGui.QApplication.translate("MainWindow", "Spectrogram", None, QtGui.QApplication.UnicodeUTF8))
self.filePosBox.setTitle(QtGui.QApplication.translate("MainWindow", "File Position", None, QtGui.QApplication.UnicodeUTF8))
+ self.filePosStartLabel.setText(QtGui.QApplication.translate("MainWindow", "Start", None, QtGui.QApplication.UnicodeUTF8))
self.filePosStopLabel.setText(QtGui.QApplication.translate("MainWindow", "Stop", None, QtGui.QApplication.UnicodeUTF8))
self.filePosLengthLabel.setText(QtGui.QApplication.translate("MainWindow", "Length", None, QtGui.QApplication.UnicodeUTF8))
- self.filePosStartLabel.setText(QtGui.QApplication.translate("MainWindow", "Start", None, QtGui.QApplication.UnicodeUTF8))
self.fileTimeStartLabel.setText(QtGui.QApplication.translate("MainWindow", "time start (sec)", None, QtGui.QApplication.UnicodeUTF8))
self.fileTimeStopLabel.setText(QtGui.QApplication.translate("MainWindow", "time stop (sec)", None, QtGui.QApplication.UnicodeUTF8))
self.fileTimeLengthLabel.setText(QtGui.QApplication.translate("MainWindow", "time length (sec)", None, QtGui.QApplication.UnicodeUTF8))
- self.displayGroupBox.setTitle(QtGui.QApplication.translate("MainWindow", "Display Properties", None, QtGui.QApplication.UnicodeUTF8))
- self.lineWidthLabel.setText(QtGui.QApplication.translate("MainWindow", "Line Width", None, QtGui.QApplication.UnicodeUTF8))
- self.lineStyleLabel.setText(QtGui.QApplication.translate("MainWindow", "Line Style", None, QtGui.QApplication.UnicodeUTF8))
- self.styleSizeLabel.setText(QtGui.QApplication.translate("MainWindow", "Style Size", None, QtGui.QApplication.UnicodeUTF8))
self.sysGroupBox.setTitle(QtGui.QApplication.translate("MainWindow", "System Properties", None, QtGui.QApplication.UnicodeUTF8))
self.sampleRateLabel.setText(QtGui.QApplication.translate("MainWindow", "Sample Rate", None, QtGui.QApplication.UnicodeUTF8))
- self.tabGroup.setTabText(self.tabGroup.indexOf(self.timeTab), QtGui.QApplication.translate("MainWindow", "Time Domain", None, QtGui.QApplication.UnicodeUTF8))
- self.fftPropBox.setTitle(QtGui.QApplication.translate("MainWindow", "FFT Properties", None, QtGui.QApplication.UnicodeUTF8))
- self.psdFFTSizeLabel.setText(QtGui.QApplication.translate("MainWindow", "FFT Size", None, QtGui.QApplication.UnicodeUTF8))
- self.tabGroup.setTabText(self.tabGroup.indexOf(self.freqTab), QtGui.QApplication.translate("MainWindow", "Frequency Domain", None, QtGui.QApplication.UnicodeUTF8))
- self.groupBox.setTitle(QtGui.QApplication.translate("MainWindow", "Spectrogram Properties", None, QtGui.QApplication.UnicodeUTF8))
- self.specFFTLabel.setText(QtGui.QApplication.translate("MainWindow", "FFT Size", None, QtGui.QApplication.UnicodeUTF8))
- self.tabGroup.setTabText(self.tabGroup.indexOf(self.specTab), QtGui.QApplication.translate("MainWindow", "Spectrogram", None, QtGui.QApplication.UnicodeUTF8))
+ self.displayGroupBox.setTitle(QtGui.QApplication.translate("MainWindow", "Display Properties", None, QtGui.QApplication.UnicodeUTF8))
self.menu_File.setTitle(QtGui.QApplication.translate("MainWindow", "&File", None, QtGui.QApplication.UnicodeUTF8))
self.action_open.setText(QtGui.QApplication.translate("MainWindow", "&Open", None, QtGui.QApplication.UnicodeUTF8))
self.action_open.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+O", None, QtGui.QApplication.UnicodeUTF8))
self.action_exit.setText(QtGui.QApplication.translate("MainWindow", "E&xit", None, QtGui.QApplication.UnicodeUTF8))
self.action_reload.setText(QtGui.QApplication.translate("MainWindow", "&Reload", None, QtGui.QApplication.UnicodeUTF8))
+ self.action_reload.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+R", None, QtGui.QApplication.UnicodeUTF8))
from PyQt4 import Qwt5
diff --git a/gr-utils/src/python/pyqt_plot.ui b/gr-utils/src/python/pyqt_plot.ui
index 7244d24c9d..55c72fda26 100644
--- a/gr-utils/src/python/pyqt_plot.ui
+++ b/gr-utils/src/python/pyqt_plot.ui
@@ -1,488 +1,373 @@
-<ui version="4.0" >
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
<class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow" >
- <property name="geometry" >
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>927</width>
- <height>718</height>
+ <height>696</height>
</rect>
</property>
- <property name="windowTitle" >
+ <property name="windowTitle">
<string>MainWindow</string>
</property>
- <widget class="QWidget" name="centralwidget" >
- <layout class="QGridLayout" name="gridLayout" >
- <item row="1" column="0" colspan="3" >
- <widget class="QScrollBar" name="plotHBar" >
- <property name="orientation" >
+ <widget class="QWidget" name="centralwidget">
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="2" column="0" colspan="2">
+ <widget class="QScrollBar" name="plotHBar">
+ <property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
- <item row="2" column="0" >
- <widget class="QGroupBox" name="filePosBox" >
- <property name="minimumSize" >
+ <item row="1" column="0">
+ <widget class="QTabWidget" name="tabGroup">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="timeTab">
+ <attribute name="title">
+ <string>Time Domain</string>
+ </attribute>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QwtPlot" name="timePlot"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="freqTab">
+ <attribute name="title">
+ <string>Frequency Domain</string>
+ </attribute>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QGroupBox" name="fftPropBox">
+ <property name="minimumSize">
+ <size>
+ <width>160</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>FFT Properties</string>
+ </property>
+ <layout class="QFormLayout" name="formLayout_4">
+ <property name="fieldGrowthPolicy">
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+ </property>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="psdFFTComboBox">
+ <property name="minimumSize">
+ <size>
+ <width>96</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>96</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="psdFFTSizeLabel">
+ <property name="text">
+ <string>FFT Size</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QwtPlot" name="freqPlot"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="specTab">
+ <attribute name="title">
+ <string>Spectrogram</string>
+ </attribute>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Spectrogram Properties</string>
+ </property>
+ <layout class="QFormLayout" name="formLayout_3">
+ <item row="1" column="0">
+ <widget class="QLabel" name="specFFTLabel">
+ <property name="text">
+ <string>FFT Size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QComboBox" name="specFFTComboBox">
+ <property name="minimumSize">
+ <size>
+ <width>96</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>96</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QwtPlot" name="specPlot"/>
+ </item>
+ </layout>
+ <zorder>specPlot</zorder>
+ <zorder>groupBox</zorder>
+ </widget>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QGroupBox" name="filePosBox">
+ <property name="minimumSize">
<size>
<width>0</width>
<height>120</height>
</size>
</property>
- <property name="title" >
+ <property name="title">
<string>File Position</string>
</property>
- <layout class="QGridLayout" name="gridLayout_4" >
- <item row="0" column="0" >
- <layout class="QFormLayout" name="filePosLayout" >
- <item row="0" column="1" >
- <widget class="QLineEdit" name="filePosStartLineEdit" >
- <property name="minimumSize" >
- <size>
- <width>50</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>100</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="1" column="0" >
- <widget class="QLabel" name="filePosStopLabel" >
- <property name="text" >
- <string>Stop</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1" >
- <widget class="QLineEdit" name="filePosStopLineEdit" >
- <property name="minimumSize" >
- <size>
- <width>50</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>100</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="2" column="0" >
- <widget class="QLabel" name="filePosLengthLabel" >
- <property name="text" >
- <string>Length</string>
+ <widget class="QWidget" name="formLayoutWidget_2">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>20</y>
+ <width>160</width>
+ <height>92</height>
+ </rect>
+ </property>
+ <layout class="QFormLayout" name="filePosLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="filePosStartLabel">
+ <property name="text">
+ <string>Start</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="filePosStartLineEdit"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="filePosStopLabel">
+ <property name="text">
+ <string>Stop</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="filePosStopLineEdit"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="filePosLengthLabel">
+ <property name="text">
+ <string>Length</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="filePosLengthLineEdit"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="formLayoutWidget_4">
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>20</y>
+ <width>231</width>
+ <height>92</height>
+ </rect>
+ </property>
+ <layout class="QFormLayout" name="fileTimeLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="fileTimeStartLabel">
+ <property name="text">
+ <string>time start (sec)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="fileTimeStartLineEdit"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="fileTimeStopLabel">
+ <property name="text">
+ <string>time stop (sec)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="fileTimeStopLineEdit"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="fileTimeLengthLabel">
+ <property name="text">
+ <string>time length (sec)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="fileTimeLengthLineEdit"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QGroupBox" name="sysGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>530</x>
+ <y>0</y>
+ <width>200</width>
+ <height>120</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>200</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>System Properties</string>
+ </property>
+ <widget class="QWidget" name="formLayoutWidget_3">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>20</y>
+ <width>191</width>
+ <height>91</height>
+ </rect>
+ </property>
+ <layout class="QFormLayout" name="formLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="sampleRateLabel">
+ <property name="text">
+ <string>Sample Rate</string>
</property>
</widget>
</item>
- <item row="2" column="1" >
- <widget class="QLineEdit" name="filePosLengthLineEdit" >
- <property name="minimumSize" >
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="sampleRateLineEdit">
+ <property name="minimumSize">
<size>
- <width>50</width>
+ <width>0</width>
<height>0</height>
</size>
</property>
- <property name="maximumSize" >
- <size>
- <width>100</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="0" column="0" >
- <widget class="QLabel" name="filePosStartLabel" >
- <property name="text" >
- <string>Start</string>
- </property>
</widget>
</item>
</layout>
- </item>
- <item row="0" column="1" >
- <layout class="QFormLayout" name="fileTimeLayout" >
- <item row="0" column="0" >
- <widget class="QLabel" name="fileTimeStartLabel" >
- <property name="text" >
- <string>time start (sec)</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QLineEdit" name="fileTimeStartLineEdit" >
- <property name="minimumSize" >
- <size>
- <width>50</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>100</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="1" column="0" >
- <widget class="QLabel" name="fileTimeStopLabel" >
- <property name="text" >
- <string>time stop (sec)</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1" >
- <widget class="QLineEdit" name="fileTimeStopLineEdit" >
- <property name="minimumSize" >
- <size>
- <width>50</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>100</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="2" column="0" >
- <widget class="QLabel" name="fileTimeLengthLabel" >
- <property name="text" >
- <string>time length (sec)</string>
- </property>
- </widget>
+ </widget>
+ </widget>
+ <widget class="QGroupBox" name="displayGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>730</x>
+ <y>0</y>
+ <width>170</width>
+ <height>120</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>170</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>Display Properties</string>
+ </property>
+ <widget class="QWidget" name="verticalLayoutWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>20</y>
+ <width>160</width>
+ <height>91</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QComboBox" name="colorComboBox"/>
</item>
- <item row="2" column="1" >
- <widget class="QLineEdit" name="fileTimeLengthLineEdit" >
- <property name="minimumSize" >
- <size>
- <width>50</width>
- <height>0</height>
- </size>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
</property>
- <property name="maximumSize" >
+ <property name="sizeHint" stdset="0">
<size>
- <width>100</width>
- <height>16777215</height>
+ <width>20</width>
+ <height>40</height>
</size>
</property>
- </widget>
+ </spacer>
</item>
</layout>
- </item>
- </layout>
- </widget>
- </item>
- <item row="2" column="2" >
- <widget class="QGroupBox" name="displayGroupBox" >
- <property name="minimumSize" >
- <size>
- <width>170</width>
- <height>0</height>
- </size>
- </property>
- <property name="title" >
- <string>Display Properties</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2" >
- <item row="0" column="0" colspan="2" >
- <widget class="QComboBox" name="colorComboBox" />
- </item>
- <item row="1" column="1" >
- <widget class="QSpinBox" name="lineWidthSpinBox" >
- <property name="minimumSize" >
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>100</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="1" column="0" >
- <widget class="QLabel" name="lineWidthLabel" >
- <property name="text" >
- <string>Line Width</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0" >
- <widget class="QLabel" name="lineStyleLabel" >
- <property name="text" >
- <string>Line Style</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1" >
- <widget class="QComboBox" name="lineStyleComboBox" >
- <property name="minimumSize" >
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>100</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="3" column="0" >
- <widget class="QLabel" name="styleSizeLabel" >
- <property name="text" >
- <string>Style Size</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1" >
- <widget class="QSpinBox" name="styleSizeSpinBox" >
- <property name="minimumSize" >
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>100</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="2" column="1" >
- <widget class="QGroupBox" name="sysGroupBox" >
- <property name="minimumSize" >
- <size>
- <width>200</width>
- <height>0</height>
- </size>
- </property>
- <property name="title" >
- <string>System Properties</string>
- </property>
- <layout class="QFormLayout" name="formLayout" >
- <property name="fieldGrowthPolicy" >
- <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
- </property>
- <item row="0" column="0" >
- <widget class="QLabel" name="sampleRateLabel" >
- <property name="text" >
- <string>Sample Rate</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QLineEdit" name="sampleRateLineEdit" >
- <property name="minimumSize" >
- <size>
- <width>50</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>100</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="0" column="0" colspan="3" >
- <widget class="QFrame" name="frame" >
- <property name="frameShape" >
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow" >
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout_3" >
- <item row="0" column="0" >
- <widget class="QTabWidget" name="tabGroup" >
- <property name="minimumSize" >
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="currentIndex" >
- <number>0</number>
- </property>
- <widget class="QWidget" name="timeTab" >
- <attribute name="title" >
- <string>Time Domain</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout" >
- <item>
- <widget class="QwtPlot" name="timePlot" />
- </item>
- </layout>
- <zorder>timePlot</zorder>
- </widget>
- <widget class="QWidget" name="freqTab" >
- <attribute name="title" >
- <string>Frequency Domain</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_2" >
- <item>
- <widget class="QGroupBox" name="fftPropBox" >
- <property name="minimumSize" >
- <size>
- <width>160</width>
- <height>0</height>
- </size>
- </property>
- <property name="title" >
- <string>FFT Properties</string>
- </property>
- <layout class="QFormLayout" name="formLayout_4" >
- <property name="fieldGrowthPolicy" >
- <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
- </property>
- <item row="0" column="0" >
- <widget class="QLabel" name="psdFFTSizeLabel" >
- <property name="text" >
- <string>FFT Size</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QComboBox" name="psdFFTComboBox" >
- <property name="minimumSize" >
- <size>
- <width>96</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>96</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- </layout>
- <zorder>psdFFTSizeLabel</zorder>
- <zorder>psdFFTComboBox</zorder>
- </widget>
- </item>
- <item>
- <widget class="QwtPlot" name="freqPlot" />
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="specTab" >
- <attribute name="title" >
- <string>Spectrogram</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_3" >
- <item>
- <widget class="QGroupBox" name="groupBox" >
- <property name="title" >
- <string>Spectrogram Properties</string>
- </property>
- <layout class="QFormLayout" name="formLayout_3" >
- <item row="1" column="0" >
- <widget class="QLabel" name="specFFTLabel" >
- <property name="text" >
- <string>FFT Size</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1" >
- <widget class="QComboBox" name="specFFTComboBox" >
- <property name="minimumSize" >
- <size>
- <width>96</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>96</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QwtPlot" name="specPlot" />
- </item>
- </layout>
- <zorder>specPlot</zorder>
- <zorder>groupBox</zorder>
- </widget>
- </widget>
- </item>
- </layout>
- <zorder>tabGroup</zorder>
+ </widget>
+ </widget>
</widget>
</item>
</layout>
</widget>
- <widget class="QMenuBar" name="menubar" >
- <property name="geometry" >
+ <widget class="QMenuBar" name="menubar">
+ <property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>927</width>
- <height>24</height>
+ <height>25</height>
</rect>
</property>
- <widget class="QMenu" name="menu_File" >
- <property name="title" >
+ <widget class="QMenu" name="menu_File">
+ <property name="title">
<string>&amp;File</string>
</property>
- <addaction name="action_open" />
- <addaction name="action_reload" />
- <addaction name="action_exit" />
+ <addaction name="action_open"/>
+ <addaction name="action_reload"/>
+ <addaction name="action_exit"/>
</widget>
- <addaction name="menu_File" />
+ <addaction name="menu_File"/>
</widget>
- <widget class="QStatusBar" name="statusbar" />
- <action name="action_open" >
- <property name="text" >
+ <widget class="QStatusBar" name="statusbar"/>
+ <action name="action_open">
+ <property name="text">
<string>&amp;Open</string>
</property>
- <property name="shortcut" >
+ <property name="shortcut">
<string>Ctrl+O</string>
</property>
</action>
- <action name="action_exit" >
- <property name="text" >
+ <action name="action_exit">
+ <property name="text">
<string>E&amp;xit</string>
</property>
</action>
- <action name="action_reload" >
- <property name="text" >
+ <action name="action_reload">
+ <property name="text">
<string>&amp;Reload</string>
</property>
+ <property name="shortcut">
+ <string>Ctrl+R</string>
+ </property>
</action>
</widget>
<customwidgets>
@@ -500,11 +385,11 @@
<receiver>MainWindow</receiver>
<slot>close()</slot>
<hints>
- <hint type="sourcelabel" >
+ <hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
- <hint type="destinationlabel" >
+ <hint type="destinationlabel">
<x>399</x>
<y>347</y>
</hint>
diff --git a/grc/Makefile.am b/grc/Makefile.am
index 28408c4a83..30b955a1ef 100644
--- a/grc/Makefile.am
+++ b/grc/Makefile.am
@@ -25,7 +25,6 @@ if PYTHON
SUBDIRS = \
base \
blocks \
- examples \
grc_gnuradio \
gui \
python \
diff --git a/grc/blocks/Makefile.am b/grc/blocks/Makefile.am
index 7d0876b2f2..61c0038038 100644
--- a/grc/blocks/Makefile.am
+++ b/grc/blocks/Makefile.am
@@ -145,6 +145,7 @@ dist_ourdata_DATA = \
gr_packed_to_unpacked_xx.xml \
gr_peak_detector2_fb.xml \
gr_peak_detector_xb.xml \
+ gr_pfb_clock_sync.xml \
gr_phase_modulator_fc.xml \
gr_pll_carriertracking_cc.xml \
gr_pll_freqdet_cf.xml \
diff --git a/grc/blocks/block_tree.xml b/grc/blocks/block_tree.xml
index 444d922eda..187ca196a1 100644
--- a/grc/blocks/block_tree.xml
+++ b/grc/blocks/block_tree.xml
@@ -126,6 +126,7 @@
<cat>
<name>Synchronizers</name>
<block>gr_clock_recovery_mm_xx</block>
+ <block>gr_pfb_clock_sync_ccf</block>
<block>gr_costas_loop_cc</block>
<block>gr_dd_mpsk_sync_cc</block>
@@ -169,7 +170,7 @@
<block>band_pass_filter</block>
<block>band_reject_filter</block>
<block>root_raised_cosine_filter</block>
- <!-- Filters that take taps as aruments -->
+ <!-- Filters that take taps as arguments -->
<block>gr_fir_filter_xxx</block>
<block>gr_interp_fir_filter_xxx</block>
<block>gr_fft_filter_xxx</block>
@@ -180,7 +181,7 @@
<!-- Filter banks -->
<block>blks2_synthesis_filterbank</block>
<block>blks2_analysis_filterbank</block>
- <!-- Polyphase filers -->
+ <!-- Polyphase filters -->
<block>blks2_pfb_arb_resampler_ccf</block>
<!-- Other filters -->
<block>gr_single_pole_iir_filter_xx</block>
diff --git a/grc/blocks/gr_pfb_clock_sync.xml b/grc/blocks/gr_pfb_clock_sync.xml
new file mode 100644
index 0000000000..9cb909acd1
--- /dev/null
+++ b/grc/blocks/gr_pfb_clock_sync.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## Polyphase Filter based Clock Sync
+###################################################
+ -->
+<block>
+ <name>Polyphase Clock Sync</name>
+ <key>gr_pfb_clock_sync_ccf</key>
+ <import>from gnuradio import gr</import>
+ <make>gr.pfb_clock_sync_ccf($sps, $alpha, $taps, $filter_size, $init_phase, $max_dev)
+self.$(id).set_beta($beta)</make>
+ <callback>set_taps($taps)</callback>
+ <callback>set_alpha($alpha)</callback>
+ <callback>set_beta($beta)</callback>
+
+ <param>
+ <name>Samples/Symbol</name>
+ <key>sps</key>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Alpha</name>
+ <key>alpha</key>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Beta</name>
+ <key>beta</key>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Taps</name>
+ <key>taps</key>
+ <type>real_vector</type>
+ </param>
+ <param>
+ <name>Filter Size</name>
+ <key>filter_size</key>
+ <type>int</type>
+ </param>
+ <param>
+ <name>Initial Phase</name>
+ <key>init_phase</key>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Maximum Rate Deviation</name>
+ <key>max_dev</key>
+ <type>real</type>
+ </param>
+ <sink>
+ <name>in</name>
+ <type>complex</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>complex</type>
+ </source>
+ <source>
+ <name>err</name>
+ <type>float</type>
+ <optional>1</optional>
+ </source>
+ <source>
+ <name>rate</name>
+ <type>float</type>
+ <optional>1</optional>
+ </source>
+ <source>
+ <name>phase</name>
+ <type>float</type>
+ <optional>1</optional>
+ </source>
+</block>
diff --git a/grc/examples/audio/.gitignore b/grc/examples/audio/.gitignore
deleted file mode 100644
index b336cc7cec..0000000000
--- a/grc/examples/audio/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/Makefile
-/Makefile.in
diff --git a/grc/examples/simple/.gitignore b/grc/examples/simple/.gitignore
deleted file mode 100644
index b336cc7cec..0000000000
--- a/grc/examples/simple/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/Makefile
-/Makefile.in
diff --git a/grc/examples/trellis/.gitignore b/grc/examples/trellis/.gitignore
deleted file mode 100644
index b336cc7cec..0000000000
--- a/grc/examples/trellis/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/Makefile
-/Makefile.in
diff --git a/grc/examples/usrp/.gitignore b/grc/examples/usrp/.gitignore
deleted file mode 100644
index b336cc7cec..0000000000
--- a/grc/examples/usrp/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/Makefile
-/Makefile.in
diff --git a/grc/examples/xmlrpc/.gitignore b/grc/examples/xmlrpc/.gitignore
deleted file mode 100644
index b336cc7cec..0000000000
--- a/grc/examples/xmlrpc/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/Makefile
-/Makefile.in