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.