7 #include "stack_alloc.h"
11 #define M_PI 3.141592653
15 void check(kiss_fft_scalar * in,kiss_fft_scalar * out,int nfft,int isinverse)
18 double errpow=0,sigpow=0;
20 for (bin=0;bin<nfft/2;++bin) {
24 for (k=0;k<nfft;++k) {
25 double phase = 2*M_PI*(k+.5+.25*nfft)*(bin+.5)/nfft;
26 double re = cos(phase);
32 /*printf ("%f %f\n", ansr, out[bin]);*/
33 difr = ansr - out[bin];
37 snr = 10*log10(sigpow/errpow);
38 printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr );
40 printf( "** poor snr: %f **\n", snr);
45 void check_inv(kiss_fft_scalar * in,kiss_fft_scalar * out,int nfft,int isinverse)
48 double errpow=0,sigpow=0;
50 for (bin=0;bin<nfft;++bin) {
54 for (k=0;k<nfft/2;++k) {
55 double phase = 2*M_PI*(bin+.5+.25*nfft)*(k+.5)/nfft;
56 double re = cos(phase);
62 /*printf ("%f %f\n", ansr, out[bin]);*/
63 difr = ansr - out[bin];
67 snr = 10*log10(sigpow/errpow);
68 printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr );
70 printf( "** poor snr: %f **\n", snr);
76 void test1d(int nfft,int isinverse)
79 size_t buflen = sizeof(kiss_fft_scalar)*nfft;
81 kiss_fft_scalar * in = (kiss_fft_scalar*)malloc(buflen);
82 kiss_fft_scalar * out= (kiss_fft_scalar*)malloc(buflen);
83 celt_word16_t * window= (celt_word16_t*)malloc(sizeof(celt_word16_t)*nfft/2);
86 mdct_init(&cfg, nfft);
87 for (k=0;k<nfft;++k) {
88 in[k] = (rand() % 32768) - 16384;
91 for (k=0;k<nfft/2;++k) {
94 #ifdef DOUBLE_PRECISION
95 for (k=0;k<nfft;++k) {
102 for (k=0;k<nfft;++k) {
107 /*for (k=0;k<nfft;++k) printf("%d %d ", in[k].r, in[k].i);printf("\n");*/
113 mdct_backward(&cfg,in,out, window, nfft/2);
114 check_inv(in,out,nfft,isinverse);
116 mdct_forward(&cfg,in,out,window, nfft/2);
117 check(in,out,nfft,isinverse);
119 /*for (k=0;k<nfft;++k) printf("%d %d ", out[k].r, out[k].i);printf("\n");*/
127 int main(int argc,char ** argv)
132 for (k=1;k<argc;++k) {
133 test1d(atoi(argv[k]),0);
134 test1d(atoi(argv[k]),1);
143 #ifndef RADIX_TWO_ONLY