[hamradio-commits] [liquid-dsp] 01/10: New upstream version 1.3.0

Andreas E. Bombe aeb at moszumanska.debian.org
Tue Jan 10 02:16:42 UTC 2017


This is an automated email from the git hooks/post-receive script.

aeb pushed a commit to branch master
in repository liquid-dsp.

commit ea1c8fecaa19e06239d5f4cc033b306945f42af6
Author: Andreas Bombe <aeb at debian.org>
Date:   Tue Jan 10 01:10:57 2017 +0100

    New upstream version 1.3.0
---
 HISTORY                                 |  79 ++++++++++--
 examples/channel_cccf_example.c         |  46 +++----
 examples/chromosome_example.c           |   2 +-
 examples/flexframesync_example.c        |  25 ++--
 examples/gasearch_example.c             |   2 +-
 examples/ofdmflexframesync_example.c    | 147 ++++++++-------------
 examples/ofdmframesync_example.c        |   4 +-
 examples/resamp2_crcf_example.c         |   2 +-
 examples/symtrack_cccf_example.c        |  10 +-
 include/liquid.h                        | 200 +++++++++++++++-------------
 include/liquid.internal.h               |  12 +-
 makefile.in                             |   1 +
 sandbox/fft_r2r_test.c                  |   2 +
 sandbox/fskmodem_test.c                 |   4 +-
 sandbox/gmskmodem_coherent_test.c       |   4 +-
 sandbox/gmskmodem_equalizer_test.c      |  14 +-
 sandbox/mskmodem_test.c                 |   4 +-
 sandbox/resamp2_crcf_filterbank_test.c  |   2 +-
 sandbox/shadowing_test.c                |  13 +-
 src/buffer/src/cbuffer.c                |   4 +-
 src/buffer/src/wdelay.c                 |   4 +-
 src/buffer/src/window.c                 |  10 +-
 src/buffer/tests/window_autotest.c      |   4 +-
 src/channel/src/channel.c               | 169 ++++++++----------------
 src/channel/src/tvmpch.c                |   2 +-
 src/equalization/src/eqlms.c            |   4 +-
 src/equalization/src/eqrls.c            |   2 +-
 src/fec/src/packetizer.c                |  19 ++-
 src/filter/src/autocorr.c               |   4 +-
 src/filter/src/firdecim.c               |   6 +-
 src/filter/src/firfarrow.c              |   2 +-
 src/filter/src/firfilt.c                |   2 +-
 src/filter/src/firhilb.c                |   6 +-
 src/filter/src/firpfb.c                 |  27 +++-
 src/filter/src/msresamp2.c              |   2 +-
 src/filter/src/resamp2.c                |   8 +-
 src/framing/src/bpacketsync.c           |   2 +-
 src/framing/src/detector_cccf.c         |   4 +-
 src/framing/src/flexframegen.c          |   5 +-
 src/framing/src/flexframesync.c         |  63 ++++-----
 src/framing/src/gmskframesync.c         |   2 +-
 src/framing/src/ofdmflexframegen.c      | 222 +++++++++++++++++---------------
 src/framing/src/presync.c               |   4 +-
 src/multichannel/src/firpfbch.c         |   2 +-
 src/multichannel/src/firpfbch2.c        |   4 +-
 src/multichannel/src/ofdmframe.common.c |  56 +++++++-
 src/optim/src/chromosome.c              |   2 +-
 src/sequence/src/bsequence.c            |   4 +-
 src/sequence/src/msequence.c            |   2 +-
 49 files changed, 630 insertions(+), 590 deletions(-)

diff --git a/HISTORY b/HISTORY
index 704946b..bf91c15 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,43 +1,95 @@
 
-Major improvements since v1.2.0
-  * documentation
-    - added script to auto-generate code listings when pygmentize
-      is unavailable (not as good, but still functional)
+## Major improvements for v1.3.0 ##
+
+  * New MIT/X11 license (https://opensource.org/licenses/MIT)
+  * agc (automatic gain control)
+    - major code scrub, improved reliability, simplified interface
+    - block-level operation
+  * buffer
+    - new cbuffer objects for dynamic-sized circular buffering
+  * channel
+    - new module to define certain channel emulation objects
+    - new functionality includes carrier frequency/phase offsets,
+      (time-varying) multi-path, shadowing, and additive noise
   * dotprod
     - adding method to compute x^T * x of a vector (sum of squares)
-  * fft
+  * equalization
+    - improved interface for LMS and RLS equalizers
+    - simplified methods to support blind operation
+  * fec (forward error correctino)
+    - interleaver and packetizer moved from the framing to the fec module
+    - packetizer now includes data whitening
+  * fft (fast Fourier transform)
     - general speed improvements for one-dimensional FFTs
+    - completely reimplemented spgram (spectral periodogram) objects to
+      include both complex and real-values amples with simpler interface
+    - reimplemented asgram (ASCII spectral periodogram) objects
   * filter
+    - additional prototype create methods, block execution
+    - added new fftfilt family of objects to realize linear filter
+      with fast Fourier transforms
+    - interp family renamed to firinterp, new iirinterp family
+    - decim family renamed to firdecim, new iirdecim family
     - add linear interpolation for arbitrary resamp output
+    - new multi-stage half-band resampler family
+    - symsync: improved stability, added rate adjustment to help pull in
+      sample rate offsets
     - added autotests for validating performance of both the
       resamp and msresamp objects
-    - added new fftfilt family of objects to realize linear filter
-      with fast Fourier transforms
   * framing
+    - added `framedatastats` object for counting statistics across different
+      framing objects (e.g. number of total bytes received)
     - adding generic callback function definition for all framing
       structures
-    - adding pre-demodulator synchronizer/detector
+    - qpacketmodem: new object to easily combine modulating and encoding;
+      buffer of data in, modulated and encoded samples out
+    - qpilotgen/qpilotsync: new objects to add and synchronize pilot symbols
+      to modulated symbols to recover carrier frequency/phase, and gain
+    - framing objects: frame64, flexframe now use qpacketmodem, qpilotgen, and
+      qpilotsync objects for unified interface and vastly improved performance
+    - flexframe: vastly simplified interface
+    - qdetector: new family for pre-demodulator synchronizion and detection
     - moved interleaver and packetizer objects to `fec` module
-    - restructuring frame[gen|sync]64 and flexframe[gen|sync]
-      objects with vastly improved performance and reliability
+    - symstream: new family for generating random stream of modulated samples
+    - msource: new family for generating multiple signals for a single source,
+      including tones, noise, modulated symbols
+    - symtrack: new family for tracking a stream of symbols and recovering
+      signal level, timing, carrier frequency/phase without pilots
+  * math
+    - new windowing methods (e.g. 7-term Blackman-harris window)
   * matrix
     - adding smatrix family of objects (sparse matrices)
     - improving linear solver methods (roughly doubled speed)
   * modem
-    - re-organizing internal modem code (no interface change)
+    - re-organizing internal linear modem code (no interface change)
+    - freqmod/freqdem: new interface, block-level execution for analog FM
+    - cpfskmod/cpfskdem: new family for generic non-linear continuous-phase
+      frequency-shift modulation (e.g. minimum-shift keying)
+    - fskmod/fskdem: new family for non-coherent frequency-shift keying
+      modulation, often with many samples per symbol (e.g. 256-FSK)
   * multicarrier
     - adding OFDM framing option for window tapering
     - simplfying OFDM framing for generating preamble symbols (all
       generated OFDM symbols are the same length)
     - adding run-time option for debugging ofdmframesync
+    - adding method for initializing subcarriers with frequency range
+  * nco (numerically-controlled oscillator)
+    - general performance improvements, adding block-level execution
   * optim
     - gradsearch (gradient search) uses internal linesearch for
       significant speed increase and better reliability
     - gradsearch interface greatly simplified
+  * utility
+    - build no longer auto-generates tables at compile time (helps with cross
+      compilation)
   * vector
     - new module to simplify basic vector operations
+  * miscellany
+    - documentation moved from core repository to website
+    - global header file (`liquid.h`) include more structured source
+    - consistent naming of reset() methods for most objects
 
-Major improvements for v1.2.0
+## Major improvements for v1.2.0 ##
   * dotprod
     - leveraging SIMD extensions for vector operations (SSE2, SSE3)
   * fft
@@ -51,7 +103,8 @@ Major improvements for v1.2.0
       LIQUID_MODEM_QAM16
     - new type definitions for analog modems
 
-Major improvements for v1.1.0
+## Major improvements for v1.1.0 ##
+
   * build
     - simplifying build environment by explicitly defining object
       dependencies (no longer auto-generated; much faster now)
diff --git a/examples/channel_cccf_example.c b/examples/channel_cccf_example.c
index b4c5920..d400c9c 100644
--- a/examples/channel_cccf_example.c
+++ b/examples/channel_cccf_example.c
@@ -1,6 +1,14 @@
 //
 // channel_cccf_example.c
 //
+// This example demonstrates how the channel_cccf object can be used to
+// emulate a multi-path fading, log-normal shadowing, and AWGN channel.
+// A stream of modulated and interpolated symbols are generated using the
+// symstream object. The resulting samples are passed through a channel
+// to add various impairments. The symtrack object recovers timing,
+// carrier, and other information imparted by the channel and returns
+// data symbols ready for demodulation.
+//
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -26,13 +34,10 @@ void usage()
     printf("  n     : number of symbols,         default: 4000\n");
     printf("  s     : signal-to-noise ratio,     default: 30 dB\n");
     printf("  w     : timing pll bandwidth,      default: 0.02\n");
-    printf("  t     : timing phase offset [%% symbol], t in [-0.5,0.5], default: -0.2\n");
 }
 
-
-int main(int argc, char*argv[]) {
-    srand(time(NULL));
-
+int main(int argc, char*argv[])
+{
     // options
     unsigned int k           = 2;       // samples per symbol
     unsigned int m           = 7;       // filter delay (symbols)
@@ -42,14 +47,12 @@ int main(int argc, char*argv[]) {
     float        noise_floor = -60.0f;  // noise floor [dB]
     float        SNRdB       = 30.0f;   // signal-to-noise ratio [dB]
     float        bandwidth   =  0.02f;  // loop filter bandwidth
-    float        tau         = -0.2f;   // fractional symbol offset
-    float        rate        = 1.001f;  // sample rate offset
     float        dphi        =  0.00f;  // carrier frequency offset [radians/sample]
     float        phi         =  2.1f;   // carrier phase offset [radians]
     modulation_scheme ms     = LIQUID_MODEM_QPSK;
 
     int dopt;
-    while ((dopt = getopt(argc,argv,"hk:m:b:H:n:s:w:t:r:")) != EOF) {
+    while ((dopt = getopt(argc,argv,"hk:m:b:H:n:s:w:")) != EOF) {
         switch (dopt) {
         case 'h':   usage();                        return 0;
         case 'k':   k           = atoi(optarg);     break;
@@ -59,8 +62,6 @@ int main(int argc, char*argv[]) {
         case 'n':   num_symbols = atoi(optarg);     break;
         case 's':   SNRdB       = atof(optarg);     break;
         case 'w':   bandwidth   = atof(optarg);     break;
-        case 't':   tau         = atof(optarg);     break;
-        case 'r':   rate        = atof(optarg);     break;
         default:
             exit(1);
         }
@@ -82,29 +83,22 @@ int main(int argc, char*argv[]) {
     } else if (num_symbols == 0) {
         fprintf(stderr,"error: number of symbols must be greater than 0\n");
         exit(1);
-    } else if (tau < -1.0f || tau > 1.0f) {
-        fprintf(stderr,"error: timing phase offset must be in [-1,1]\n");
-        exit(1);
-    } else if (rate > 1.02f || rate < 0.98f) {
-        fprintf(stderr,"error: timing rate offset must be in [1.02,0.98]\n");
-        exit(1);
     }
 
     unsigned int i;
 
     // derived/fixed values
-    unsigned int nx = num_symbols*k;
-    unsigned int ny = (unsigned int) ceilf(rate * nx) + 64;
+    unsigned int num_samples = num_symbols*k;
 
-    float complex x[nx];    // input (interpolated) samples
-    float complex y[ny];    // channel output samples
+    float complex x[num_samples];    // input (interpolated) samples
+    float complex y[num_samples];    // channel output samples
     float complex sym_out[num_symbols + 64];// synchronized symbols
 
     // 
     // generate input sequence using symbol stream generator
     //
     symstreamcf gen = symstreamcf_create_linear(LIQUID_FIRFILT_ARKAISER,k,m,beta,ms);
-    symstreamcf_write_samples(gen, x, nx);
+    symstreamcf_write_samples(gen, x, num_samples);
     symstreamcf_destroy(gen);
 
     // create channel
@@ -115,13 +109,12 @@ int main(int argc, char*argv[]) {
     channel_cccf_add_carrier_offset(channel, dphi, phi);
     channel_cccf_add_multipath     (channel, NULL, hc_len);
     channel_cccf_add_shadowing     (channel, 1.0f, 0.1f);
-    channel_cccf_add_resamp        (channel, 0.0f, rate);
 
     // print channel internals
     channel_cccf_print(channel);
 
     // apply channel to input signal
-    channel_cccf_execute(channel, x, nx, y, &ny);
+    channel_cccf_execute_block(channel, x, num_samples, y);
 
     // destroy channel
     channel_cccf_destroy(channel);
@@ -129,14 +122,13 @@ int main(int argc, char*argv[]) {
     // 
     // create and run symbol synchronizer
     //
-
     symtrack_cccf symtrack = symtrack_cccf_create(LIQUID_FIRFILT_RRC,k,m,beta,ms);
     
     // set tracking bandwidth
     symtrack_cccf_set_bandwidth(symtrack,0.05f);
 
     unsigned int num_symbols_sync = 0;
-    symtrack_cccf_execute_block(symtrack, y, ny, sym_out, &num_symbols_sync);
+    symtrack_cccf_execute_block(symtrack, y, num_samples, sym_out, &num_symbols_sync);
     symtrack_cccf_destroy(symtrack);
 
     // print results
@@ -146,16 +138,14 @@ int main(int argc, char*argv[]) {
     // estimate spectrum
     unsigned int nfft = 1200;
     float        psd[nfft];
-    spgramcf_estimate_psd(nfft, y, ny, psd);
+    spgramcf_estimate_psd(nfft, y, num_samples, psd);
 
     //
     // export output file
     //
-
     FILE * fid = fopen(OUTPUT_FILENAME,"w");
     fprintf(fid,"%% %s, auto-generated file\n\n", OUTPUT_FILENAME);
     fprintf(fid,"close all;\nclear all;\n\n");
-
     fprintf(fid,"num_symbols=%u;\n",num_symbols_sync);
 
     for (i=0; i<num_symbols_sync; i++)
diff --git a/examples/chromosome_example.c b/examples/chromosome_example.c
index 09e37f3..5df7a16 100644
--- a/examples/chromosome_example.c
+++ b/examples/chromosome_example.c
@@ -72,7 +72,7 @@ int main() {
 
     unsigned int i;
     for (i=0; i<24; i++) {
-        chromosome_clear(c);
+        chromosome_reset(c);
         chromosome_mutate(c,i);
         // 0000 01000000 00000000 0000
         chromosome_print(c);
diff --git a/examples/flexframesync_example.c b/examples/flexframesync_example.c
index 98d6f71..bbda1d1 100644
--- a/examples/flexframesync_example.c
+++ b/examples/flexframesync_example.c
@@ -31,7 +31,7 @@ void usage()
     printf("  u/h   : print usage\n");
     printf("  s     : signal-to-noise ratio [dB], default: 20\n");
     printf("  F     : carrier frequency offset, default: 0.01\n");
-    printf("  n     : payload length [bytes], default: 120\n");
+    printf("  n     : payload length [bytes], default: 480\n");
     printf("  m     : modulation scheme (qpsk default)\n");
     liquid_print_modulation_schemes();
     printf("  v     : data integrity check: crc32 default\n");
@@ -60,7 +60,7 @@ int main(int argc, char *argv[])
     crc_scheme check         =  LIQUID_CRC_32;     // data validity check
     fec_scheme fec0          =  LIQUID_FEC_NONE;   // fec (inner)
     fec_scheme fec1          =  LIQUID_FEC_NONE;   // fec (outer)
-    unsigned int payload_len =  120;               // payload length
+    unsigned int payload_len =  480;               // payload length
     int debug_enabled        =  0;                 // enable debugging?
     float noise_floor        = -60.0f;             // noise floor
     float SNRdB              =  20.0f;             // signal-to-noise ratio
@@ -99,23 +99,13 @@ int main(int argc, char *argv[])
     fgprops.fec1        = fec1;
     flexframegen fg = flexframegen_create(&fgprops);
 
-    // frame data (header and payload)
-    unsigned char header[14];
-    unsigned char payload[payload_len];
-
     // create flexframesync object
     flexframesync fs = flexframesync_create(callback,NULL);
     if (debug_enabled)
         flexframesync_debug_enable(fs);
 
-    // initialize header, payload
-    for (i=0; i<14; i++)
-        header[i] = i;
-    for (i=0; i<payload_len; i++)
-        payload[i] = rand() & 0xff;
-
-    // assemble the frame
-    flexframegen_assemble(fg, header, payload, payload_len);
+    // assemble the frame (NULL pointers for default values)
+    flexframegen_assemble(fg, NULL, NULL, payload_len);
     flexframegen_print(fg);
 
     // generate the frame in blocks
@@ -166,10 +156,17 @@ static int callback(unsigned char *  _header,
 {
     printf("******** callback invoked\n");
 
+    // count bit errors (assuming all-zero message)
+    unsigned int bit_errors = 0;
+    unsigned int i;
+    for (i=0; i<_payload_len; i++)
+        bit_errors += liquid_count_ones(_payload[i]);
+
     framesyncstats_print(&_stats);
     printf("    header crc          :   %s\n", _header_valid ?  "pass" : "FAIL");
     printf("    payload length      :   %u\n", _payload_len);
     printf("    payload crc         :   %s\n", _payload_valid ?  "pass" : "FAIL");
+    printf("    payload bit errors  :   %u / %u\n", bit_errors, 8*_payload_len);
 
     return 0;
 }
diff --git a/examples/gasearch_example.c b/examples/gasearch_example.c
index e10a2f5..677bb3f 100644
--- a/examples/gasearch_example.c
+++ b/examples/gasearch_example.c
@@ -104,7 +104,7 @@ float utility_callback(void * _userdata, chromosome _c)
         u += v;
     }
 
-    return sqrtf(fabsf(u-1.0));
+    return sqrtf(fabsf(u-1.0f));
 }
 
 // peak callback function; value nearest {0.5, 0.5, 0.5, ...}
diff --git a/examples/ofdmflexframesync_example.c b/examples/ofdmflexframesync_example.c
index a030eb6..a834929 100644
--- a/examples/ofdmflexframesync_example.c
+++ b/examples/ofdmflexframesync_example.c
@@ -16,20 +16,20 @@
 void usage()
 {
     printf("ofdmflexframesync_example [options]\n");
-    printf("  u/h   : print usage\n");
-    printf("  s     : signal-to-noise ratio [dB], default: 20\n");
-    printf("  F     : carrier frequency offset, default: 0.002\n");
-    printf("  M     : number of subcarriers (must be even), default: 64\n");
-    printf("  C     : cyclic prefix length, default: 16\n");
-    printf("  n     : payload length [bytes], default: 120\n");
-    printf("  m     : modulation scheme (qpsk default)\n");
+    printf(" -h        : print usage\n");
+    printf(" -s  <snr> : signal-to-noise ratio [dB], default: 20\n");
+    printf(" -F <freq> : carrier frequency offset, default: 0.002\n");
+    printf(" -M  <num> : number of subcarriers (must be even), default: 64\n");
+    printf(" -C  <len> : cyclic prefix length, default: 16\n");
+    printf(" -n  <len> : payload length [bytes], default: 120\n");
+    printf(" -m  <mod> : modulation scheme (qpsk default)\n");
     liquid_print_modulation_schemes();
-    printf("  v     : data integrity check: crc32 default\n");
+    printf(" -v  <crc> : data integrity check: crc32 default\n");
     liquid_print_crc_schemes();
-    printf("  c     : coding scheme (inner): h74 default\n");
-    printf("  k     : coding scheme (outer): none default\n");
+    printf(" -c  <fec> : coding scheme (inner): h74 default\n");
+    printf(" -k  <fec> : coding scheme (outer): none default\n");
     liquid_print_fec_schemes();
-    printf("  d     : enable debugging\n");
+    printf(" -d       : enable debugging\n");
 }
 
 // callback function
@@ -43,65 +43,38 @@ int callback(unsigned char *  _header,
 
 int main(int argc, char*argv[])
 {
-    srand(time(NULL));
+    //srand(time(NULL));
 
     // options
-    unsigned int M = 64;                // number of subcarriers
-    unsigned int cp_len = 16;           // cyclic prefix length
-    unsigned int taper_len = 4;         // taper length
-    unsigned int payload_len = 120;     // length of payload (bytes)
-    modulation_scheme ms = LIQUID_MODEM_QPSK;
-    fec_scheme fec0  = LIQUID_FEC_NONE;
-    fec_scheme fec1  = LIQUID_FEC_HAMMING128;
-    crc_scheme check = LIQUID_CRC_32;
-    float noise_floor = -30.0f;         // noise floor [dB]
-    float SNRdB = 20.0f;                // signal-to-noise ratio [dB]
-    float dphi = 0.02f;                 // carrier frequency offset
-    int debug_enabled =  0;             // enable debugging?
+    unsigned int      M           = 64;                 // number of subcarriers
+    unsigned int      cp_len      = 16;                 // cyclic prefix length
+    unsigned int      taper_len   = 4;                  // taper length
+    unsigned int      payload_len = 120;                // length of payload (bytes)
+    modulation_scheme ms          = LIQUID_MODEM_QPSK;  // modulation scheme
+    fec_scheme        fec0        = LIQUID_FEC_NONE;    // inner code
+    fec_scheme        fec1        = LIQUID_FEC_HAMMING128; // outer code
+    crc_scheme        check       = LIQUID_CRC_32;      // validity check
+    float             noise_floor = -80.0f;             // noise floor [dB]
+    float             SNRdB       = 20.0f;              // signal-to-noise ratio [dB]
+    float             dphi        = 0.02f;              // carrier frequency offset
+    int               debug       =  0;                 // enable debugging?
 
     // get options
     int dopt;
     while((dopt = getopt(argc,argv,"uhds:F:M:C:n:m:v:c:k:")) != EOF){
         switch (dopt) {
         case 'u':
-        case 'h': usage();                      return 0;
-        case 'd': debug_enabled = 1;            break;
-        case 's': SNRdB         = atof(optarg); break;
-        case 'F': dphi          = atof(optarg); break;
-        case 'M': M             = atoi(optarg); break;
-        case 'C': cp_len        = atoi(optarg); break;
-        case 'n': payload_len   = atol(optarg); break;
-        case 'm':
-            ms = liquid_getopt_str2mod(optarg);
-            if (ms == LIQUID_MODEM_UNKNOWN) {
-                fprintf(stderr,"error: %s, unknown/unsupported mod. scheme: %s\n", argv[0], optarg);
-                exit(-1);
-            }
-            break;
-        case 'v':
-            // data integrity check
-            check = liquid_getopt_str2crc(optarg);
-            if (check == LIQUID_CRC_UNKNOWN) {
-                fprintf(stderr,"error: unknown/unsupported CRC scheme \"%s\"\n\n",optarg);
-                exit(1);
-            }
-            break;
-        case 'c':
-            // inner FEC scheme
-            fec0 = liquid_getopt_str2fec(optarg);
-            if (fec0 == LIQUID_FEC_UNKNOWN) {
-                fprintf(stderr,"error: unknown/unsupported inner FEC scheme \"%s\"\n\n",optarg);
-                exit(1);
-            }
-            break;
-        case 'k':
-            // outer FEC scheme
-            fec1 = liquid_getopt_str2fec(optarg);
-            if (fec1 == LIQUID_FEC_UNKNOWN) {
-                fprintf(stderr,"error: unknown/unsupported outer FEC scheme \"%s\"\n\n",optarg);
-                exit(1);
-            }
-            break;
+        case 'h': usage();                    return 0;
+        case 'd': debug       = 1;            break;
+        case 's': SNRdB       = atof(optarg); break;
+        case 'F': dphi        = atof(optarg); break;
+        case 'M': M           = atoi(optarg); break;
+        case 'C': cp_len      = atoi(optarg); break;
+        case 'n': payload_len = atol(optarg); break;
+        case 'm': ms          = liquid_getopt_str2mod(optarg); break;
+        case 'v': check       = liquid_getopt_str2crc(optarg); break;
+        case 'c': fec0        = liquid_getopt_str2fec(optarg); break;
+        case 'k': fec1        = liquid_getopt_str2fec(optarg); break;
         default:
             exit(-1);
         }
@@ -112,19 +85,13 @@ int main(int argc, char*argv[])
     // TODO : validate options
 
     // derived values
-    unsigned int frame_len = M + cp_len;
-    float complex buffer[frame_len]; // time-domain buffer
-    float nstd = powf(10.0f, noise_floor/20.0f);
-    float gamma = powf(10.0f, (SNRdB + noise_floor)/20.0f);
+    unsigned int  buf_len = 256;
+    float complex buf[buf_len]; // time-domain buffer
 
     // allocate memory for header, payload
     unsigned char header[8];
     unsigned char payload[payload_len];
 
-    // initialize subcarrier allocation
-    unsigned char p[M];
-    ofdmframe_init_default_sctype(M, p);
-
     // create frame generator
     ofdmflexframegenprops_s fgprops;
     ofdmflexframegenprops_init_default(&fgprops);
@@ -132,11 +99,11 @@ int main(int argc, char*argv[])
     fgprops.fec0            = fec0;
     fgprops.fec1            = fec1;
     fgprops.mod_scheme      = ms;
-    ofdmflexframegen fg = ofdmflexframegen_create(M, cp_len, taper_len, p, &fgprops);
+    ofdmflexframegen fg = ofdmflexframegen_create(M, cp_len, taper_len, NULL, &fgprops);
 
     // create frame synchronizer
-    ofdmflexframesync fs = ofdmflexframesync_create(M, cp_len, taper_len, p, callback, (void*)payload);
-    if (debug_enabled)
+    ofdmflexframesync fs = ofdmflexframesync_create(M, cp_len, taper_len, NULL, callback, (void*)payload);
+    if (debug)
         ofdmflexframesync_debug_enable(fs);
 
     // initialize header/payload and assemble frame
@@ -148,42 +115,32 @@ int main(int argc, char*argv[])
     ofdmflexframegen_print(fg);
     ofdmflexframesync_print(fs);
 
-    // initialize frame synchronizer with noise
-    for (i=0; i<1000; i++) {
-        float complex noise = nstd*( randnf() + _Complex_I*randnf())*M_SQRT1_2;
-        ofdmflexframesync_execute(fs, &noise, 1);
-    }
+    // create channel and add impairments
+    channel_cccf channel = channel_cccf_create();
+    channel_cccf_add_awgn(channel, noise_floor, SNRdB);
+    channel_cccf_add_carrier_offset(channel, dphi, 0.0f);
 
     // generate frame, push through channel
     int last_symbol=0;
-    nco_crcf nco = nco_crcf_create(LIQUID_VCO);
-    nco_crcf_set_frequency(nco, dphi);
     while (!last_symbol) {
         // generate symbol
-        last_symbol = ofdmflexframegen_writesymbol(fg, buffer);
-
-        // apply channel
-        for (i=0; i<frame_len; i++) {
-            float complex noise = nstd*( randnf() + _Complex_I*randnf())*M_SQRT1_2;
-            buffer[i] *= gamma;
-            buffer[i] += noise;
-            
-            nco_crcf_mix_up(nco, buffer[i], &buffer[i]);
-            nco_crcf_step(nco);
-        }
+        last_symbol = ofdmflexframegen_write(fg, buf, buf_len);
+
+        // apply channel to buffer (in place)
+        channel_cccf_execute_block(channel, buf, buf_len, buf);
 
-        // receive symbol
-        ofdmflexframesync_execute(fs, buffer, frame_len);
+        // push samples through synchronizer
+        ofdmflexframesync_execute(fs, buf, buf_len);
     }
-    nco_crcf_destroy(nco);
 
     // export debugging file
-    if (debug_enabled)
+    if (debug)
         ofdmflexframesync_debug_print(fs, "ofdmflexframesync_debug.m");
 
     // destroy objects
     ofdmflexframegen_destroy(fg);
     ofdmflexframesync_destroy(fs);
+    channel_cccf_destroy(channel);
 
     printf("done.\n");
     return 0;
diff --git a/examples/ofdmframesync_example.c b/examples/ofdmframesync_example.c
index abb118a..5464d61 100644
--- a/examples/ofdmframesync_example.c
+++ b/examples/ofdmframesync_example.c
@@ -168,9 +168,7 @@ int main(int argc, char*argv[])
     // estimate power spectral density of received signal
     unsigned int nfft = 1024;   // FFT size
     float        psd[nfft];     // PSD estimate output array
-    spgramcf periodogram = spgramcf_create_default(nfft);
-    spgramcf_estimate_psd(periodogram, y, num_samples, psd);
-    spgramcf_destroy(periodogram);
+    spgramcf_estimate_psd(nfft, y, num_samples, psd);
 
     // 
     // export output file
diff --git a/examples/resamp2_crcf_example.c b/examples/resamp2_crcf_example.c
index 5df80b8..9392cda 100644
--- a/examples/resamp2_crcf_example.c
+++ b/examples/resamp2_crcf_example.c
@@ -49,7 +49,7 @@ int main() {
         resamp2_crcf_interp_execute(q, x[i], &y[2*i]);
 
     // clear resamp2 object
-    resamp2_crcf_clear(q);
+    resamp2_crcf_reset(q);
 
     // execute decimation stage
     for (i=0; i<n; i++)
diff --git a/examples/symtrack_cccf_example.c b/examples/symtrack_cccf_example.c
index 5824f94..bedc504 100644
--- a/examples/symtrack_cccf_example.c
+++ b/examples/symtrack_cccf_example.c
@@ -102,7 +102,7 @@ int main(int argc, char*argv[])
     // buffers
     unsigned int    buf_len = 400;      // buffer size
     float complex   x   [buf_len];      // original signal
-    float complex   y   [buf_len*2];    // channel output (larger to accommodate resampler)
+    float complex   y   [buf_len];      // channel output
     float complex   syms[buf_len];      // recovered symbols
     // window for saving last few symbols
     windowcf sym_buf = windowcf_create(buf_len);
@@ -115,7 +115,6 @@ int main(int argc, char*argv[])
     channel_cccf_add_awgn          (channel, noise_floor, SNRdB);
     channel_cccf_add_carrier_offset(channel, dphi, phi);
     channel_cccf_add_multipath     (channel, NULL, hc_len);
-    channel_cccf_add_resamp        (channel, 0.0f, rate);
 
     // create symbol tracking synchronizer
     symtrack_cccf symtrack = symtrack_cccf_create(ftype,k,m,beta,ms);
@@ -125,7 +124,6 @@ int main(int argc, char*argv[])
     spgramcf periodogram = spgramcf_create_default(nfft);
 
     unsigned int total_samples = 0;
-    unsigned int ny;
     unsigned int total_symbols = 0;
     while (total_samples < num_samples)
     {
@@ -133,14 +131,14 @@ int main(int argc, char*argv[])
         symstreamcf_write_samples(gen, x, buf_len);
 
         // apply channel
-        channel_cccf_execute(channel, x, buf_len, y, &ny);
+        channel_cccf_execute_block(channel, x, buf_len, y);
 
         // push resulting sample through periodogram
-        spgramcf_write(periodogram, y, ny);
+        spgramcf_write(periodogram, y, buf_len);
 
         // run resulting stream through synchronizer
         unsigned int num_symbols_sync;
-        symtrack_cccf_execute_block(symtrack, y, ny, syms, &num_symbols_sync);
+        symtrack_cccf_execute_block(symtrack, y, buf_len, syms, &num_symbols_sync);
         total_symbols += num_symbols_sync;
 
         // write resulting symbols to window buffer for plotting
diff --git a/include/liquid.h b/include/liquid.h
index 0a08bab..db36819 100644
--- a/include/liquid.h
+++ b/include/liquid.h
@@ -232,7 +232,7 @@ void CBUFFER(_print)(CBUFFER() _q);                             \
 void CBUFFER(_debug_print)(CBUFFER() _q);                       \
                                                                 \
 /* clear internal buffer                                    */  \
-void CBUFFER(_clear)(CBUFFER() _q);                             \
+void CBUFFER(_reset)(CBUFFER() _q);                             \
                                                                 \
 /* get the number of elements currently in the buffer       */  \
 unsigned int CBUFFER(_size)(CBUFFER() _q);                      \
@@ -317,8 +317,8 @@ void WINDOW(_print)(WINDOW() _q);                               \
 /* print window object to stdout (with extra information)   */  \
 void WINDOW(_debug_print)(WINDOW() _q);                         \
                                                                 \
-/* clear/reset window object (initialize to zeros)          */  \
-void WINDOW(_clear)(WINDOW() _q);                               \
+/* reset window object (initialize to zeros)                */  \
+void WINDOW(_reset)(WINDOW() _q);                               \
                                                                 \
 /* read window buffer contents                              */  \
 /*  _q      : window object                                 */  \
@@ -381,7 +381,7 @@ void WDELAY(_destroy)(WDELAY() _q);                             \
 void WDELAY(_print)(WDELAY() _q);                               \
                                                                 \
 /* clear/reset state of object                              */  \
-void WDELAY(_clear)(WDELAY() _q);                               \
+void WDELAY(_reset)(WDELAY() _q);                               \
                                                                 \
 /* read delayed sample from delay buffer object             */  \
 /*  _q  :   delay buffer object                             */  \
@@ -420,10 +420,6 @@ typedef struct CHANNEL(_s) * CHANNEL();                         \
 /* create channel object with default parameters            */  \
 CHANNEL() CHANNEL(_create)(void);                               \
                                                                 \
-/* create channel object with particular delay              */  \
-/*  _m  :   resampling filter semi-length                   */  \
-CHANNEL() CHANNEL(_create_delay)(unsigned int _m);              \
-                                                                \
 /* destroy channel object, freeing all internal memory      */  \
 void CHANNEL(_destroy)(CHANNEL() _q);                           \
                                                                 \
@@ -438,14 +434,6 @@ void CHANNEL(_add_awgn)(CHANNEL() _q,                           \
                         float     _noise_floor_dB,              \
                         float     _SNRdB);                      \
                                                                 \
-/* apply additive white Gausss noise impairment             */  \
-/*  _q              : channel object                        */  \
-/*  _delay          : resampling delay                      */  \
-/*  _rate           : resampling rate                       */  \
-void CHANNEL(_add_resamp)(CHANNEL() _q,                         \
-                          float     _delay,                     \
-                          float     _rate);                     \
-                                                                \
 /* apply carrier offset impairment                          */  \
 /*  _q          : channel object                            */  \
 /*  _frequency  : carrier frequency offse [radians/sample   */  \
@@ -470,20 +458,23 @@ void CHANNEL(_add_shadowing)(CHANNEL()    _q,                   \
                              float        _sigma,               \
                              float        _fd);                 \
                                                                 \
-/* get nominal delay [samples]                              */  \
-unsigned int CHANNEL(_get_delay)(CHANNEL() _q);                 \
-                                                                \
-/* apply channel impairments on input array                 */  \
+/* apply channel impairments on single input sample         */  \
 /*  _q      : channel object                                */  \
-/*  _x      : input array [size: _nx x 1]                   */  \
-/*  _nx     : input array length                            */  \
-/*  _y      : output array                                  */  \
-/*  _ny     : output array length                           */  \
+/*  _x      : input sample                                  */  \
+/*  _y      : pointer to output sample                      */  \
 void CHANNEL(_execute)(CHANNEL()      _q,                       \
-                       TI *           _x,                       \
-                       unsigned int   _nx,                      \
-                       TO *           _y,                       \
-                       unsigned int * _ny);                     \
+                       TI             _x,                       \
+                       TO *           _y);                      \
+                                                                \
+/* apply channel impairments on block of samples            */  \
+/*  _q      : channel object                                */  \
+/*  _x      : input array [size: _n x 1]                    */  \
+/*  _n      : input array length                            */  \
+/*  _y      : output array [size: _n x 1]                   */  \
+void CHANNEL(_execute_block)(CHANNEL()      _q,                 \
+                             TI *           _x,                 \
+                             unsigned int   _n,                 \
+                             TO *           _y);                \
 
 LIQUID_CHANNEL_DEFINE_API(CHANNEL_MANGLE_CCCF,
                           liquid_float_complex,
@@ -2522,6 +2513,19 @@ void FIRPFB(_push)(FIRPFB() _q, TI _x);                         \
 void FIRPFB(_execute)(FIRPFB()     _q,                          \
                       unsigned int _i,                          \
                       TO *         _y);                         \
+                                                                \
+/* execute the filter on a block of input samples; the      */  \
+/* input and output buffers may be the same                 */  \
+/*  _q      : firpfb object                                 */  \
+/*  _i      : index of filter to use                        */  \
+/*  _x      : pointer to input array [size: _n x 1]         */  \
+/*  _n      : number of input, output samples               */  \
+/*  _y      : pointer to output array [size: _n x 1]        */  \
+void FIRPFB(_execute_block)(FIRPFB()     _q,                    \
+                            unsigned int _i,                    \
+                            TI *         _x,                    \
+                            unsigned int _n,                    \
+                            TO *         _y);                   \
 
 LIQUID_FIRPFB_DEFINE_API(FIRPFB_MANGLE_RRRF,
                          float,
@@ -2644,9 +2648,8 @@ IIRINTERP() IIRINTERP(_create)(unsigned int _M,                 \
 /* create decimator with default Butterworth prototype      */  \
 /*  _M      : decimation factor                             */  \
 /*  _order  : filter order                                  */  \
-IIRINTERP() IIRINTERP(_create_default)(                         \
-                unsigned int _M,                                \
-                unsigned int _order);                           \
+IIRINTERP() IIRINTERP(_create_default)(unsigned int _M,         \
+                                       unsigned int _order);    \
                                                                 \
 /* create interpolator from prototype                       */  \
 /*  _M      : interpolation factor                          */  \
@@ -2753,7 +2756,7 @@ void FIRDECIM(_destroy)(FIRDECIM() _q);                         \
 void FIRDECIM(_print)(FIRDECIM() _q);                           \
                                                                 \
 /* reset decimator object internal state                    */  \
-void FIRDECIM(_clear)(FIRDECIM() _q);                           \
+void FIRDECIM(_reset)(FIRDECIM() _q);                           \
                                                                 \
 /* execute decimator on _M input samples                    */  \
 /*  _q      : decimator object                              */  \
@@ -2812,9 +2815,8 @@ IIRDECIM() IIRDECIM(_create)(unsigned int _M,                   \
 /* create decimator with default Butterworth prototype      */  \
 /*  _M      : decimation factor                             */  \
 /*  _order  : filter order                                  */  \
-IIRDECIM() IIRDECIM(_create_default)(                           \
-                unsigned int _M,                                \
-                unsigned int _order);                           \
+IIRDECIM() IIRDECIM(_create_default)(unsigned int _M,           \
+                                     unsigned int _order);      \
                                                                 \
 /* create decimator from prototype                          */  \
 /*  _M      : decimation factor                             */  \
@@ -2919,7 +2921,7 @@ void RESAMP2(_destroy)(RESAMP2() _q);                           \
 void RESAMP2(_print)(RESAMP2() _q);                             \
                                                                 \
 /* reset internal buffer                                    */  \
-void RESAMP2(_clear)(RESAMP2() _q);                             \
+void RESAMP2(_reset)(RESAMP2() _q);                             \
                                                                 \
 /* get resampler filter delay (semi-length m)               */  \
 unsigned int RESAMP2(_get_delay)(RESAMP2() _q);                 \
@@ -3946,7 +3948,7 @@ void ofdmflexframegen_setprops(ofdmflexframegen _q,
 //  _q              :   OFDM frame generator object
 unsigned int ofdmflexframegen_getframelen(ofdmflexframegen _q);
 
-// assemble a frame from an array of data
+// assemble a frame from an array of data (NULL pointers will use random data)
 //  _q              :   OFDM frame generator object
 //  _header         :   frame header [8 bytes]
 //  _payload        :   payload data [size: _payload_len x 1]
@@ -3956,11 +3958,13 @@ void ofdmflexframegen_assemble(ofdmflexframegen      _q,
                                const unsigned char * _payload,
                                unsigned int          _payload_len);
 
-// write symbols of assembled frame
+// write samples of assembled frame
 //  _q              :   OFDM frame generator object
-//  _buffer         :   output buffer [size: M+cp_len x 1]
-int ofdmflexframegen_writesymbol(ofdmflexframegen       _q,
-                                 liquid_float_complex * _buffer);
+//  _buf            :   output buffer [size: _buf_len x 1]
+//  _buf_len        :   output buffer length
+int ofdmflexframegen_write(ofdmflexframegen       _q,
+                          liquid_float_complex * _buf,
+                          unsigned int           _buf_len);
 
 // 
 // OFDM flex frame synchronizer
@@ -5427,54 +5431,6 @@ void gmskdem_demodulate(gmskdem _q,
                         liquid_float_complex * _y,
                         unsigned int * _sym);
 
-// 
-// Analog frequency modulator
-//
-#define LIQUID_FREQMOD_MANGLE_FLOAT(name) LIQUID_CONCAT(freqmod,name)
-
-// Macro    :   FREQMOD (analog frequency modulator)
-//  FREQMOD :   name-mangling macro
-//  T       :   primitive data type
-//  TC      :   primitive data type (complex)
-#define LIQUID_FREQMOD_DEFINE_API(FREQMOD,T,TC)                 \
-                                                                \
-/* define struct pointer */                                     \
-typedef struct FREQMOD(_s) * FREQMOD();                         \
-                                                                \
-/* create freqmod object (frequency modulator)              */  \
-/*  _kf     :   modulation factor                           */  \
-FREQMOD() FREQMOD(_create)(float _kf);                          \
-                                                                \
-/* destroy freqmod object                                   */  \
-void FREQMOD(_destroy)(FREQMOD() _q);                           \
-                                                                \
-/* print freqmod object internals                           */  \
-void FREQMOD(_print)(FREQMOD() _q);                             \
-                                                                \
-/* reset state                                              */  \
-void FREQMOD(_reset)(FREQMOD() _q);                             \
-                                                                \
-/* modulate single sample                                   */  \
-/*  _q      :   frequency modulator object                  */  \
-/*  _m      :   message signal m(t)                         */  \
-/*  _s      :   complex baseband signal s(t)                */  \
-void FREQMOD(_modulate)(FREQMOD() _q,                           \
-                        T         _m,                           \
-                        TC *      _s);                          \
-                                                                \
-/* modulate block of samples                                */  \
-/*  _q      :   frequency modulator object                  */  \
-/*  _m      :   message signal m(t), [size: _n x 1]         */  \
-/*  _n      :   number of input, output samples             */  \
-/*  _s      :   complex baseband signal s(t) [size: _n x 1] */  \
-void FREQMOD(_modulate_block)(FREQMOD()    _q,                  \
-                              T *          _m,                  \
-                              unsigned int _n,                  \
-                              TC *         _s);                 \
-
-// define freqmod APIs
-LIQUID_FREQMOD_DEFINE_API(LIQUID_FREQMOD_MANGLE_FLOAT,float,liquid_float_complex)
-
 //
 // continuous phase frequency-shift keying (CP-FSK) modems
 //
@@ -5615,7 +5571,7 @@ void fskmod_modulate(fskmod                 _q,
 
 
 
-// CP-FSK demodulator
+// FSK demodulator
 typedef struct fskdem_s * fskdem;
 
 // create fskdem object (frequency demodulator)
@@ -5646,6 +5602,54 @@ float fskdem_get_frequency_error(fskdem _q);
 
 
 // 
+// Analog frequency modulator
+//
+#define LIQUID_FREQMOD_MANGLE_FLOAT(name) LIQUID_CONCAT(freqmod,name)
+
+// Macro    :   FREQMOD (analog frequency modulator)
+//  FREQMOD :   name-mangling macro
+//  T       :   primitive data type
+//  TC      :   primitive data type (complex)
+#define LIQUID_FREQMOD_DEFINE_API(FREQMOD,T,TC)                 \
+                                                                \
+/* define struct pointer */                                     \
+typedef struct FREQMOD(_s) * FREQMOD();                         \
+                                                                \
+/* create freqmod object (frequency modulator)              */  \
+/*  _kf     :   modulation factor                           */  \
+FREQMOD() FREQMOD(_create)(float _kf);                          \
+                                                                \
+/* destroy freqmod object                                   */  \
+void FREQMOD(_destroy)(FREQMOD() _q);                           \
+                                                                \
+/* print freqmod object internals                           */  \
+void FREQMOD(_print)(FREQMOD() _q);                             \
+                                                                \
+/* reset state                                              */  \
+void FREQMOD(_reset)(FREQMOD() _q);                             \
+                                                                \
+/* modulate single sample                                   */  \
+/*  _q      :   frequency modulator object                  */  \
+/*  _m      :   message signal m(t)                         */  \
+/*  _s      :   complex baseband signal s(t)                */  \
+void FREQMOD(_modulate)(FREQMOD() _q,                           \
+                        T         _m,                           \
+                        TC *      _s);                          \
+                                                                \
+/* modulate block of samples                                */  \
+/*  _q      :   frequency modulator object                  */  \
+/*  _m      :   message signal m(t), [size: _n x 1]         */  \
+/*  _n      :   number of input, output samples             */  \
+/*  _s      :   complex baseband signal s(t) [size: _n x 1] */  \
+void FREQMOD(_modulate_block)(FREQMOD()    _q,                  \
+                              T *          _m,                  \
+                              unsigned int _n,                  \
+                              TC *         _s);                 \
+
+// define freqmod APIs
+LIQUID_FREQMOD_DEFINE_API(LIQUID_FREQMOD_MANGLE_FLOAT,float,liquid_float_complex)
+
+// 
 // Analog frequency demodulator
 //
 
@@ -5911,9 +5915,19 @@ LIQUID_FIRPFBCH2_DEFINE_API(FIRPFBCH2_MANGLE_CRCF,
 // initialize default subcarrier allocation
 //  _M      :   number of subcarriers
 //  _p      :   output subcarrier allocation array, [size: _M x 1]
-void ofdmframe_init_default_sctype(unsigned int _M,
+void ofdmframe_init_default_sctype(unsigned int    _M,
                                    unsigned char * _p);
 
+// initialize default subcarrier allocation
+//  _M      :   number of subcarriers
+//  _f0     :   lower frequency band, _f0 in [-0.5,0.5]
+//  _f1     :   upper frequency band, _f1 in [-0.5,0.5]
+//  _p      :   output subcarrier allocation array, [size: _M x 1]
+void ofdmframe_init_sctype_range(unsigned int    _M,
+                                 float           _f0,
+                                 float           _f1,
+                                 unsigned char * _p);
+
 // validate subcarrier type (count number of null, pilot, and data
 // subcarriers in the allocation)
 //  _p          :   subcarrier allocation array, [size: _M x 1]
@@ -6247,7 +6261,7 @@ void chromosome_print(chromosome _c);
 void chromosome_printf(chromosome _c);
 
 // clear chromosome (set traits to zero)
-void chromosome_clear(chromosome _c);
+void chromosome_reset(chromosome _c);
 
 // initialize chromosome on integer values
 void chromosome_init(chromosome _c,
@@ -6499,7 +6513,7 @@ bsequence bsequence_create(unsigned int num_bits);
 void bsequence_destroy(bsequence _bs);
 
 // Clear binary sequence (set to 0's)
-void bsequence_clear(bsequence _bs);
+void bsequence_reset(bsequence _bs);
 
 // initialize sequence on external array
 void bsequence_init(bsequence _bs,
diff --git a/include/liquid.internal.h b/include/liquid.internal.h
index f80f336..32547cd 100644
--- a/include/liquid.internal.h
+++ b/include/liquid.internal.h
@@ -639,6 +639,8 @@ struct fecintlv_plan {
     interleaver q;
 };
 
+#define PACKETIZER_VERSION (1)
+
 // packetizer object
 struct packetizer_s {
     unsigned int msg_len;
@@ -833,7 +835,7 @@ struct IIRFILTSOS(_s) {                                         \
     TO v[3];    /* Direct form II buffer                    */  \
 };                                                              \
                                                                 \
-/* create 2nd-ordr infinite impulse reponse filter          */  \
+/* create 2nd-order infinite impulse reponse filter         */  \
 /*  _b      : feed-forward coefficients [size: _3 x 1]      */  \
 /*  _a      : feed-back coefficients    [size: _3 x 1]      */  \
 IIRFILTSOS() IIRFILTSOS(_create)(TC * _b,                       \
@@ -1095,7 +1097,7 @@ float complex ellip_asnf(float complex _u,
 // bpacket
 //
 
-#define BPACKET_VERSION 101
+#define BPACKET_VERSION (101+PACKETIZER_VERSION)
 
 // generator
 void bpacketgen_compute_packet_len(bpacketgen _q);
@@ -1117,7 +1119,7 @@ void bpacketsync_reconfig(bpacketsync _q);
 //
 
 // flexframe protocol
-#define FLEXFRAME_PROTOCOL  (101)
+#define FLEXFRAME_PROTOCOL  (101+PACKETIZER_VERSION)
 
 // header description
 // NOTE: The flexframe header can be improved with crc24, secded7264, v29
@@ -1135,7 +1137,7 @@ void bpacketsync_reconfig(bpacketsync _q);
 // gmskframe
 //
 
-#define GMSKFRAME_VERSION   (3)
+#define GMSKFRAME_VERSION (3+PACKETIZER_VERSION)
 
 // header description
 #define GMSKFRAME_H_USER    (8)                     // user-defined array
@@ -1150,7 +1152,7 @@ void bpacketsync_reconfig(bpacketsync _q);
 // ofdmflexframe
 //
 
-#define OFDMFLEXFRAME_PROTOCOL  (104)
+#define OFDMFLEXFRAME_PROTOCOL  (104+PACKETIZER_VERSION)
 
 // header description
 #define OFDMFLEXFRAME_H_USER    (8)                         // user-defined array
diff --git a/makefile.in b/makefile.in
index 33a458d..5ab57c4 100644
--- a/makefile.in
+++ b/makefile.in
@@ -432,6 +432,7 @@ filter_objects :=						\
 
 # list explicit targets and dependencies here
 filter_includes :=						\
+	src/filter/src/autocorr.c				\
 	src/filter/src/fftfilt.c				\
 	src/filter/src/firdecim.c				\
 	src/filter/src/firfarrow.c				\
diff --git a/sandbox/fft_r2r_test.c b/sandbox/fft_r2r_test.c
index ab9998f..05d7dc3 100644
--- a/sandbox/fft_r2r_test.c
+++ b/sandbox/fft_r2r_test.c
@@ -31,6 +31,8 @@
 #include <getopt.h>
 #include <complex.h>
 
+#include "liquid.internal.h"
+
 #ifdef HAVE_FFTW3_H
 #  include <fftw3.h>
 #else
diff --git a/sandbox/fskmodem_test.c b/sandbox/fskmodem_test.c
index e8137cb..3cf8255 100644
--- a/sandbox/fskmodem_test.c
+++ b/sandbox/fskmodem_test.c
@@ -237,9 +237,7 @@ int main(int argc, char*argv[])
     // compute power spectral density of received signal
     unsigned int nfft = 1200;
     float psd[nfft];
-    spgramcf periodogram = spgramcf_create_kaiser(nfft, nfft/2, 8.0f);
-    spgramcf_estimate_psd(periodogram, y, num_samples, psd);
-    spgramcf_destroy(periodogram);
+    spgramcf_estimate_psd(nfft, y, num_samples, psd);
 
     // 
     // export results
diff --git a/sandbox/gmskmodem_coherent_test.c b/sandbox/gmskmodem_coherent_test.c
index f482938..13df2f2 100644
--- a/sandbox/gmskmodem_coherent_test.c
+++ b/sandbox/gmskmodem_coherent_test.c
@@ -98,9 +98,7 @@ int main(int argc, char*argv[])
     // compute power spectral density of transmitted signal
     unsigned int nfft = 1024;
     float psd[nfft];
-    spgramcf periodogram = spgramcf_create_kaiser(nfft, nfft/2, 8.0f);
-    spgramcf_estimate_psd(periodogram, x, num_samples, psd);
-    spgramcf_destroy(periodogram);
+    spgramcf_estimate_psd(nfft, x, num_samples, psd);
 
     // 
     // export results
diff --git a/sandbox/gmskmodem_equalizer_test.c b/sandbox/gmskmodem_equalizer_test.c
index 81ee44b..1377493 100644
--- a/sandbox/gmskmodem_equalizer_test.c
+++ b/sandbox/gmskmodem_equalizer_test.c
@@ -41,9 +41,7 @@ int main(int argc, char*argv[])
     float        beta        = 0.30f;   // GMSK bandwidth-time factor
     unsigned int p           = 3;       // equalizer length (symbols, hp_len = 2*k*p+1)
     float        mu          = 0.10f;   // learning rate
-    
     unsigned int nfft        = 1200;    // spectrum estimate FFT size
-    float        alpha       = 0.001f;  // spectrum averaging bandwidth
 
     int dopt;
     while ((dopt = getopt(argc,argv,"hn:k:m:b:p:u:")) != EOF) {
@@ -151,8 +149,8 @@ int main(int argc, char*argv[])
     //
     // run many trials get get average spectrum
     //
-    spgramcf periodogram_tx = spgramcf_create_kaiser(nfft, nfft/2, 8.0f);
-    spgramcf periodogram_rx = spgramcf_create_kaiser(nfft, nfft/2, 8.0f);
+    spgramcf periodogram_tx = spgramcf_create_default(nfft);
+    spgramcf periodogram_rx = spgramcf_create_default(nfft);
 
     firfilt_cccf mf = firfilt_cccf_create(hp, hp_len);
 
@@ -166,16 +164,16 @@ int main(int argc, char*argv[])
         firfilt_cccf_execute_block(mf, buf_tx, k, buf_rx);
 
         // accumulate spectrum average
-        spgramcf_accumulate_psd(periodogram_tx, buf_tx, alpha, k);
-        spgramcf_accumulate_psd(periodogram_rx, buf_rx, alpha, k);
+        spgramcf_write(periodogram_tx, buf_tx, k);
+        spgramcf_write(periodogram_rx, buf_rx, k);
     }
     firfilt_cccf_destroy(mf);
 
     // write accumulated output PSD
     float X[nfft];
     float Y[nfft];
-    spgramcf_write_accumulation(periodogram_tx, X);
-    spgramcf_write_accumulation(periodogram_rx, Y);
+    spgramcf_get_psd(periodogram_tx, X);
+    spgramcf_get_psd(periodogram_rx, Y);
 
     // destroy periodogram objects
     spgramcf_destroy(periodogram_tx);
diff --git a/sandbox/mskmodem_test.c b/sandbox/mskmodem_test.c
index 63b4559..5f26e43 100644
--- a/sandbox/mskmodem_test.c
+++ b/sandbox/mskmodem_test.c
@@ -300,9 +300,7 @@ int main(int argc, char*argv[]) {
     // compute power spectral density of transmitted signal
     unsigned int nfft = 1024;
     float psd[nfft];
-    spgramcf periodogram = spgramcf_create_kaiser(nfft, nfft/2, 8.0f);
-    spgramcf_estimate_psd(periodogram, y, num_samples, psd);
-    spgramcf_destroy(periodogram);
+    spgramcf_estimate_psd(nfft, y, num_samples, psd);
 
     // 
     // export results
diff --git a/sandbox/resamp2_crcf_filterbank_test.c b/sandbox/resamp2_crcf_filterbank_test.c
index 7d55e46..55c2861 100644
--- a/sandbox/resamp2_crcf_filterbank_test.c
+++ b/sandbox/resamp2_crcf_filterbank_test.c
@@ -59,7 +59,7 @@ int main() {
         resamp2_crcf_analyzer_execute(q, &x[2*i], &y[i][0]);
 
     // clear resampler
-    resamp2_crcf_clear(q);
+    resamp2_crcf_reset(q);
 
     // run the resampler as a two-channel synthesis filterbank
     for (i=0; i<n; i++)
diff --git a/sandbox/shadowing_test.c b/sandbox/shadowing_test.c
index 6eef145..3ecd555 100644
--- a/sandbox/shadowing_test.c
+++ b/sandbox/shadowing_test.c
@@ -48,18 +48,9 @@ int main(int argc, char*argv[])
     // destroy filter
     iirfilt_rrrf_destroy(filter);
 
-    // create spectral periodogram for estimating
-    spgramf q = spgramf_create_default(nfft);
-
-    // push resulting sample through periodogram
-    spgramf_accumulate_psd(q, G, 0.01, num_samples);
-
-    // compute power spectral density output
+    // estimate power spectral density output
     float psd[nfft];
-    spgramf_write_accumulation(q, psd);
-
-    // destroy objects
-    spgramf_destroy(q);
+    spgramf_estimate_psd(nfft, G, num_samples, psd);
 
     //
     // export output file
diff --git a/src/buffer/src/cbuffer.c b/src/buffer/src/cbuffer.c
index 16eed2b..85ed40e 100644
--- a/src/buffer/src/cbuffer.c
+++ b/src/buffer/src/cbuffer.c
@@ -87,7 +87,7 @@ CBUFFER() CBUFFER(_create_max)(unsigned int _max_size,
     q->v = (T*) malloc((q->num_allocated)*sizeof(T));
 
     // reset object
-    CBUFFER(_clear)(q);
+    CBUFFER(_reset)(q);
 
     // return main object
     return q;
@@ -158,7 +158,7 @@ void CBUFFER(_debug_print)(CBUFFER() _q)
 }
 
 // clear internal buffer
-void CBUFFER(_clear)(CBUFFER() _q)
+void CBUFFER(_reset)(CBUFFER() _q)
 {
     _q->read_index   = 0;
     _q->write_index  = 0;
diff --git a/src/buffer/src/wdelay.c b/src/buffer/src/wdelay.c
index 950c63b..b0cf9ac 100644
--- a/src/buffer/src/wdelay.c
+++ b/src/buffer/src/wdelay.c
@@ -50,7 +50,7 @@ WDELAY() WDELAY(_create)(unsigned int _delay)
     q->read_index = 0;
 
     // clear window
-    WDELAY(_clear)(q);
+    WDELAY(_reset)(q);
 
     return q;
 }
@@ -107,7 +107,7 @@ void WDELAY(_print)(WDELAY() _q)
 }
 
 // clear/reset state of object
-void WDELAY(_clear)(WDELAY() _q)
+void WDELAY(_reset)(WDELAY() _q)
 {
     _q->read_index = 0;
     memset(_q->v, 0, (_q->delay)*sizeof(T));
diff --git a/src/buffer/src/window.c b/src/buffer/src/window.c
index ecc05b6..44cfe8f 100644
--- a/src/buffer/src/window.c
+++ b/src/buffer/src/window.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007 - 2015 Joseph Gaeddert
+ * Copyright (c) 2007 - 2016 Joseph Gaeddert
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -67,8 +67,8 @@ WINDOW() WINDOW(_create)(unsigned int _n)
     q->v = (T*) malloc((q->num_allocated)*sizeof(T));
     q->read_index = 0;
 
-    // clear window
-    WINDOW(_clear)(q);
+    // reset window
+    WINDOW(_reset)(q);
 
     // return object
     return q;
@@ -157,8 +157,8 @@ void WINDOW(_debug_print)(WINDOW() _q)
     }
 }
 
-// clear/reset window object (initialize to zeros)
-void WINDOW(_clear)(WINDOW() _q)
+// reset window object (initialize to zeros)
+void WINDOW(_reset)(WINDOW() _q)
 {
     // reset read index
     _q->read_index = 0;
diff --git a/src/buffer/tests/window_autotest.c b/src/buffer/tests/window_autotest.c
index f0dddaf..8b6d41d 100644
--- a/src/buffer/tests/window_autotest.c
+++ b/src/buffer/tests/window_autotest.c
@@ -120,9 +120,9 @@ void autotest_windowf()
     windowf_read(w,&r);
     CONTEND_SAME_DATA(r,test7,10*sizeof(float));
 
-    // clear
+    // reset
     // 0 0 0 0 0 0 0 0 0 0
-    windowf_clear(w);
+    windowf_reset(w);
 
     windowf_read(w, &r);
     CONTEND_SAME_DATA(r,test8,10*sizeof(float));
diff --git a/src/channel/src/channel.c b/src/channel/src/channel.c
index 8dc602b..fbe7f16 100644
--- a/src/channel/src/channel.c
+++ b/src/channel/src/channel.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007 - 2015 Joseph Gaeddert
+ * Copyright (c) 2007 - 2016 Joseph Gaeddert
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -31,13 +31,6 @@
 
 // portable structured channel object
 struct CHANNEL(_s) {
-    // sample rate
-    int             enabled_resamp;     // resampler enabled?
-    unsigned int    resamp_m;           // resampling filter semi-length
-    float           resamp_rate;        // resampling rate
-    TO              resamp_buf[8];      // resampling buffer
-    RESAMP()        resamp;             // resampling filter
-
     // additive white Gauss noise
     int             enabled_awgn;       // AWGN enabled?
     T               gamma;              // channel gain
@@ -67,32 +60,15 @@ struct CHANNEL(_s) {
 // create structured channel object with default parameters
 CHANNEL() CHANNEL(_create)(void)
 {
-    // return object
-    return CHANNEL(_create_delay)(7);
-}
-
-// create structured channel object with a particular resampling filter delay
-CHANNEL() CHANNEL(_create_delay)(unsigned int _m)
-{
-    // validate input
-    if (_m < 2 || _m > 30) {
-        fprintf(stderr,"error: channel_%s_create_delay(m), delay out of range\n", EXTENSION_FULL);
-        exit(1);
-    }
-
     CHANNEL() q = (CHANNEL()) malloc(sizeof(struct CHANNEL(_s)));
 
     // initialize all options as off
-    q->enabled_resamp    = 0;
     q->enabled_awgn      = 0;
     q->enabled_carrier   = 0;
     q->enabled_multipath = 0;
     q->enabled_shadowing = 0;
 
     // create internal objects
-    q->resamp_rate      = 1.0f;
-    q->resamp_m         = _m;
-    q->resamp           = RESAMP(_create)(q->resamp_rate, q->resamp_m, 0.45f, 50.0f, 64);
     q->nco              = NCO(_create)(LIQUID_VCO);
     q->h_len            = 1;
     q->h                = (TC*) malloc(q->h_len*sizeof(TC));
@@ -122,7 +98,6 @@ void CHANNEL(_destroy)(CHANNEL() _q)
 void CHANNEL(_print)(CHANNEL() _q)
 {
     printf("channel\n");
-    if (_q->enabled_resamp)     printf("  resamp:    m=%u, rate=%.6f\n", _q->resamp_m, _q->resamp_rate);
     if (_q->enabled_awgn)       printf("  AWGN:      SNR=%.3f dB, gamma=%.3f, std=%.6f\n", _q->SNRdB, _q->gamma, _q->nstd);
     if (_q->enabled_carrier)    printf("  carrier:   dphi=%.3f, phi=%.3f\n", _q->dphi, _q->phi);
     if (_q->enabled_multipath)  printf("  multipath: h_len=%u\n", _q->h_len);
@@ -149,34 +124,6 @@ void CHANNEL(_add_awgn)(CHANNEL() _q,
     _q->gamma = powf(10.0f, (_q->SNRdB+_q->noise_floor_dB)/20.0f);
 }
 
-// apply additive white Gausss noise impairment
-//  _q              : channel object
-//  _delay          : resampling delay
-//  _rate           : resampling rate
-void CHANNEL(_add_resamp)(CHANNEL() _q,
-                          float     _delay,
-                          float     _rate)
-{
-    if (_delay < -0.5f || _delay > 0.5f) {
-        fprintf(stderr,"warning: channel_%s_add_resamp(), delay must be in [-0.5,0.5]; ignoring\n", EXTENSION_FULL);
-        return;
-    } else if (_rate < 0.95f || _rate > 1.05f) {
-        fprintf(stderr,"warning: channel_%s_add_resamp(), rate must be in [0.95,1.05]; ignoring\n", EXTENSION_FULL);
-        return;
-    }
-
-    // enable module
-    _q->enabled_resamp = 1;
-
-    // set parameters
-    _q->resamp_rate = _rate;
-
-    // TODO: set delay appropriately
-    
-    // set resampling rate
-    RESAMP(_set_rate)(_q->resamp, _q->resamp_rate);
-}
-
 // apply carrier offset impairment
 //  _q          : channel object
 //  _frequency  : carrier frequency offse [radians/sample
@@ -281,73 +228,63 @@ void CHANNEL(_add_shadowing)(CHANNEL() _q,
     _q->shadowing_filter = IIRFILT(_create)(b,2,a,2);
 }
 
-// get nominal channel delay [samples]
-unsigned int CHANNEL(_get_delay)(CHANNEL() _q)
+// apply channel impairments on single input sample
+//  _q      : channel object
+//  _x      : input sample
+//  _y      : output sample pointer
+void CHANNEL(_execute)(CHANNEL() _q,
+                       TI        _x,
+                       TO *      _y)
 {
-    return 2*RESAMP(_get_delay)(_q->resamp) + 1;
+    float complex r;
+    // apply filter
+    if (_q->enabled_multipath) {
+        FIRFILT(_push)(   _q->channel_filter, _x);
+        FIRFILT(_execute)(_q->channel_filter, &r);
+    } else {
+        r = _x;
+    }
+
+    // apply shadowing if enabled
+    if (_q->enabled_shadowing) {
+        // TODO: use type-specific value other than float
+        float g = 0;
+        IIRFILT(_execute)(_q->shadowing_filter, randnf()*_q->shadowing_std, &g);
+        g /= _q->shadowing_fd * 6.9f;
+        g = powf(10.0f, g/20.0f);
+        r *= g;
+    }
+
+    // apply carrier if enabled
+    if (_q->enabled_carrier) {
+        NCO(_mix_up)(_q->nco, r, &r);
+        NCO(_step)  (_q->nco);
+    }
+
+    // apply AWGN if enabled
+    if (_q->enabled_awgn) {
+        r *= _q->gamma;
+        r += _q->nstd * ( randnf() + _Complex_I*randnf() ) * M_SQRT1_2;
+    }
+
+    // set output value
+    *_y = r;
 }
 
-// apply channel impairments on input array
+// apply channel impairments on single input sample
 //  _q      : channel object
-//  _x      : input array [size: _nx x 1]
-//  _nx     : input array length
-//  _y      : output array
-//  _ny     : output array length
-void CHANNEL(_execute)(CHANNEL()      _q,
-                       TI *           _x,
-                       unsigned int   _nx,
-                       TO *           _y,
-                       unsigned int * _ny)
+//  _x      : input array [size: _n x 1]
+//  _n      : input array length
+//  _y      : output array [size: _n x 1]
+void CHANNEL(_execute_block)(CHANNEL()    _q,
+                             TI *         _x,
+                             unsigned int _n,
+                             TO *         _y)
 {
-    unsigned int i;
-    unsigned int j;
-    unsigned int num_resamp;    // resampler output length
-    unsigned int n=0;           // number of output samples
-
     // apply channel effects on each input sample
-    for (i=0; i<_nx; i++) {
-
-        // apply resampler (always push through resampling filter)
-        RESAMP(_execute)(_q->resamp, _x[i], _q->resamp_buf, &num_resamp);
-
-        // run resulting resampled result through remaining channel objects
-        for (j=0; j<num_resamp; j++) {
-            // apply filter
-            if (_q->enabled_multipath) {
-                FIRFILT(_push)(   _q->channel_filter,  _q->resamp_buf[j]);
-                FIRFILT(_execute)(_q->channel_filter, &_y[n]);
-            } else
-                _y[n] = _q->resamp_buf[j];
-
-            // apply shadowing if enabled
-            if (_q->enabled_shadowing) {
-                // TODO: use type-specific value other than float
-                float g = 0;
-                IIRFILT(_execute)(_q->shadowing_filter, randnf()*_q->shadowing_std, &g);
-                g /= _q->shadowing_fd * 6.9f;
-                g = powf(10.0f, g/20.0f);
-                _y[n] *= g;
-            }
-
-            // apply carrier if enabled
-            if (_q->enabled_carrier) {
-                NCO(_mix_up)(_q->nco, _y[n], &_y[n]);
-                NCO(_step)  (_q->nco);
-            }
-
-            // apply AWGN if enabled
-            if (_q->enabled_awgn) {
-                _y[n] *= _q->gamma;
-                _y[n] += _q->nstd * ( randnf() + _Complex_I*randnf() ) * M_SQRT1_2;
-            }
-
-            // increment output sample counter
-            n++;
-        }
-    }
-
-    // set output sample length
-    if (_ny != NULL)
-        *_ny = n;
+    // TODO: apply in blocks
+    unsigned int i;
+    for (i=0; i<_n; i++)
+        CHANNEL(_execute)(_q, _x[i], &_y[i]);
 }
 
diff --git a/src/channel/src/tvmpch.c b/src/channel/src/tvmpch.c
index d14d9ca..177b281 100644
--- a/src/channel/src/tvmpch.c
+++ b/src/channel/src/tvmpch.c
@@ -97,7 +97,7 @@ void TVMPCH(_destroy)(TVMPCH() _q)
 // reset internal state of filter object
 void TVMPCH(_reset)(TVMPCH() _q)
 {
-    WINDOW(_clear)(_q->w);
+    WINDOW(_reset)(_q->w);
 }
 
 // print filter object internals (taps, buffer)
diff --git a/src/equalization/src/eqlms.c b/src/equalization/src/eqlms.c
index c08c8e0..594d9d6 100644
--- a/src/equalization/src/eqlms.c
+++ b/src/equalization/src/eqlms.c
@@ -201,8 +201,8 @@ void EQLMS(_reset)(EQLMS() _q)
     // copy default coefficients
     memmove(_q->w0, _q->h0, (_q->h_len)*sizeof(T));
 
-    WINDOW(_clear)(_q->buffer);
-    wdelayf_clear(_q->x2);
+    WINDOW(_reset)(_q->buffer);
+    wdelayf_reset(_q->x2);
 
     // reset input count
     _q->count = 0;
diff --git a/src/equalization/src/eqrls.c b/src/equalization/src/eqrls.c
index 58d7a05..299f1dd 100644
--- a/src/equalization/src/eqrls.c
+++ b/src/equalization/src/eqrls.c
@@ -198,7 +198,7 @@ void EQRLS(_reset)(EQRLS() _q)
     memmove(_q->w0, _q->h0, (_q->p)*sizeof(T));
 
     // clear window object
-    WINDOW(_clear)(_q->buffer);
+    WINDOW(_reset)(_q->buffer);
 }
 
 // get learning rate of equalizer
diff --git a/src/fec/src/packetizer.c b/src/fec/src/packetizer.c
index efd05dc..e341d64 100644
--- a/src/fec/src/packetizer.c
+++ b/src/fec/src/packetizer.c
@@ -250,8 +250,14 @@ void packetizer_encode(packetizer            _p,
 {
     unsigned int i;
 
-    // copy input message to internal buffer[0]
-    memmove(_p->buffer_0, _msg, _p->msg_len);
+    // copy input message to internal buffer[0] (or initialize to zeros)
+    if (_msg != NULL) {
+        // copy user-defined input
+        memmove(_p->buffer_0, _msg, _p->msg_len);
+    } else {
+        // initialize with zeros
+        memset(_p->buffer_0, 0x00, _p->msg_len);
+    }
 
     // compute crc, append to buffer
     unsigned int key = crc_generate_key(_p->check, _p->buffer_0, _p->msg_len);
@@ -263,6 +269,9 @@ void packetizer_encode(packetizer            _p,
         key >>= 8;
     }
 
+    // whiten input sequence
+    scramble_data(_p->buffer_0, _p->msg_len + _p->crc_length);
+
     // execute fec/interleaver plans
     for (i=0; i<_p->plan_len; i++) {
         // run the encoder: buffer[0] > buffer[1]
@@ -309,6 +318,9 @@ int packetizer_decode(packetizer            _p,
                    _p->buffer_0);
     }
 
+    // remove sequence whitening
+    unscramble_data(_p->buffer_0, _p->msg_len + _p->crc_length);
+
     // strip crc, validate message
     unsigned int key = 0;
     for (i=0; i<_p->crc_length; i++) {
@@ -370,6 +382,9 @@ int packetizer_decode_soft(packetizer            _p,
                _p->buffer_1,
                _p->buffer_0);
 
+    // remove sequence whitening
+    unscramble_data(_p->buffer_0, _p->msg_len + _p->crc_length);
+
     // strip crc, validate message
     unsigned int key = 0;
     unsigned int i;
diff --git a/src/filter/src/autocorr.c b/src/filter/src/autocorr.c
index 26cd25d..eb7a79f 100644
--- a/src/filter/src/autocorr.c
+++ b/src/filter/src/autocorr.c
@@ -95,8 +95,8 @@ void AUTOCORR(_destroy)(AUTOCORR() _q)
 void AUTOCORR(_reset)(AUTOCORR() _q)
 {
     // clear/reset internal window buffers
-    WINDOW(_clear)(_q->w);
-    WINDOW(_clear)(_q->wdelay);
+    WINDOW(_reset)(_q->w);
+    WINDOW(_reset)(_q->wdelay);
     
     // reset internal squared energy buffer
     _q->e2_sum = 0.0;
diff --git a/src/filter/src/firdecim.c b/src/filter/src/firdecim.c
index 092c07d..b8eb6f2 100644
--- a/src/filter/src/firdecim.c
+++ b/src/filter/src/firdecim.c
@@ -76,7 +76,7 @@ FIRDECIM() FIRDECIM(_create)(unsigned int _M,
     q->dp = DOTPROD(_create)(q->h, q->h_len);
 
     // reset filter state (clear buffer)
-    FIRDECIM(_clear)(q);
+    FIRDECIM(_reset)(q);
 
     return q;
 }
@@ -177,9 +177,9 @@ void FIRDECIM(_print)(FIRDECIM() _q)
 }
 
 // clear decimator object
-void FIRDECIM(_clear)(FIRDECIM() _q)
+void FIRDECIM(_reset)(FIRDECIM() _q)
 {
-    WINDOW(_clear)(_q->w);
+    WINDOW(_reset)(_q->w);
 }
 
 // execute decimator
diff --git a/src/filter/src/firfarrow.c b/src/filter/src/firfarrow.c
index a4513e0..a09773e 100644
--- a/src/filter/src/firfarrow.c
+++ b/src/filter/src/firfarrow.c
@@ -160,7 +160,7 @@ void FIRFARROW(_print)(FIRFARROW() _q)
 void FIRFARROW(_reset)(FIRFARROW() _q)
 {
 #if FIRFARROW_USE_DOTPROD
-    WINDOW(_clear)(_q->w);
+    WINDOW(_reset)(_q->w);
 #else
     unsigned int i;
     for (i=0; i<_q->h_len; i++)
diff --git a/src/filter/src/firfilt.c b/src/filter/src/firfilt.c
index 67b32fe..da0439f 100644
--- a/src/filter/src/firfilt.c
+++ b/src/filter/src/firfilt.c
@@ -253,7 +253,7 @@ void FIRFILT(_destroy)(FIRFILT() _q)
 void FIRFILT(_reset)(FIRFILT() _q)
 {
 #if LIQUID_FIRFILT_USE_WINDOW
-    WINDOW(_clear)(_q->w);
+    WINDOW(_reset)(_q->w);
 #else
     unsigned int i;
     for (i=0; i<_q->w_len; i++)
diff --git a/src/filter/src/firhilb.c b/src/filter/src/firhilb.c
index d8cb19e..ec6ff3c 100644
--- a/src/filter/src/firhilb.c
+++ b/src/filter/src/firhilb.c
@@ -106,8 +106,6 @@ FIRHILB() FIRHILB(_create)(unsigned int _m,
     // create windows for upper and lower polyphase filter branches
     q->w1 = WINDOW(_create)(2*(q->m));
     q->w0 = WINDOW(_create)(2*(q->m));
-    WINDOW(_clear)(q->w0);
-    WINDOW(_clear)(q->w1);
 
     // create internal dot product object
     q->dpq = DOTPROD(_create)(q->hq, q->hq_len);
@@ -158,8 +156,8 @@ void FIRHILB(_print)(FIRHILB() _q)
 void FIRHILB(_reset)(FIRHILB() _q)
 {
     // clear window buffers
-    WINDOW(_clear)(_q->w0);
-    WINDOW(_clear)(_q->w1);
+    WINDOW(_reset)(_q->w0);
+    WINDOW(_reset)(_q->w1);
 
     // reset toggle flag
     _q->toggle = 0;
diff --git a/src/filter/src/firpfb.c b/src/filter/src/firpfb.c
index 9855fd4..8898592 100644
--- a/src/filter/src/firpfb.c
+++ b/src/filter/src/firpfb.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007 - 2015 Joseph Gaeddert
+ * Copyright (c) 2007 - 2016 Joseph Gaeddert
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -301,7 +301,7 @@ void FIRPFB(_print)(FIRPFB() _q)
 // clear/reset firpfb object internal state
 void FIRPFB(_reset)(FIRPFB() _q)
 {
-    WINDOW(_clear)(_q->w);
+    WINDOW(_reset)(_q->w);
 }
 
 // set output scaling for filter
@@ -344,3 +344,26 @@ void FIRPFB(_execute)(FIRPFB()     _q,
     *_y *= _q->scale;
 }
 
+// execute the filter on a block of input samples; the
+// input and output buffers may be the same
+//  _q      : firpfb object
+//  _i      : index of filter to use
+//  _x      : pointer to input array [size: _n x 1]
+//  _n      : number of input, output samples
+//  _y      : pointer to output array [size: _n x 1]
+void FIRPFB(_execute_block)(FIRPFB()     _q,
+                            unsigned int _i,
+                            TI *         _x,
+                            unsigned int _n,
+                            TO *         _y)
+{
+    unsigned int i;
+    for (i=0; i<_n; i++) {
+        // push sample into filter
+        FIRPFB(_push)(_q, _x[i]);
+
+        // compute output at appropriate index
+        FIRPFB(_execute)(_q, _i, &_y[i]);
+    }
+}
+
diff --git a/src/filter/src/msresamp2.c b/src/filter/src/msresamp2.c
index a403a5c..25da730 100644
--- a/src/filter/src/msresamp2.c
+++ b/src/filter/src/msresamp2.c
@@ -218,7 +218,7 @@ void MSRESAMP2(_reset)(MSRESAMP2() _q)
     // reset half-band resampler objects
     unsigned int i;
     for (i=0; i<_q->num_stages; i++)
-        RESAMP2(_clear)(_q->resamp2[i]);
+        RESAMP2(_reset)(_q->resamp2[i]);
 
     // reset buffer write pointer
     _q->buffer_index = 0;
diff --git a/src/filter/src/resamp2.c b/src/filter/src/resamp2.c
index 5b2e77a..20ea6fa 100644
--- a/src/filter/src/resamp2.c
+++ b/src/filter/src/resamp2.c
@@ -117,7 +117,7 @@ RESAMP2() RESAMP2(_create)(unsigned int _m,
     q->w0 = WINDOW(_create)(2*(q->m));
     q->w1 = WINDOW(_create)(2*(q->m));
 
-    RESAMP2(_clear)(q);
+    RESAMP2(_reset)(q);
 
     return q;
 }
@@ -206,10 +206,10 @@ void RESAMP2(_print)(RESAMP2() _q)
 }
 
 // clear internal buffer
-void RESAMP2(_clear)(RESAMP2() _q)
+void RESAMP2(_reset)(RESAMP2() _q)
 {
-    WINDOW(_clear)(_q->w0);
-    WINDOW(_clear)(_q->w1);
+    WINDOW(_reset)(_q->w0);
+    WINDOW(_reset)(_q->w1);
 
     _q->toggle = 0;
 }
diff --git a/src/framing/src/bpacketsync.c b/src/framing/src/bpacketsync.c
index 28e8a46..43e3d74 100644
--- a/src/framing/src/bpacketsync.c
+++ b/src/framing/src/bpacketsync.c
@@ -188,7 +188,7 @@ void bpacketsync_print(bpacketsync _q)
 void bpacketsync_reset(bpacketsync _q)
 {
     // clear received sequence buffer
-    bsequence_clear(_q->brx);
+    bsequence_reset(_q->brx);
 
     // reset counters
     _q->num_bytes_received  = 0;
diff --git a/src/framing/src/detector_cccf.c b/src/framing/src/detector_cccf.c
index 92b8414..c618c2b 100644
--- a/src/framing/src/detector_cccf.c
+++ b/src/framing/src/detector_cccf.c
@@ -221,8 +221,8 @@ void detector_cccf_print(detector_cccf _q)
 void detector_cccf_reset(detector_cccf _q)
 {
     // reset internal state
-    windowcf_clear(_q->buffer);
-    wdelayf_clear(_q->x2);
+    windowcf_reset(_q->buffer);
+    wdelayf_reset(_q->x2);
 
     // reset internal state
     _q->timer   = _q->n;                // reset timer
diff --git a/src/framing/src/flexframegen.c b/src/framing/src/flexframegen.c
index 891bf2d..abe6d90 100644
--- a/src/framing/src/flexframegen.c
+++ b/src/framing/src/flexframegen.c
@@ -297,7 +297,10 @@ void flexframegen_assemble(flexframegen          _q,
     _q->payload_dec_len = _payload_dec_len;
 
     // copy user-defined header to internal
-    memmove(_q->header, _header, FLEXFRAME_H_USER*sizeof(unsigned char));
+    if (_header == NULL)
+        memset(_q->header, 0x00, FLEXFRAME_H_USER*sizeof(unsigned char));
+    else
+        memmove(_q->header, _header, FLEXFRAME_H_USER*sizeof(unsigned char));
 
     // first several bytes of header are user-defined
     unsigned int n = FLEXFRAME_H_USER;
diff --git a/src/framing/src/flexframesync.c b/src/framing/src/flexframesync.c
index 8c78ba0..999d671 100644
--- a/src/framing/src/flexframesync.c
+++ b/src/framing/src/flexframesync.c
@@ -354,48 +354,49 @@ void flexframesync_execute_seekpn(flexframesync _q,
     float complex * v = qdetector_cccf_execute(_q->detector, _x);
 
     // check if frame has been detected
-    if (v != NULL) {
-        // get estimates
-        _q->tau_hat   = qdetector_cccf_get_tau  (_q->detector);
-        _q->gamma_hat = qdetector_cccf_get_gamma(_q->detector);
-        _q->dphi_hat  = qdetector_cccf_get_dphi (_q->detector);
-        _q->phi_hat   = qdetector_cccf_get_phi  (_q->detector);
+    if (v == NULL)
+        return;
+
+    // get estimates
+    _q->tau_hat   = qdetector_cccf_get_tau  (_q->detector);
+    _q->gamma_hat = qdetector_cccf_get_gamma(_q->detector);
+    _q->dphi_hat  = qdetector_cccf_get_dphi (_q->detector);
+    _q->phi_hat   = qdetector_cccf_get_phi  (_q->detector);
 
 #if DEBUG_FLEXFRAMESYNC_PRINT
-        printf("***** frame detected! tau-hat:%8.4f, dphi-hat:%8.4f, gamma:%8.2f dB\n",
-                _q->tau_hat, _q->dphi_hat, 20*log10f(_q->gamma_hat));
+    printf("***** frame detected! tau-hat:%8.4f, dphi-hat:%8.4f, gamma:%8.2f dB\n",
+            _q->tau_hat, _q->dphi_hat, 20*log10f(_q->gamma_hat));
 #endif
 
-        // set appropriate filterbank index
-        if (_q->tau_hat > 0) {
-            _q->pfb_index = (unsigned int)(      _q->tau_hat  * _q->npfb) % _q->npfb;
-            _q->mf_counter = 0;
-        } else {
-            _q->pfb_index = (unsigned int)((1.0f+_q->tau_hat) * _q->npfb) % _q->npfb;
-            _q->mf_counter = 1;
-        }
-        
-        // output filter scale (gain estimate, scaled by 1/2 for k=2 samples/symbol)
-        firpfb_crcf_set_scale(_q->mf, 0.5f / _q->gamma_hat);
+    // set appropriate filterbank index
+    if (_q->tau_hat > 0) {
+        _q->pfb_index = (unsigned int)(      _q->tau_hat  * _q->npfb) % _q->npfb;
+        _q->mf_counter = 0;
+    } else {
+        _q->pfb_index = (unsigned int)((1.0f+_q->tau_hat) * _q->npfb) % _q->npfb;
+        _q->mf_counter = 1;
+    }
+    
+    // output filter scale (gain estimate, scaled by 1/2 for k=2 samples/symbol)
+    firpfb_crcf_set_scale(_q->mf, 0.5f / _q->gamma_hat);
 
-        // set frequency/phase of mixer
-        nco_crcf_set_frequency(_q->mixer, _q->dphi_hat);
-        nco_crcf_set_phase    (_q->mixer, _q->phi_hat );
+    // set frequency/phase of mixer
+    nco_crcf_set_frequency(_q->mixer, _q->dphi_hat);
+    nco_crcf_set_phase    (_q->mixer, _q->phi_hat );
 
-        // update state
-        _q->state = FLEXFRAMESYNC_STATE_RXPREAMBLE;
+    // update state
+    _q->state = FLEXFRAMESYNC_STATE_RXPREAMBLE;
 
 #if DEBUG_FLEXFRAMESYNC
-        // the debug_qdetector_flush prevents samples from being written twice
-        _q->debug_qdetector_flush = 1;
+    // the debug_qdetector_flush prevents samples from being written twice
+    _q->debug_qdetector_flush = 1;
 #endif
-        // run buffered samples through synchronizer
-        unsigned int buf_len = qdetector_cccf_get_buf_len(_q->detector);
-        flexframesync_execute(_q, v, buf_len);
+    // run buffered samples through synchronizer
+    unsigned int buf_len = qdetector_cccf_get_buf_len(_q->detector);
+    flexframesync_execute(_q, v, buf_len);
 #if DEBUG_FLEXFRAMESYNC
-        _q->debug_qdetector_flush = 0;
+    _q->debug_qdetector_flush = 0;
 #endif
-    }
 }
 
 // step receiver mixer, matched filter, decimator
diff --git a/src/framing/src/gmskframesync.c b/src/framing/src/gmskframesync.c
index 62c41e1..5f45f27 100644
--- a/src/framing/src/gmskframesync.c
+++ b/src/framing/src/gmskframesync.c
@@ -307,7 +307,7 @@ void gmskframesync_reset(gmskframesync _q)
     _q->payload_counter  = 0;
     
     // clear pre-demod buffer
-    windowcf_clear(_q->buffer);
+    windowcf_reset(_q->buffer);
 
     // reset internal objects
     detector_cccf_reset(_q->frame_detector);
diff --git a/src/framing/src/ofdmflexframegen.c b/src/framing/src/ofdmflexframegen.c
index 58eb0d5..274ba0e 100644
--- a/src/framing/src/ofdmflexframegen.c
+++ b/src/framing/src/ofdmflexframegen.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007 - 2015 Joseph Gaeddert
+ * Copyright (c) 2007 - 2016 Joseph Gaeddert
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -34,7 +34,7 @@
 
 #include "liquid.internal.h"
 
-#define DEBUG_OFDMFLEXFRAMEGEN            0
+#define DEBUG_OFDMFLEXFRAMEGEN  0
 
 // reconfigure internal buffers, objects, etc.
 void ofdmflexframegen_reconfigure(ofdmflexframegen _q);
@@ -45,25 +45,15 @@ void ofdmflexframegen_encode_header(ofdmflexframegen _q);
 // modulate header
 void ofdmflexframegen_modulate_header(ofdmflexframegen _q);
 
-// write first S0 symbol
-void ofdmflexframegen_write_S0a(ofdmflexframegen _q,
-                                float complex * _buffer);
-
-// write second S0 symbol
-void ofdmflexframegen_write_S0b(ofdmflexframegen _q,
-                                float complex * _buffer);
-
-// write S1 symbol
-void ofdmflexframegen_write_S1(ofdmflexframegen _q,
-                               float complex * _buffer);
-
-// write header symbol
-void ofdmflexframegen_write_header(ofdmflexframegen _q,
-                                   float complex * _buffer);
-
-// write payload symbol
-void ofdmflexframegen_write_payload(ofdmflexframegen _q,
-                                    float complex * _buffer);
+// generate samples of assembled frame (internally)
+void ofdmflexframegen_gen_symbol (ofdmflexframegen _q); // (generic)
+void ofdmflexframegen_gen_S0a    (ofdmflexframegen _q); // generate S0 symbol (first)
+void ofdmflexframegen_gen_S0b    (ofdmflexframegen _q); // generate S0 symbol (second)
+void ofdmflexframegen_gen_S1     (ofdmflexframegen _q); // generate S1 symbol
+void ofdmflexframegen_gen_header (ofdmflexframegen _q); // generate header symbol
+void ofdmflexframegen_gen_payload(ofdmflexframegen _q); // generate payload symbol
+void ofdmflexframegen_gen_tail   (ofdmflexframegen _q); // generate tail symbol
+void ofdmflexframegen_gen_zeros  (ofdmflexframegen _q); // generate zeros
 
 // default ofdmflexframegen properties
 static ofdmflexframegenprops_s ofdmflexframegenprops_default = {
@@ -91,9 +81,12 @@ struct ofdmflexframegen_s {
     unsigned int M_data;    // number of data subcarriers
     unsigned int M_S0;      // number of enabled subcarriers in S0
     unsigned int M_S1;      // number of enabled subcarriers in S1
+    unsigned int frame_len; // frame length (M + cp_len)
 
     // buffers
-    float complex * X;      // frequency-domain buffer
+    float complex * X;          // frequency-domain buffer
+    float complex * buf_tx;     // transmit buffer
+    unsigned int    buf_index;  // buffer index
 
     // internal low-level objects
     ofdmframegen fg;        // frame generator object
@@ -125,7 +118,9 @@ struct ofdmflexframegen_s {
         OFDMFLEXFRAMEGEN_STATE_S0b,     // write S0 symbol (second)
         OFDMFLEXFRAMEGEN_STATE_S1,      // write S1 symbol
         OFDMFLEXFRAMEGEN_STATE_HEADER,  // write header symbols
-        OFDMFLEXFRAMEGEN_STATE_PAYLOAD  // write payload symbols
+        OFDMFLEXFRAMEGEN_STATE_PAYLOAD, // write payload symbols
+        OFDMFLEXFRAMEGEN_STATE_TAIL,    // write tail of last symbol
+        OFDMFLEXFRAMEGEN_STATE_ZEROS    // write zeros
     } state;
     int frame_assembled;                // frame assembled flag
     int frame_complete;                 // frame completed flag
@@ -163,7 +158,10 @@ ofdmflexframegen ofdmflexframegen_create(unsigned int              _M,
     q->taper_len = _taper_len;  // taper length
 
     // allocate memory for transform buffers
-    q->X = (float complex*) malloc((q->M)*sizeof(float complex));
+    q->frame_len = q->M + q->cp_len;    // frame length
+    q->X         = (float complex*) malloc((q->M        )*sizeof(float complex));
+    q->buf_tx    = (float complex*) malloc((q->frame_len)*sizeof(float complex));
+    q->buf_index = q->frame_len;
 
     // allocate memory for subcarrier allocation IDs
     q->p = (unsigned char*) malloc((q->M)*sizeof(unsigned char));
@@ -231,6 +229,7 @@ void ofdmflexframegen_destroy(ofdmflexframegen _q)
     free(_q->payload_enc);              // encoded payload bytes
     free(_q->payload_mod);              // modulated payload symbols
     free(_q->X);                        // frequency-domain buffer
+    free(_q->buf_tx);                   // transmit buffer
     free(_q->p);                        // subcarrier allocation
 
     // free main object memory
@@ -240,12 +239,13 @@ void ofdmflexframegen_destroy(ofdmflexframegen _q)
 void ofdmflexframegen_reset(ofdmflexframegen _q)
 {
     // reset symbol counter and state
-    _q->symbol_number = 0;
+    _q->symbol_number        = 0;
     _q->state = OFDMFLEXFRAMEGEN_STATE_S0a;
-    _q->frame_assembled = 0;
-    _q->frame_complete = 0;
-    _q->header_symbol_index = 0;
+    _q->frame_assembled      = 0;
+    _q->frame_complete       = 0;
+    _q->header_symbol_index  = 0;
     _q->payload_symbol_index = 0;
+    _q->buf_index            = _q->frame_len;
 
     // reset internal OFDM frame generator object
     // NOTE: this is important for appropriately setting the pilot phases
@@ -345,16 +345,19 @@ unsigned int ofdmflexframegen_getframelen(ofdmflexframegen _q)
             _q->num_symbols_payload;
 }
 
-// assemble a frame from an array of data
+// assemble a frame from an array of data (NULL pointers will use random data)
 //  _q              :   OFDM frame generator object
 //  _header         :   frame header
 //  _payload        :   payload data [size: _payload_len x 1]
 //  _payload_len    :   payload data length
-void ofdmflexframegen_assemble(ofdmflexframegen _q,
-                               const unsigned char *  _header,
-                               const unsigned char *  _payload,
-                               unsigned int     _payload_len)
+void ofdmflexframegen_assemble(ofdmflexframegen      _q,
+                               const unsigned char * _header,
+                               const unsigned char * _payload,
+                               unsigned int          _payload_len)
 {
+    // reset state
+    ofdmflexframegen_reset(_q);
+
     // check payload length and reconfigure if necessary
     if (_payload_len != _q->payload_dec_len) {
         _q->payload_dec_len = _payload_len;
@@ -365,7 +368,10 @@ void ofdmflexframegen_assemble(ofdmflexframegen _q,
     _q->frame_assembled = 1;
 
     // copy user-defined header data
-    memmove(_q->header, _header, OFDMFLEXFRAME_H_USER*sizeof(unsigned char));
+    if (_header == NULL)
+        memset(_q->header, 0x00, OFDMFLEXFRAME_H_USER*sizeof(unsigned char));
+    else
+        memmove(_q->header, _header, OFDMFLEXFRAME_H_USER*sizeof(unsigned char));
 
     // encode full header
     ofdmflexframegen_encode_header(_q);
@@ -394,63 +400,25 @@ void ofdmflexframegen_assemble(ofdmflexframegen _q,
 #endif
 }
 
-// write symbols of assembled frame
+// write samples of assembled frame
 //  _q              :   OFDM frame generator object
-//  _buffer         :   output buffer [size: N+cp_len x 1]
-int ofdmflexframegen_writesymbol(ofdmflexframegen       _q,
-                                 liquid_float_complex * _buffer)
+//  _buf            :   output buffer [size: _buf_len x 1]
+//  _buf_len        :   output buffer length
+int ofdmflexframegen_write(ofdmflexframegen _q,
+                           float complex *  _buf,
+                           unsigned int     _buf_len)
 {
-    // check if frame is actually assembled
-    if ( !_q->frame_assembled ) {
-        fprintf(stderr,"warning: ofdmflexframegen_writesymbol(), frame not assembled\n");
-        return 1;
-    }
-
-    // increment symbol counter
-    _q->symbol_number++;
-    //printf("writesymbol(): %u\n", _q->symbol_number);
-
-    switch (_q->state) {
-    case OFDMFLEXFRAMEGEN_STATE_S0a:
-        // write S0 symbol (first)
-        ofdmflexframegen_write_S0a(_q, _buffer);
-        break;
-
-    case OFDMFLEXFRAMEGEN_STATE_S0b:
-        // write S0 symbol (second)
-        ofdmflexframegen_write_S0b(_q, _buffer);
-        break;
-
-    case OFDMFLEXFRAMEGEN_STATE_S1:
-        // write S1 symbols
-        ofdmflexframegen_write_S1(_q, _buffer);
-        break;
-
-    case OFDMFLEXFRAMEGEN_STATE_HEADER:
-        // write header symbols
-        ofdmflexframegen_write_header(_q, _buffer);
-        break;
-
-    case OFDMFLEXFRAMEGEN_STATE_PAYLOAD:
-        // write payload symbols
-        ofdmflexframegen_write_payload(_q, _buffer);
-        break;
-
-    default:
-        fprintf(stderr,"error: ofdmflexframegen_writesymbol(), unknown/unsupported internal state\n");
-        exit(1);
-    }
+    unsigned int i;
+    for (i=0; i<_buf_len; i++) {
+        if (_q->buf_index >= _q->frame_len) {
+            ofdmflexframegen_gen_symbol(_q);
+            _q->buf_index = 0;
+        }
 
-    if (_q->frame_complete) {
-        // reset framing object
-#if DEBUG_OFDMFLEXFRAMEGEN
-        printf(" ...resetting...\n");
-#endif
-        ofdmflexframegen_reset(_q);
-        return 1;
+        // TODO: write samples appropriately
+        _buf[i] = _q->buf_tx[_q->buf_index++];
     }
-
-    return 0;
+    return _q->frame_complete;
 }
 
 
@@ -473,7 +441,7 @@ void ofdmflexframegen_reconfigure(ofdmflexframegen _q)
     _q->payload_enc = (unsigned char*) realloc(_q->payload_enc,
                                                _q->payload_enc_len*sizeof(unsigned char));
 #if DEBUG_OFDMFLEXFRAMEGEN
-    printf(">>>> payload : %u (%u encoded)\n", _q->props.payload_len, _q->payload_enc_len);
+    //printf(">>>> payload : %u (%u encoded)\n", _q->props.payload_len, _q->payload_enc_len);
 #endif
 
     // re-create modem
@@ -549,46 +517,63 @@ void ofdmflexframegen_modulate_header(ofdmflexframegen _q)
                         &num_written);
 }
 
+// generate transmit samples (fill internal buffer)
+void ofdmflexframegen_gen_symbol(ofdmflexframegen _q)
+{
+    // increment symbol counter
+    _q->symbol_number++;
+
+    switch (_q->state) {
+    case OFDMFLEXFRAMEGEN_STATE_S0a:     ofdmflexframegen_gen_S0a    (_q); break;
+    case OFDMFLEXFRAMEGEN_STATE_S0b:     ofdmflexframegen_gen_S0b    (_q); break;
+    case OFDMFLEXFRAMEGEN_STATE_S1:      ofdmflexframegen_gen_S1     (_q); break;
+    case OFDMFLEXFRAMEGEN_STATE_HEADER:  ofdmflexframegen_gen_header (_q); break;
+    case OFDMFLEXFRAMEGEN_STATE_PAYLOAD: ofdmflexframegen_gen_payload(_q); break;
+    case OFDMFLEXFRAMEGEN_STATE_TAIL:    ofdmflexframegen_gen_tail   (_q); break;
+    case OFDMFLEXFRAMEGEN_STATE_ZEROS:   ofdmflexframegen_gen_zeros  (_q); break;
+    default:
+        fprintf(stderr,"error: ofdmflexframegen_writesymbol(), unknown/unsupported internal state\n");
+        exit(1);
+    }
+}
+
 // write first S0 symbol
-void ofdmflexframegen_write_S0a(ofdmflexframegen _q,
-                                float complex * _buffer)
+void ofdmflexframegen_gen_S0a(ofdmflexframegen _q)
 {
 #if DEBUG_OFDMFLEXFRAMEGEN
     printf("writing S0[a] symbol\n");
 #endif
 
     // write S0 symbol into front of buffer
-    ofdmframegen_write_S0a(_q->fg, _buffer);
+    ofdmframegen_write_S0a(_q->fg, _q->buf_tx);
 
     // update state
     _q->state = OFDMFLEXFRAMEGEN_STATE_S0b;
 }
 
 // write second S0 symbol
-void ofdmflexframegen_write_S0b(ofdmflexframegen _q,
-                                float complex * _buffer)
+void ofdmflexframegen_gen_S0b(ofdmflexframegen _q)
 {
 #if DEBUG_OFDMFLEXFRAMEGEN
     printf("writing S0[b] symbol\n");
 #endif
 
     // write S0 symbol into front of buffer
-    ofdmframegen_write_S0b(_q->fg, _buffer);
+    ofdmframegen_write_S0b(_q->fg, _q->buf_tx);
 
     // update state
     _q->state = OFDMFLEXFRAMEGEN_STATE_S1;
 }
 
 // write S1 symbol
-void ofdmflexframegen_write_S1(ofdmflexframegen _q,
-                               float complex * _buffer)
+void ofdmflexframegen_gen_S1(ofdmflexframegen _q)
 {
 #if DEBUG_OFDMFLEXFRAMEGEN
     printf("writing S1 symbol\n");
 #endif
 
     // write S1 symbol into end of buffer
-    ofdmframegen_write_S1(_q->fg, _buffer);
+    ofdmframegen_write_S1(_q->fg, _q->buf_tx);
 
     // update state
     _q->symbol_number = 0;
@@ -596,8 +581,7 @@ void ofdmflexframegen_write_S1(ofdmflexframegen _q,
 }
 
 // write header symbol
-void ofdmflexframegen_write_header(ofdmflexframegen _q,
-                                   float complex * _buffer)
+void ofdmflexframegen_gen_header(ofdmflexframegen _q)
 {
 #if DEBUG_OFDMFLEXFRAMEGEN
     printf("writing header symbol\n");
@@ -630,7 +614,7 @@ void ofdmflexframegen_write_header(ofdmflexframegen _q,
     }
 
     // write symbol
-    ofdmframegen_writesymbol(_q->fg, _q->X, _buffer);
+    ofdmframegen_writesymbol(_q->fg, _q->X, _q->buf_tx);
 
     // check state
     if (_q->symbol_number == _q->num_symbols_header) {
@@ -640,8 +624,7 @@ void ofdmflexframegen_write_header(ofdmflexframegen _q,
 }
 
 // write payload symbol
-void ofdmflexframegen_write_payload(ofdmflexframegen _q,
-                                    float complex * _buffer)
+void ofdmflexframegen_gen_payload(ofdmflexframegen _q)
 {
 #if DEBUG_OFDMFLEXFRAMEGEN
     printf("writing payload symbol\n");
@@ -673,10 +656,41 @@ void ofdmflexframegen_write_payload(ofdmflexframegen _q,
     }
 
     // write symbol
-    ofdmframegen_writesymbol(_q->fg, _q->X, _buffer);
+    ofdmframegen_writesymbol(_q->fg, _q->X, _q->buf_tx);
 
     // check to see if this is the last symbol in the payload
     if (_q->symbol_number == _q->num_symbols_payload)
-        _q->frame_complete = 1;
+        _q->state = OFDMFLEXFRAMEGEN_STATE_TAIL;
+}
+
+// generate buffer of zeros
+void ofdmflexframegen_gen_tail(ofdmflexframegen _q)
+{
+#if DEBUG_OFDMFLEXFRAMEGEN
+    printf("writing tail\n");
+#endif
+    // initialize buffer with zeros
+    unsigned int i;
+    for (i=0; i<_q->frame_len; i++)
+        _q->buf_tx[i] = 0.0f;
+
+    // write taper_len samples to buffer
+    ofdmframegen_writetail(_q->fg, _q->buf_tx);
+
+    // mark frame as complete
+    _q->frame_complete = 1;
+    _q->frame_assembled = 0;
+    _q->state = OFDMFLEXFRAMEGEN_STATE_ZEROS;
+}
+
+// generate buffer of zeros
+void ofdmflexframegen_gen_zeros(ofdmflexframegen _q)
+{
+#if DEBUG_OFDMFLEXFRAMEGEN
+    printf("writing zeros\n");
+#endif
+    unsigned int i;
+    for (i=0; i<_q->frame_len; i++)
+        _q->buf_tx[i] = 0.0f;
 }
 
diff --git a/src/framing/src/presync.c b/src/framing/src/presync.c
index a4d84c7..924868b 100644
--- a/src/framing/src/presync.c
+++ b/src/framing/src/presync.c
@@ -145,8 +145,8 @@ void PRESYNC(_print)(PRESYNC() _q)
 
 void PRESYNC(_reset)(PRESYNC() _q)
 {
-    WINDOW(_clear)(_q->rx_i);
-    WINDOW(_clear)(_q->rx_q);
+    WINDOW(_reset)(_q->rx_i);
+    WINDOW(_reset)(_q->rx_q);
 }
 
 // correlate input sequence with particular 
diff --git a/src/multichannel/src/firpfbch.c b/src/multichannel/src/firpfbch.c
index 1abe731..2b5f56d 100644
--- a/src/multichannel/src/firpfbch.c
+++ b/src/multichannel/src/firpfbch.c
@@ -285,7 +285,7 @@ void FIRPFBCH(_reset)(FIRPFBCH() _q)
 {
     unsigned int i;
     for (i=0; i<_q->num_channels; i++) {
-        WINDOW(_clear)(_q->w[i]);
+        WINDOW(_reset)(_q->w[i]);
         _q->x[i] = 0;
         _q->X[i] = 0;
     }
diff --git a/src/multichannel/src/firpfbch2.c b/src/multichannel/src/firpfbch2.c
index f810aa5..88ccf2c 100644
--- a/src/multichannel/src/firpfbch2.c
+++ b/src/multichannel/src/firpfbch2.c
@@ -216,8 +216,8 @@ void FIRPFBCH2(_reset)(FIRPFBCH2() _q)
 
     // clear window buffers
     for (i=0; i<_q->M; i++) {
-        WINDOW(_clear)(_q->w0[i]);
-        WINDOW(_clear)(_q->w1[i]);
+        WINDOW(_reset)(_q->w0[i]);
+        WINDOW(_reset)(_q->w1[i]);
     }
 
     // reset filter/buffer alignment flag
diff --git a/src/multichannel/src/ofdmframe.common.c b/src/multichannel/src/ofdmframe.common.c
index e5a4112..e656362 100644
--- a/src/multichannel/src/ofdmframe.common.c
+++ b/src/multichannel/src/ofdmframe.common.c
@@ -178,7 +178,7 @@ void ofdmframe_init_default_sctype(unsigned int _M,
 {
     // validate input
     if (_M < 6) {
-        fprintf(stderr,"warning: ofdmframe_init_default_sctype(), less than 4 subcarriers\n");
+        fprintf(stderr,"warning: ofdmframe_init_default_sctype(), less than 6 subcarriers\n");
     }
 
     unsigned int i;
@@ -214,6 +214,60 @@ void ofdmframe_init_default_sctype(unsigned int _M,
     }
 }
 
+// initialize default subcarrier allocation
+//  _M      :   number of subcarriers
+//  _f0     :   lower frequency band, _f0 in [-0.5,0.5]
+//  _f1     :   upper frequency band, _f1 in [-0.5,0.5]
+//  _p      :   output subcarrier allocation array, [size: _M x 1]
+void ofdmframe_init_sctype_range(unsigned int    _M,
+                                 float           _f0,
+                                 float           _f1,
+                                 unsigned char * _p)
+{
+    // validate input
+    if (_M < 6) {
+        fprintf(stderr,"warning: ofdmframe_init_sctype_range(), less than 6 subcarriers\n");
+    } else if (_f0 < -0.5f || _f0 > 0.5f) {
+        fprintf(stderr,"error: ofdmframe_init_sctype_range(), lower frequency edge must be in [-0.5,0.5]\n");
+        exit(1);
+    } else if (_f1 < -0.5f || _f1 > 0.5f) {
+        fprintf(stderr,"error: ofdmframe_init_sctype_range(), upper frequency edge must be in [-0.5,0.5]\n");
+        exit(1);
+    } else if (_f0 >= _f1) {
+        fprintf(stderr,"error: ofdmframe_init_sctype_range(), lower frequency edge must be below upper edge\n");
+        exit(1);
+    }
+
+    // get relative edges
+    int M0 = (int)((_f0 + 0.5f) * _M); // lower subcarrier index
+    int M1 = (int)((_f1 + 0.5f) * _M); // upper subcarrier index
+    int Mp = M1 - M0;
+    if (Mp > (int)_M) {
+        Mp = (int)_M;
+    } else if (Mp < 6) {
+        fprintf(stderr,"warning: ofdmframe_init_sctype_range(), less than 6 subcarriers (effectively)\n");
+        exit(1);
+    }
+
+    // designate pilot spacing
+    unsigned int P = (Mp > 34) ? 8 : 4;
+
+    // upper band
+    int i;
+    for (i=0; i<(int)_M; i++) {
+        // shift
+        unsigned int k = ((unsigned int)i + _M/2) % _M;
+        if (i < M0 || i > M1) {
+            // guard band
+            _p[k] = OFDMFRAME_SCTYPE_NULL;
+        } else if ( (k%P)==0 ) {
+            _p[k] = OFDMFRAME_SCTYPE_PILOT;
+        } else {
+            _p[k] = OFDMFRAME_SCTYPE_DATA;
+        }
+    }
+}
+
 // validate subcarrier type (count number of null, pilot, and data
 // subcarriers in the allocation)
 //  _p          :   subcarrier allocation array, [size: _M x 1]
diff --git a/src/optim/src/chromosome.c b/src/optim/src/chromosome.c
index 0d2bae9..c122c6a 100644
--- a/src/optim/src/chromosome.c
+++ b/src/optim/src/chromosome.c
@@ -164,7 +164,7 @@ void chromosome_printf(chromosome _q)
 }
 
 // clear chromosome (set traits to zero)
-void chromosome_clear(chromosome _q)
+void chromosome_reset(chromosome _q)
 {
     unsigned int i;
     for (i=0; i<_q->num_traits; i++)
diff --git a/src/sequence/src/bsequence.c b/src/sequence/src/bsequence.c
index c30d882..2ea0747 100644
--- a/src/sequence/src/bsequence.c
+++ b/src/sequence/src/bsequence.c
@@ -73,7 +73,7 @@ bsequence bsequence_create(unsigned int _num_bits)
 
     // initialze array with zeros
     bs->s = (unsigned int*) malloc( bs->s_len * sizeof(unsigned int) );
-    bsequence_clear(bs);
+    bsequence_reset(bs);
 
     return bs;
 }
@@ -85,7 +85,7 @@ void bsequence_destroy(bsequence _bs)
     free( _bs );
 }
 
-void bsequence_clear(bsequence _bs)
+void bsequence_reset(bsequence _bs)
 {
     memset( _bs->s, 0x00, (_bs->s_len)*sizeof(unsigned int) );
 }
diff --git a/src/sequence/src/msequence.c b/src/sequence/src/msequence.c
index 326e8e2..bbc2ac9 100644
--- a/src/sequence/src/msequence.c
+++ b/src/sequence/src/msequence.c
@@ -212,7 +212,7 @@ void bsequence_init_msequence(bsequence _bs,
 #endif
 
     // clear binary sequence
-    bsequence_clear(_bs);
+    bsequence_reset(_bs);
 
     unsigned int i;
     for (i=0; i<(_ms->n); i++)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/liquid-dsp.git



More information about the pkg-hamradio-commits mailing list