Implement fir3db tool
This commit is contained in:
parent
d3f85fea20
commit
9beb3fd39d
2
config
2
config
|
@ -33,8 +33,6 @@ source "scripts/paths"
|
||||||
# Project-specific variables below.
|
# Project-specific variables below.
|
||||||
[ -z "${LIBFIR_CFLAGS}" ] && LIBFIR_CFLAGS="$(libfir-config --cflags)"
|
[ -z "${LIBFIR_CFLAGS}" ] && LIBFIR_CFLAGS="$(libfir-config --cflags)"
|
||||||
[ -z "${LIBFIR_LIBS}" ] && LIBFIR_LIBS="$(libfir-config --libs)"
|
[ -z "${LIBFIR_LIBS}" ] && LIBFIR_LIBS="$(libfir-config --libs)"
|
||||||
[ -z "${GSL_CFLAGS}" ] && GSL_CFLAGS="$(gsl-config --cflags)"
|
|
||||||
[ -z "${GSL_LIBS}" ] && GSL_LIBS="$(gsl-config --libs)"
|
|
||||||
|
|
||||||
[ -z "${CC}" ] && CC="gcc"
|
[ -z "${CC}" ] && CC="gcc"
|
||||||
[ -z "${CFLAGS}" ] && CFLAGS="-g -O2 -W -Wall"
|
[ -z "${CFLAGS}" ] && CFLAGS="-g -O2 -W -Wall"
|
||||||
|
|
|
@ -6,6 +6,16 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Below are all the includes used throughout the application. */
|
/* Below are all the includes used throughout the application. */
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <fir.h>
|
||||||
|
|
||||||
/* options for text editors
|
/* options for text editors
|
||||||
vim: expandtab:ts=4:sw=4
|
vim: expandtab:ts=4:sw=4
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
../fir2csv/200_load_filter.c
|
|
@ -0,0 +1,77 @@
|
||||||
|
/* fir-tools/src/fir3db/800_fir3db.c
|
||||||
|
*
|
||||||
|
* Copyright: ©2014, Laurence Withers
|
||||||
|
* Author: Laurence Withers <l@lwithers.me.uk>
|
||||||
|
* License: GPLv3
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
/* number of points for initial coarse search */
|
||||||
|
npoints = 1000,
|
||||||
|
|
||||||
|
/* number of iterations when finding -3dB point */
|
||||||
|
niter = 10,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
fir3db_aux(struct fir_filter_t* fi, double freq1, double freq2, double gain)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
double complex resp;
|
||||||
|
double fmid, mag;
|
||||||
|
|
||||||
|
for(i = 0; i < niter; ++i) {
|
||||||
|
fmid = (freq1 + freq2) / 2;
|
||||||
|
resp = fir_filter_response(fi, fmid);
|
||||||
|
mag = cabs(resp);
|
||||||
|
|
||||||
|
if(mag > gain) {
|
||||||
|
freq2 = fmid;
|
||||||
|
} else {
|
||||||
|
freq1 = fmid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%.8g\n", fmid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
fir3db(struct fir_filter_t* fi, double gain)
|
||||||
|
{
|
||||||
|
double freq, freq_last, mag, mag_last;
|
||||||
|
double complex resp;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
resp = fir_filter_response(fi, 0);
|
||||||
|
mag_last = cabs(resp);
|
||||||
|
freq_last = 0;
|
||||||
|
|
||||||
|
for(i = 1; i < npoints; ++i) {
|
||||||
|
freq = (i * 0.5) / (npoints - 1);
|
||||||
|
resp = fir_filter_response(fi, freq);
|
||||||
|
mag = cabs(resp);
|
||||||
|
|
||||||
|
if(mag_last < gain && mag >= gain) {
|
||||||
|
fir3db_aux(fi, freq_last, freq, gain);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(mag_last >= gain && mag < gain) {
|
||||||
|
fir3db_aux(fi, freq, freq_last, gain);
|
||||||
|
}
|
||||||
|
|
||||||
|
mag_last = mag;
|
||||||
|
freq_last = freq;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* options for text editors
|
||||||
|
vim: expandtab:ts=4:sw=4
|
||||||
|
*/
|
|
@ -0,0 +1,85 @@
|
||||||
|
/* fir-tools/src/fir3db/999_main.c
|
||||||
|
*
|
||||||
|
* Copyright: ©2014, Laurence Withers
|
||||||
|
* Author: Laurence Withers <l@lwithers.me.uk>
|
||||||
|
* License: GPLv3
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fputs("Usage:\n\n"
|
||||||
|
" " APP_NAME " [options] coeff.txt\n\n"
|
||||||
|
"Options:\n"
|
||||||
|
" -h, --help Display this screen.\n"
|
||||||
|
" -V, --version Display version number.\n"
|
||||||
|
" -g, --gain <gain> Gain to search for (default: 0.5).\n"
|
||||||
|
"", stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const struct option options[] = {
|
||||||
|
{ "help", no_argument, 0, 'h' },
|
||||||
|
{ "version", no_argument, 0, 'V' },
|
||||||
|
{ "gain", no_argument, 0, 'g' },
|
||||||
|
{ 0, 0, 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* optstr = "g:hV";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
struct fir_filter_t* fi;
|
||||||
|
double gain = 0.5;
|
||||||
|
char* endp;
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
switch(getopt_long(argc, argv, optstr, options, 0)) {
|
||||||
|
case -1:
|
||||||
|
goto opts_done;
|
||||||
|
|
||||||
|
case '?':
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
case 'h':
|
||||||
|
usage();
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case 'V':
|
||||||
|
fputs(APP_NAME " " VERSION "\n", stdout);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case 'g':
|
||||||
|
errno = 0;
|
||||||
|
gain = strtod(optarg, &endp);
|
||||||
|
if(errno || !endp || *endp || gain <= 0) {
|
||||||
|
fputs(APP_NAME ": invalid gain. Expecting magnitude > 0.\n",
|
||||||
|
stderr);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
opts_done:
|
||||||
|
if(optind != (argc - 1)) {
|
||||||
|
usage();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fi = load_filter(argv[optind]);
|
||||||
|
fir3db(fi, gain);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* options for text editors
|
||||||
|
vim: expandtab:ts=4:sw=4
|
||||||
|
*/
|
|
@ -6,7 +6,8 @@
|
||||||
if [ -z ${fir3db_BUILT} ]
|
if [ -z ${fir3db_BUILT} ]
|
||||||
then
|
then
|
||||||
fir3db="obj/fir3db"
|
fir3db="obj/fir3db"
|
||||||
EXTRAS="-std=gnu99 -D_GNU_SOURCE -DAPP_NAME=\"fir3db\"" # TODO: more flags
|
EXTRAS="-std=gnu99 -D_GNU_SOURCE -DAPP_NAME=\"fir3db\" -lm \
|
||||||
|
${LIBFIR_CFLAGS} ${LIBFIR_LIBS}"
|
||||||
|
|
||||||
echo "Building application ${fir3db}..."
|
echo "Building application ${fir3db}..."
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue