mirror of
git://projects.qi-hardware.com/ben-wpan.git
synced 2024-11-04 23:14:06 +02:00
usrp/fft.c: made window function user-selectable, added hann, blackman, rect
- fft.c (window, usage, main): added command line option -w window to select window function - fft.c (window_rectangle, window_hann, window_hamming, window_blackman): increased choice of window functions
This commit is contained in:
parent
fff1e1ed2f
commit
95a9e12e2e
45
usrp/fft.c
45
usrp/fft.c
@ -1,6 +1,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
@ -12,12 +13,33 @@
|
||||
static int alg = 0;
|
||||
|
||||
|
||||
static double window(int i, int n)
|
||||
static double window_rectangle(int i, int n)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static double window_hann(int i, int n)
|
||||
{
|
||||
return 0.5-0.5*cos(M_PI*2*i/(n-1));
|
||||
}
|
||||
|
||||
|
||||
static double window_hamming(int i, int n)
|
||||
{
|
||||
return 0.54-0.46*cos(M_PI*2*i/(n-1));
|
||||
}
|
||||
|
||||
|
||||
static double window_blackman(int i, int n)
|
||||
{
|
||||
return 0.42-0.5*cos(M_PI*2*i/(n-1))+0.08*cos(M_PI*4*i/(n-1));
|
||||
}
|
||||
|
||||
|
||||
static double (*window)(int i, int n) = window_rectangle;
|
||||
|
||||
|
||||
static void fft_complex(int n, const float *re, const float *im, double *res)
|
||||
{
|
||||
fftw_complex *in, *out;
|
||||
@ -30,6 +52,7 @@ static void fft_complex(int n, const float *re, const float *im, double *res)
|
||||
|
||||
for (i = 0; i != n; i++) {
|
||||
double w = window(i, n);
|
||||
|
||||
in[i][0] = re[i]*w;
|
||||
in[i][1] = im[i]*w;
|
||||
}
|
||||
@ -165,13 +188,15 @@ static void do_fft(int skip, int dump, int low, int high, double threshold)
|
||||
static void usage(const char *name)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"usage: %s [-s skip] low high [threshold]\n"
|
||||
" %s [-s skip] -d\n\n"
|
||||
"usage: %s [-s skip] [-w window] low high [threshold]\n"
|
||||
" %s [-s skip] [-w window] -d\n\n"
|
||||
" threshold only use frequency bins with at least this power, in - dB.\n"
|
||||
" E.g., a threshold value of 60 would be -60 dB. (default: %d\n"
|
||||
" dB)\n"
|
||||
" -d dump frequency-domain \n"
|
||||
" -s skip skip this number of samples from the beginning (default: 0)\n"
|
||||
" -w window use the specified window function. Available: blackman, hann,\n"
|
||||
" hamming, rectangle. Default is rectangle.\n"
|
||||
, name, name, -DEFAULT_THRESHOLD);
|
||||
exit(1);
|
||||
}
|
||||
@ -184,7 +209,7 @@ int main(int argc, char **argv)
|
||||
double threshold = DEFAULT_THRESHOLD;
|
||||
int c;
|
||||
|
||||
while ((c = getopt(argc, argv, "a:ds:")) != EOF)
|
||||
while ((c = getopt(argc, argv, "a:ds:w:")) != EOF)
|
||||
switch (c) {
|
||||
case 'a':
|
||||
alg = atoi(optarg);
|
||||
@ -195,6 +220,18 @@ int main(int argc, char **argv)
|
||||
case 's':
|
||||
skip = atoi(optarg);
|
||||
break;
|
||||
case 'w':
|
||||
if (!strcmp(optarg, "blackman"))
|
||||
window = window_blackman;
|
||||
else if (!strcmp(optarg, "hann"))
|
||||
window = window_hann;
|
||||
else if (!strcmp(optarg, "hamming"))
|
||||
window = window_hamming;
|
||||
else if (!strcmp(optarg, "rectangle"))
|
||||
window = window_rectangle;
|
||||
else
|
||||
usage(*argv);
|
||||
break;
|
||||
default:
|
||||
usage(*argv);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user