[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