This is fftanal.c in view mode; [Download] [Up]
#include<stdio.h>
#include<math.h>
#include <carl/carl.h>
#include <carl/defaults.h>
struct node {
int flag;
long loc;
double val;
};
#define UP 0
#define DN 1
struct node *np, n;
main(argc, argv)
char **argv;
{
float input, last, srate = FDHISR, thresh = .0001;
int cnt = 0, dir = UP, nodes = 1024, wsize = 16384, i, j,
floatsam = 1;
long samp = 0;
char ch;
float sratio, output;
while ((ch = crack(argv, argv, "hfFpbn|w|t|R|", 0)) != NULL)
{
switch(ch)
{
case 'n': nodes = expr(arg_option); break;
case 'w': wsize = expr(arg_option); break;
case 'R': srate = expr(arg_option); break;
case 'T': thresh = expr(arg_option); break;
case 't': floatsam = 0; break;
case 'h':
case EOF:
default: ffthelp();
}
}
if (isatty(1) && floatsam) {
floatsam = 0;
}
while (getfloat(&input) > 0) {
if (input > last) /* going up */
{
if (dir == DN)
{ /* have just finished down slope */
n.flag = dir;
n.loc = samp-1;
n.val = last;
structsav(&np, n);
++cnt;
dir = UP;
}
}
else /* going down */
{
if (dir == UP)
{ /* have just finished up slope */
if (last > thresh) {
n.flag = dir;
n.loc = samp-1;
n.val = last;
structsav(&np, n);
++cnt;
dir = DN;
}
}
}
last = input;
samp++;
}
sratio = srate / wsize;
for (i = j = 0; i < cnt; i++ ) {
if (floatsam) {
output = np[i].loc * sratio;
putfloat(&output);
output = np[i].val;
putfloat(&output);
} else {
if (np[i].flag==UP)
printf("%6.3f\t%6.3f\n", np[i].loc * sratio,
20.0*log10(np[i].val));
}
}
if (floatsam)
flushfloat();
}
ffthelp()
{
fprintf(stderr, "%s%s%s%s%s%s%s%s%s%s",
"usage: fftanal [flags] < fft_power_spectrum > text\n",
"input must be a file or pipe of floatsams\n",
" flags:\n",
" n = number of expected nodes (1024)\n",
" w = window size used by the fft (16K)\n",
" R = sample rate of original sample data (48K)\n",
" T = minimum node threshold\n",
" f = output binary frequency-amplitude pairs\n",
" F = output binary amplitude only\n",
" t = output text sample pairs (default for tty output)\n",
" b = show long form of analysis\n");
exit(1);
}
int bufcnt;
int buflen;
structsav(base, strct)
struct node **base, strct;
{
if (bufcnt >= buflen) {
buflen += BUFSIZ;
if (*base == NULL) {
if ((*base = (struct node *) malloc(BUFSIZ *
sizeof(struct node))) == NULL)
goto errout;
}
else {
if ((*base = (struct node *) realloc(*base,
buflen * sizeof(struct node))) == NULL)
goto errout;
}
}
(*base)[bufcnt].flag = strct.flag;
(*base)[bufcnt].loc = strct.loc;
(*base)[bufcnt].val = strct.val;
return(++bufcnt);
errout: fprintf(stderr, "structsav: out of memory!\n");
return(-1);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.