diff --git a/libs/openzap/msvc/openzap.vcproj b/libs/openzap/msvc/openzap.vcproj index 60f41cdf40..84fe2d134b 100644 --- a/libs/openzap/msvc/openzap.vcproj +++ b/libs/openzap/msvc/openzap.vcproj @@ -472,7 +472,7 @@ Name="Header Files" > bithandler_arg; return attr->bithandler; } -void dsp_bell202_attr_set_bithandler(dsp_bell202_attr_t *attr, bithandler_func_t bithandler, void *bithandler_arg) +void dsp_fsk_attr_set_bithandler(dsp_fsk_attr_t *attr, bithandler_func_t bithandler, void *bithandler_arg) { attr->bithandler = bithandler; attr->bithandler_arg = bithandler_arg; } -bytehandler_func_t dsp_bell202_attr_get_bytehandler(dsp_bell202_attr_t *attr, void **bytehandler_arg) +bytehandler_func_t dsp_fsk_attr_get_bytehandler(dsp_fsk_attr_t *attr, void **bytehandler_arg) { *bytehandler_arg = attr->bytehandler_arg; return attr->bytehandler; } -void dsp_bell202_attr_set_bytehandler(dsp_bell202_attr_t *attr, bytehandler_func_t bytehandler, void *bytehandler_arg) +void dsp_fsk_attr_set_bytehandler(dsp_fsk_attr_t *attr, bytehandler_func_t bytehandler, void *bytehandler_arg) { attr->bytehandler = bytehandler; attr->bytehandler_arg = bytehandler_arg; } -int dsp_bell202_attr_get_samplerate (dsp_bell202_attr_t *attr) +int dsp_fsk_attr_get_samplerate (dsp_fsk_attr_t *attr) { return attr->sample_rate; } -int dsp_bell202_attr_set_samplerate (dsp_bell202_attr_t *attr, int samplerate) +int dsp_fsk_attr_set_samplerate (dsp_fsk_attr_t *attr, int samplerate) { if (samplerate <= 0) { return -1; @@ -115,7 +119,7 @@ int dsp_bell202_attr_set_samplerate (dsp_bell202_attr_t *attr, int samplerate) } /* - * dsp_bell202_create + * dsp_fsk_create * * Creates a handle for subsequent use. The handle is created to contain * a context data structure for use by the sample handler function. The @@ -125,11 +129,11 @@ int dsp_bell202_attr_set_samplerate (dsp_bell202_attr_t *attr, int samplerate) * Once created, the handle can be used until it is destroyed. */ -dsp_bell202_handle_t *dsp_bell202_create(dsp_bell202_attr_t *attr) +dsp_fsk_handle_t *dsp_fsk_create(dsp_fsk_attr_t *attr) { int i; double phi_mark, phi_space; - dsp_bell202_handle_t *handle; + dsp_fsk_handle_t *handle; handle = malloc(sizeof(*handle)); if (!handle) { @@ -157,7 +161,7 @@ dsp_bell202_handle_t *dsp_bell202_create(dsp_bell202_attr_t *attr) handle->correlates[i] = malloc(sizeof(double) * handle->corrsize); if (handle->correlates[i] == NULL) { /* some failed, back out memory allocations */ - dsp_bell202_destroy(&handle); + dsp_fsk_destroy(&handle); return NULL; } } @@ -176,7 +180,7 @@ dsp_bell202_handle_t *dsp_bell202_create(dsp_bell202_attr_t *attr) /* initialize the ring buffer */ handle->buffer = malloc(sizeof(double) * handle->corrsize); if (!handle->buffer) { /* failed; back out memory allocations */ - dsp_bell202_destroy(&handle); + dsp_fsk_destroy(&handle); return NULL; } memset(handle->buffer, 0, sizeof(double) * handle->corrsize); @@ -195,7 +199,7 @@ dsp_bell202_handle_t *dsp_bell202_create(dsp_bell202_attr_t *attr) dsp_uart_attr_set_bytehandler(&uart_attr, handle->attr.bytehandler, handle->attr.bytehandler_arg); uart_handle = dsp_uart_create(&uart_attr); if (uart_handle == NULL) { - dsp_bell202_destroy(&handle); + dsp_fsk_destroy(&handle); return NULL; } handle->attr.bithandler = dsp_uart_bit_handler; @@ -206,13 +210,13 @@ dsp_bell202_handle_t *dsp_bell202_create(dsp_bell202_attr_t *attr) } /* - * dsp_bell202_destroy + * dsp_fsk_destroy * * Destroys a handle, releasing any associated memory. Sets handle pointer to NULL * so A destroyed handle can not be used for anything after the destroy. */ -void dsp_bell202_destroy(dsp_bell202_handle_t **handle) +void dsp_fsk_destroy(dsp_fsk_handle_t **handle) { int i; @@ -242,7 +246,7 @@ void dsp_bell202_destroy(dsp_bell202_handle_t **handle) } /* - * dsp_bell202_sample + * dsp_fsk_sample * * This is the main processing entry point. The function accepts a normalized * sample (i.e., one whose range is between -1 and +1). The function performs @@ -254,7 +258,7 @@ void dsp_bell202_destroy(dsp_bell202_handle_t **handle) */ void -dsp_bell202_sample (dsp_bell202_handle_t *handle, double normalized_sample) +dsp_fsk_sample (dsp_fsk_handle_t *handle, double normalized_sample) { double val; double factors[4]; diff --git a/libs/openzap/src/dsp/fsk.h b/libs/openzap/src/dsp/fsk.h new file mode 100644 index 0000000000..dfb6af369c --- /dev/null +++ b/libs/openzap/src/dsp/fsk.h @@ -0,0 +1,90 @@ + +/* + * bell202.h + * + * Copyright (c) 2005 Robert Krten. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This module contains the manifest constants and declarations for + * the Bell-202 1200 baud FSK modem. + * + * 2005 03 20 R. Krten created +*/ + +#ifndef __BELL202_H__ +#define __BELL202_H__ + +typedef void (*bytehandler_func_t) (void *, int); +typedef void (*bithandler_func_t) (void *, int); + +typedef struct dsp_fsk_attr_s +{ + int sample_rate; /* sample rate in HZ */ + bithandler_func_t bithandler; /* bit handler */ + void *bithandler_arg; /* arbitrary ID passed to bithandler as first argument */ + bytehandler_func_t bytehandler; /* byte handler */ + void *bytehandler_arg; /* arbitrary ID passed to bytehandler as first argument */ +} dsp_fsk_attr_t; + +typedef struct +{ + dsp_fsk_attr_t attr; /* attributes structure */ + double *correlates[4]; /* one for each of sin/cos for mark/space */ + int corrsize; /* correlate size (also number of samples in ring buffer) */ + double *buffer; /* sample ring buffer */ + int ringstart; /* ring buffer start offset */ + double cellpos; /* bit cell position */ + double celladj; /* bit cell adjustment for each sample */ + int previous_bit; /* previous bit (for detecting a transition to sync-up cell position) */ + int current_bit; /* current bit */ + int downsampling_count; /* number of samples to skip */ + int current_downsample; /* current skip count */ +} dsp_fsk_handle_t; + +/* + * Function prototypes + * + * General calling order is: + * a) create the attributes structure (dsp_fsk_attr_init) + * b) initialize fields in the attributes structure (dsp_fsk_attr_set_*) + * c) create a Bell-202 handle (dsp_fsk_create) + * d) feed samples through the handler (dsp_fsk_sample) +*/ + +void dsp_fsk_attr_init(dsp_fsk_attr_t *attributes); + +bithandler_func_t dsp_fsk_attr_get_bithandler(dsp_fsk_attr_t *attributes, void **bithandler_arg); +void dsp_fsk_attr_set_bithandler(dsp_fsk_attr_t *attributes, bithandler_func_t bithandler, void *bithandler_arg); +bytehandler_func_t dsp_fsk_attr_get_bytehandler(dsp_fsk_attr_t *attributes, void **bytehandler_arg); +void dsp_fsk_attr_set_bytehandler(dsp_fsk_attr_t *attributes, bytehandler_func_t bytehandler, void *bytehandler_arg); +int dsp_fsk_attr_get_samplerate(dsp_fsk_attr_t *attributes); +int dsp_fsk_attr_set_samplerate(dsp_fsk_attr_t *attributes, int samplerate); + +dsp_fsk_handle_t * dsp_fsk_create(dsp_fsk_attr_t *attributes); +void dsp_fsk_destroy(dsp_fsk_handle_t **handle); + +void dsp_fsk_sample(dsp_fsk_handle_t *handle, double normalized_sample); + +#endif // __BELL202_H__ + diff --git a/libs/openzap/src/dsp/readme.txt b/libs/openzap/src/dsp/readme.txt index 6283a4345e..6a71f9bf10 100644 --- a/libs/openzap/src/dsp/readme.txt +++ b/libs/openzap/src/dsp/readme.txt @@ -2,29 +2,29 @@ I have only tested the library with samples at 8kHz. It *should* work with arbi The first thing you need to do is initialize a context structure: - dsp_bell202_attr_t fsk1200_attr; // attributes structure for FSK 1200 baud modem - dsp_bell202_handle_t *fsk1200_handle; // context structure for FSK 1200 baud modem + dsp_fsk_attr_t fsk1200_attr; // attributes structure for FSK 1200 baud modem + dsp_fsk_handle_t *fsk1200_handle; // context structure for FSK 1200 baud modem // initialize: - dsp_bell202_attr_init (&fsk1200_attr); // clear attributes structure - dsp_bell202_attr_set_samplerate (&fsk1200_attr, optr); // set sample rate - dsp_bell202_attr_set_bytehandler (&fsk1200_attr, clid_byte_handler, ch); // bind byte handler + dsp_fsk_attr_init (&fsk1200_attr); // clear attributes structure + dsp_fsk_attr_set_samplerate (&fsk1200_attr, optr); // set sample rate + dsp_fsk_attr_set_bytehandler (&fsk1200_attr, clid_byte_handler, ch); // bind byte handler // create context: - fsk1200_handle = dsp_bell202_create (&fsk1200_attr); + fsk1200_handle = dsp_fsk_create (&fsk1200_attr); // error check: if (fsk1200_handle == NULL) { - fprintf (stderr, "%s: can't dsp_bell202_create, errno %d (%s)\n", progname, errno, strerror (errno)); + fprintf (stderr, "%s: can't dsp_fsk_create, errno %d (%s)\n", progname, errno, strerror (errno)); exit (EXIT_FAILURE); } If you are decoding multiple channels, you will need multiple context structures; one per channel. -The attributes ("dsp_bell202_attr_t") do not have to be persistent, but the handle does. -There's even a "dsp_bell202_destroy()" function call to remove the context structure; I don't believe I've ever used it, my stuff hangs around forever. +The attributes ("dsp_fsk_attr_t") do not have to be persistent, but the handle does. +There's even a "dsp_fsk_destroy()" function call to remove the context structure; I don't believe I've ever used it, my stuff hangs around forever. Then, you need to feed samples into the software modem: - dsp_bell202_sample (fsk1200_handle, (double) sample / 32767.); + dsp_fsk_sample (fsk1200_handle, (double) sample / 32767.); It assumes the samples are between -1 and 1 as a double.