Skip to content

Commit f9d6d22

Browse files
committed
Implement averaged FFT
1 parent 84e0018 commit f9d6d22

3 files changed

Lines changed: 53 additions & 0 deletions

File tree

csdr.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,6 +1299,44 @@ int main(int argc, char *argv[])
12991299
}
13001300
}
13011301

1302+
if(!strcmp(argv[1],"logaveragepower_cf"))
1303+
{
1304+
bigbufs=1;
1305+
if(argc<=4) return badsyntax("need required parameters (add_db, table_size, avgnumber)");
1306+
float add_db=0;
1307+
int avgnumber=0;
1308+
int fft_size=0;
1309+
1310+
sscanf(argv[2],"%g",&add_db);
1311+
sscanf(argv[3],"%d",&fft_size);
1312+
sscanf(argv[4],"%d",&avgnumber);
1313+
1314+
if(!getbufsize()) return -2; //dummy
1315+
if(!sendbufsize(initialize_buffers())) return -2;
1316+
1317+
if(fft_size != the_bufsize) return -2;
1318+
1319+
//fprintf(stderr, "logaveragepower_cf %f %d=%d %d\n", add_db, fft_size, the_bufsize, avgnumber);
1320+
add_db -= 10*log10(avgnumber);
1321+
for(;;)
1322+
{
1323+
int i,n;
1324+
for(i = 0; i < the_bufsize; i++) {
1325+
output_buffer[i] = 0;
1326+
}
1327+
FEOF_CHECK;
1328+
for(n = 0; n < avgnumber; n++) {
1329+
FREAD_C;
1330+
//fprintf(stderr, "averaged %d\n", n);
1331+
accumulate_power_cf((complexf*)input_buffer, output_buffer, the_bufsize);
1332+
}
1333+
log_ff(NULL, output_buffer, the_bufsize, add_db);
1334+
FWRITE_R;
1335+
TRY_YIELD;
1336+
}
1337+
return 0;
1338+
}
1339+
13021340
if(!strcmp(argv[1],"fft_exchange_sides_ff"))
13031341
{
13041342
if(argc<=2) return badsyntax("need required parameters (fft_size)");

libcsdr.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,6 +949,19 @@ void logpower_cf(complexf* input, float* output, int size, float add_db)
949949
for(int i=0;i<size;i++) output[i]=10*output[i]+add_db; //@logpower_cf: pass 3
950950
}
951951

952+
void accumulate_power_cf(complexf* input, float* output, int size)
953+
{
954+
for(int i=0;i<size;i++) output[i] += iof(input,i)*iof(input,i) + qof(input,i)*qof(input,i); //@logpower_cf: pass 1
955+
956+
}
957+
958+
void log_ff(float* input, float* output, int size, float add_db) {
959+
for(int i=0;i<size;i++) output[i]=log10(output[i]); //@logpower_cf: pass 2
960+
961+
for(int i=0;i<size;i++) output[i]=10*output[i]+add_db; //@logpower_cf: pass 3
962+
}
963+
964+
952965
/*
953966
_____ _ _
954967
| __ \ | | (_)

libcsdr.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ void rational_resampler_get_lowpass_f(float* output, int output_size, int interp
138138
void apply_window_c(complexf* input, complexf* output, int size, window_t window);
139139
void apply_window_f(float* input, float* output, int size, window_t window);
140140
void logpower_cf(complexf* input, float* output, int size, float add_db);
141+
void accumulate_power_cf(complexf* input, float* output, int size);
142+
void log_ff(float* input, float* output, int size, float add_db);
141143

142144
typedef struct fractional_decimator_ff_s
143145
{

0 commit comments

Comments
 (0)