annotate constant-q-cpp/src/ext/kissfft/test/twotonetest.c @ 372:af71cbdab621 tip

Update bqvec code
author Chris Cannam
date Tue, 19 Nov 2019 10:13:32 +0000
parents 5d0a2ebb4d17
children
rev   line source
Chris@366 1 #include <stdlib.h>
Chris@366 2 #include <string.h>
Chris@366 3 #include <stdio.h>
Chris@366 4 #include "kiss_fft.h"
Chris@366 5 #include "kiss_fftr.h"
Chris@366 6 #include <limits.h>
Chris@366 7
Chris@366 8
Chris@366 9 static
Chris@366 10 double two_tone_test( int nfft, int bin1,int bin2)
Chris@366 11 {
Chris@366 12 kiss_fftr_cfg cfg = NULL;
Chris@366 13 kiss_fft_cpx *kout = NULL;
Chris@366 14 kiss_fft_scalar *tbuf = NULL;
Chris@366 15
Chris@366 16 int i;
Chris@366 17 double f1 = bin1*2*M_PI/nfft;
Chris@366 18 double f2 = bin2*2*M_PI/nfft;
Chris@366 19 double sigpow=0;
Chris@366 20 double noisepow=0;
Chris@366 21 #if FIXED_POINT==32
Chris@366 22 long maxrange = LONG_MAX;
Chris@366 23 #else
Chris@366 24 long maxrange = SHRT_MAX;/* works fine for float too*/
Chris@366 25 #endif
Chris@366 26
Chris@366 27 cfg = kiss_fftr_alloc(nfft , 0, NULL, NULL);
Chris@366 28 tbuf = KISS_FFT_MALLOC(nfft * sizeof(kiss_fft_scalar));
Chris@366 29 kout = KISS_FFT_MALLOC(nfft * sizeof(kiss_fft_cpx));
Chris@366 30
Chris@366 31 /* generate a signal with two tones*/
Chris@366 32 for (i = 0; i < nfft; i++) {
Chris@366 33 #ifdef USE_SIMD
Chris@366 34 tbuf[i] = _mm_set1_ps( (maxrange>>1)*cos(f1*i)
Chris@366 35 + (maxrange>>1)*cos(f2*i) );
Chris@366 36 #else
Chris@366 37 tbuf[i] = (maxrange>>1)*cos(f1*i)
Chris@366 38 + (maxrange>>1)*cos(f2*i);
Chris@366 39 #endif
Chris@366 40 }
Chris@366 41
Chris@366 42 kiss_fftr(cfg, tbuf, kout);
Chris@366 43
Chris@366 44 for (i=0;i < (nfft/2+1);++i) {
Chris@366 45 #ifdef USE_SIMD
Chris@366 46 double tmpr = (double)*(float*)&kout[i].r / (double)maxrange;
Chris@366 47 double tmpi = (double)*(float*)&kout[i].i / (double)maxrange;
Chris@366 48 #else
Chris@366 49 double tmpr = (double)kout[i].r / (double)maxrange;
Chris@366 50 double tmpi = (double)kout[i].i / (double)maxrange;
Chris@366 51 #endif
Chris@366 52 double mag2 = tmpr*tmpr + tmpi*tmpi;
Chris@366 53 if (i!=0 && i!= nfft/2)
Chris@366 54 mag2 *= 2; /* all bins except DC and Nyquist have symmetric counterparts implied*/
Chris@366 55
Chris@366 56 /* if there is power in one of the expected bins, it is signal, otherwise noise*/
Chris@366 57 if ( i!=bin1 && i != bin2 )
Chris@366 58 noisepow += mag2;
Chris@366 59 else
Chris@366 60 sigpow += mag2;
Chris@366 61 }
Chris@366 62 kiss_fft_cleanup();
Chris@366 63 /*printf("TEST %d,%d,%d noise @ %fdB\n",nfft,bin1,bin2,10*log10(noisepow/sigpow +1e-30) );*/
Chris@366 64 return 10*log10(sigpow/(noisepow+1e-50) );
Chris@366 65 }
Chris@366 66
Chris@366 67 int main(int argc,char ** argv)
Chris@366 68 {
Chris@366 69 int nfft = 4*2*2*3*5;
Chris@366 70 if (argc>1) nfft = atoi(argv[1]);
Chris@366 71
Chris@366 72 int i,j;
Chris@366 73 double minsnr = 500;
Chris@366 74 double maxsnr = -500;
Chris@366 75 double snr;
Chris@366 76 for (i=0;i<nfft/2;i+= (nfft>>4)+1) {
Chris@366 77 for (j=i;j<nfft/2;j+=(nfft>>4)+7) {
Chris@366 78 snr = two_tone_test(nfft,i,j);
Chris@366 79 if (snr<minsnr) {
Chris@366 80 minsnr=snr;
Chris@366 81 }
Chris@366 82 if (snr>maxsnr) {
Chris@366 83 maxsnr=snr;
Chris@366 84 }
Chris@366 85 }
Chris@366 86 }
Chris@366 87 snr = two_tone_test(nfft,nfft/2,nfft/2);
Chris@366 88 if (snr<minsnr) minsnr=snr;
Chris@366 89 if (snr>maxsnr) maxsnr=snr;
Chris@366 90
Chris@366 91 printf("TwoToneTest: snr ranges from %ddB to %ddB\n",(int)minsnr,(int)maxsnr);
Chris@366 92 printf("sizeof(kiss_fft_scalar) = %d\n",(int)sizeof(kiss_fft_scalar) );
Chris@366 93 return 0;
Chris@366 94 }