Skip to content

Commit 8cbf028

Browse files
committed
Merge branch 'master' of https://github.com/tejeez/csdr
2 parents 8952449 + d2a0099 commit 8cbf028

3 files changed

Lines changed: 82 additions & 1 deletion

File tree

csdr.c

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1275,6 +1275,8 @@ int main(int argc, char *argv[])
12751275
FFT_PLAN_T* plan=make_fft_c2c(fft_size, windowed, output, 1, benchmark);
12761276
if(benchmark) fprintf(stderr," done\n");
12771277
if(octave) printf("setenv(\"GNUTERM\",\"X11 noraise\");y=zeros(1,%d);semilogy(y,\"ydatasource\",\"y\");\n",fft_size);
1278+
float *windowt;
1279+
windowt = precalculate_window(fft_size, window);
12781280
for(;;)
12791281
{
12801282
FEOF_CHECK;
@@ -1293,7 +1295,8 @@ int main(int argc, char *argv[])
12931295
for(int i=0;i<fft_size-every_n_samples;i++) input[i]=input[i+every_n_samples];
12941296
fread(input+fft_size-every_n_samples, sizeof(complexf), every_n_samples, stdin);
12951297
}
1296-
apply_window_c(input,windowed,fft_size,window);
1298+
//apply_window_c(input,windowed,fft_size,window);
1299+
apply_precalculated_window_c(input,windowed,fft_size,windowt);
12971300
fft_execute(plan);
12981301
if(octave)
12991302
{
@@ -1329,6 +1332,44 @@ int main(int argc, char *argv[])
13291332
}
13301333
}
13311334

1335+
if(!strcmp(argv[1],"logaveragepower_cf"))
1336+
{
1337+
bigbufs=1;
1338+
if(argc<=4) return badsyntax("need required parameters (add_db, table_size, avgnumber)");
1339+
float add_db=0;
1340+
int avgnumber=0;
1341+
int fft_size=0;
1342+
1343+
sscanf(argv[2],"%g",&add_db);
1344+
sscanf(argv[3],"%d",&fft_size);
1345+
sscanf(argv[4],"%d",&avgnumber);
1346+
1347+
if(!getbufsize()) return -2; //dummy
1348+
if(!sendbufsize(initialize_buffers())) return -2;
1349+
1350+
if(fft_size != the_bufsize) return -2;
1351+
1352+
//fprintf(stderr, "logaveragepower_cf %f %d=%d %d\n", add_db, fft_size, the_bufsize, avgnumber);
1353+
add_db -= 10*log10(avgnumber);
1354+
for(;;)
1355+
{
1356+
int i,n;
1357+
for(i = 0; i < the_bufsize; i++) {
1358+
output_buffer[i] = 0;
1359+
}
1360+
FEOF_CHECK;
1361+
for(n = 0; n < avgnumber; n++) {
1362+
FREAD_C;
1363+
//fprintf(stderr, "averaged %d\n", n);
1364+
accumulate_power_cf((complexf*)input_buffer, output_buffer, the_bufsize);
1365+
}
1366+
log_ff(NULL, output_buffer, the_bufsize, add_db);
1367+
FWRITE_R;
1368+
TRY_YIELD;
1369+
}
1370+
return 0;
1371+
}
1372+
13321373
if(!strcmp(argv[1],"fft_exchange_sides_ff"))
13331374
{
13341375
if(argc<=2) return badsyntax("need required parameters (fft_size)");

libcsdr.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,29 @@ void apply_window_c(complexf* input, complexf* output, int size, window_t window
930930
}
931931
}
932932

933+
float *precalculate_window(int size, window_t window)
934+
{
935+
float (*window_function)(float)=firdes_get_window_kernel(window);
936+
float *windowt;
937+
windowt = malloc(sizeof(float) * size);
938+
for(int i=0;i<size;i++) //@precalculate_window
939+
{
940+
float rate=(float)i/(size-1);
941+
windowt[i] = window_function(2.0*rate+1.0);
942+
}
943+
return windowt;
944+
}
945+
946+
void apply_precalculated_window_c(complexf* input, complexf* output, int size, float *windowt)
947+
{
948+
for(int i=0;i<size;i++) //@apply_precalculated_window_c
949+
{
950+
iof(output,i)=iof(input,i)*windowt[i];
951+
qof(output,i)=qof(input,i)*windowt[i];
952+
}
953+
}
954+
955+
933956
void apply_window_f(float* input, float* output, int size, window_t window)
934957
{
935958
float (*window_function)(float)=firdes_get_window_kernel(window);
@@ -949,6 +972,19 @@ void logpower_cf(complexf* input, float* output, int size, float add_db)
949972
for(int i=0;i<size;i++) output[i]=10*output[i]+add_db; //@logpower_cf: pass 3
950973
}
951974

975+
void accumulate_power_cf(complexf* input, float* output, int size)
976+
{
977+
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
978+
979+
}
980+
981+
void log_ff(float* input, float* output, int size, float add_db) {
982+
for(int i=0;i<size;i++) output[i]=log10(output[i]); //@logpower_cf: pass 2
983+
984+
for(int i=0;i<size;i++) output[i]=10*output[i]+add_db; //@logpower_cf: pass 3
985+
}
986+
987+
952988
/*
953989
_____ _ _
954990
| __ \ | | (_)

libcsdr.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,13 @@ typedef struct rational_resampler_ff_s
135135
rational_resampler_ff_t rational_resampler_ff(float *input, float *output, int input_size, int interpolation, int decimation, float *taps, int taps_length, int last_taps_delay);
136136
void rational_resampler_get_lowpass_f(float* output, int output_size, int interpolation, int decimation, window_t window);
137137

138+
float *precalculate_window(int size, window_t window);
138139
void apply_window_c(complexf* input, complexf* output, int size, window_t window);
140+
void apply_precalculated_window_c(complexf* input, complexf* output, int size, float *windowt);
139141
void apply_window_f(float* input, float* output, int size, window_t window);
140142
void logpower_cf(complexf* input, float* output, int size, float add_db);
143+
void accumulate_power_cf(complexf* input, float* output, int size);
144+
void log_ff(float* input, float* output, int size, float add_db);
141145

142146
typedef struct fractional_decimator_ff_s
143147
{

0 commit comments

Comments
 (0)