OpenCores
URL https://opencores.org/ocsvn/dblclockfft/dblclockfft/trunk

Subversion Repositories dblclockfft

[/] [dblclockfft/] [trunk/] [bench/] [cpp/] [fft_tb.cpp] - Blame information for rev 26

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 dgisselq
//
2 9 dgisselq
// Filename:    fft_tb.cpp
3 7 dgisselq
//
4
// Project:     A Doubletime Pipelined FFT
5
//
6 14 dgisselq
// Purpose:     A test-bench for the main program, fftmain.v, of the double
7 9 dgisselq
//              clocked FFT.  This file may be run autonomously  (when
8
//              fully functional).  If so, the last line output will either
9
//              read "SUCCESS" on success, or some other failure message
10
//              otherwise.
11 7 dgisselq
//
12
//              This file depends upon verilator to both compile, run, and
13 9 dgisselq
//              therefore test fftmain.v
14 7 dgisselq
//
15
// Creator:     Dan Gisselquist, Ph.D.
16
//              Gisselquist Tecnology, LLC
17
//
18
///////////////////////////////////////////////////////////////////////////
19
//
20
// Copyright (C) 2015, Gisselquist Technology, LLC
21
//
22
// This program is free software (firmware): you can redistribute it and/or
23
// modify it under the terms of  the GNU General Public License as published
24
// by the Free Software Foundation, either version 3 of the License, or (at
25
// your option) any later version.
26
//
27
// This program is distributed in the hope that it will be useful, but WITHOUT
28
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
29
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
30
// for more details.
31
//
32
// You should have received a copy of the GNU General Public License along
33
// with this program.  (It's in the $(ROOT)/doc directory, run make with no
34
// target there if the PDF file isn't present.)  If not, see
35
// <http://www.gnu.org/licenses/> for a copy.
36
//
37
// License:     GPL, v3, as defined and found on www.gnu.org,
38
//              http://www.gnu.org/licenses/gpl.html
39
//
40
//
41
///////////////////////////////////////////////////////////////////////////
42
#include <stdio.h>
43 9 dgisselq
#include <math.h>
44
#include <fftw3.h>
45 7 dgisselq
 
46
#include "verilated.h"
47
#include "Vfftmain.h"
48 23 dgisselq
#include "twoc.h"
49 7 dgisselq
 
50
#define LGWIDTH 11
51
#define IWIDTH  16
52 26 dgisselq
// #define      OWIDTH  16
53 7 dgisselq
#define OWIDTH  22
54
 
55 23 dgisselq
#define NFTLOG  8
56 7 dgisselq
#define FFTLEN  (1<<LGWIDTH)
57
 
58 26 dgisselq
unsigned long bitrev(const int nbits, const unsigned long vl) {
59
        unsigned long   r = 0;
60
        unsigned long   val = vl;
61
 
62
        for(int k=0; k<nbits; k++) {
63
                r<<= 1;
64
                r |= (val & 1);
65
                val >>= 1;
66
        }
67
 
68
        return r;
69
}
70
 
71 7 dgisselq
class   FFT_TB {
72
public:
73
        Vfftmain        *m_fft;
74 23 dgisselq
        long            m_data[FFTLEN], m_log[NFTLOG*FFTLEN];
75 26 dgisselq
        int             m_iaddr, m_oaddr, m_ntest, m_logbase;
76 7 dgisselq
        FILE            *m_dumpfp;
77 9 dgisselq
        fftw_plan       m_plan;
78
        double          *m_fft_buf;
79
        bool            m_syncd;
80 7 dgisselq
 
81
        FFT_TB(void) {
82
                m_fft = new Vfftmain;
83 9 dgisselq
                m_iaddr = m_oaddr = 0;
84 7 dgisselq
                m_dumpfp = NULL;
85 9 dgisselq
 
86
                m_fft_buf = (double *)fftw_malloc(sizeof(fftw_complex)*(FFTLEN));
87
                m_plan = fftw_plan_dft_1d(FFTLEN, (fftw_complex *)m_fft_buf,
88
                                (fftw_complex *)m_fft_buf,
89
                                FFTW_FORWARD, FFTW_MEASURE);
90
                m_syncd = false;
91
                m_ntest = 0;
92 7 dgisselq
        }
93
 
94
        void    tick(void) {
95
                m_fft->i_clk = 0;
96
                m_fft->eval();
97
                m_fft->i_clk = 1;
98
                m_fft->eval();
99 26 dgisselq
 
100
                /*
101
                int nrpt = (rand()&0x01f) + 1;
102
                m_fft->i_ce = 0;
103
                for(int i=0; i<nrpt; i++) {
104
                        m_fft->i_clk = 0;
105
                        m_fft->eval();
106
                        m_fft->i_clk = 1;
107
                        m_fft->eval();
108
                }
109
                */
110 7 dgisselq
        }
111
 
112
        void    reset(void) {
113
                m_fft->i_ce  = 0;
114
                m_fft->i_rst = 1;
115
                tick();
116
                m_fft->i_rst = 0;
117
                tick();
118 9 dgisselq
 
119 26 dgisselq
                m_iaddr = m_oaddr = m_logbase = 0;
120 9 dgisselq
                m_syncd = false;
121 7 dgisselq
        }
122
 
123 9 dgisselq
        long    twos_complement(const long val, const int bits) {
124 23 dgisselq
                return sbits(val, bits);
125 9 dgisselq
        }
126
 
127
        void    checkresults(void) {
128
                double  *dp, *sp; // Complex array
129
                double  vout[FFTLEN*2];
130
                double  isq=0.0, osq = 0.0;
131
                long    *lp;
132
 
133
                // Fill up our test array from the log array
134 26 dgisselq
                printf("%3d : CHECK: %8d %5x m_log[-%x=%x]\n", m_ntest, m_iaddr, m_iaddr,
135
                        m_logbase, (m_iaddr-m_logbase)&((NFTLOG*FFTLEN-1)&(-FFTLEN)));
136
                dp = m_fft_buf; lp = &m_log[(m_iaddr-m_logbase)&((NFTLOG*FFTLEN-1)&(-FFTLEN))];
137 9 dgisselq
                for(int i=0; i<FFTLEN; i++) {
138
                        long    tv = *lp++;
139
 
140 23 dgisselq
                        dp[0] = sbits(tv >> IWIDTH, IWIDTH);
141
                        dp[1] = sbits(tv, IWIDTH);
142 9 dgisselq
 
143 16 dgisselq
                        // printf("IN[%4d = %4x] = %9.1f %9.1f\n",
144
                                // i+((m_iaddr-FFTLEN*3)&((4*FFTLEN-1)&(-FFTLEN))),
145
                                // i+((m_iaddr-FFTLEN*3)&((4*FFTLEN-1)&(-FFTLEN))),
146
                                // dp[0], dp[1]);
147 9 dgisselq
                        dp += 2;
148
                }
149
 
150
                // Let's measure ... are we the zero vector?  If not, how close?
151
                dp = m_fft_buf;
152 26 dgisselq
                for(int i=0; i<FFTLEN*2; i++) {
153
                        isq += (*dp) * (*dp); dp++;
154
                }
155 9 dgisselq
 
156
                fftw_execute(m_plan);
157
 
158
                // Let's load up the output we received into vout
159
                dp = vout;
160
                for(int i=0; i<FFTLEN; i++) {
161 26 dgisselq
                        *dp = rdata(i);
162 9 dgisselq
                        osq += (*dp) * (*dp); dp++;
163 26 dgisselq
                        *dp = idata(i);
164 9 dgisselq
                        osq += (*dp) * (*dp); dp++;
165
                }
166
 
167
 
168
                // Let's figure out if there's a scale factor difference ...
169
                double  scale = 0.0, wt = 0.0;
170
                sp = m_fft_buf;  dp = vout;
171
                for(int i=0; i<FFTLEN*2; i++) {
172
                        scale += (*sp) * (*dp++);
173
                        wt += (*sp) * (*sp); sp++;
174
                } scale = scale / wt;
175
 
176
                if (wt == 0.0) scale = 1.0;
177
 
178
                double xisq = 0.0;
179
                sp = m_fft_buf;  dp = vout;
180 26 dgisselq
 
181
                if ((true)&&(m_dumpfp)) {
182
                        double  tmp[FFTLEN*2], nscl;
183
 
184
                        if (fabs(scale) < 1e-4)
185
                                nscl = 1.0;
186
                        else
187
                                nscl = scale;
188
                        for(int i=0; i<FFTLEN*2; i++)
189
                                tmp[i] = m_fft_buf[i] * nscl;
190
                        fwrite(tmp, sizeof(double), FFTLEN*2, m_dumpfp);
191
                }
192
 
193 9 dgisselq
                for(int i=0; i<FFTLEN*2; i++) {
194
                        double vl = (*sp++) * scale - (*dp++);
195
                        xisq += vl * vl;
196
                }
197
 
198
                printf("%3d : SCALE = %12.6f, WT = %18.1f, ISQ = %15.1f, ",
199
                        m_ntest, scale, wt, isq);
200
                printf("OSQ = %18.1f, ", osq);
201
                printf("XISQ = %18.1f\n", xisq);
202 19 dgisselq
                if (xisq > 1.4 * FFTLEN/2) {
203 16 dgisselq
                        printf("TEST FAIL!!  Result is out of bounds from ");
204
                        printf("expected result with FFTW3.\n");
205 23 dgisselq
                        // exit(-2);
206 16 dgisselq
                }
207 9 dgisselq
                m_ntest++;
208
        }
209
 
210 7 dgisselq
        bool    test(int lft, int rht) {
211
                m_fft->i_ce    = 1;
212
                m_fft->i_rst   = 0;
213
                m_fft->i_left  = lft;
214
                m_fft->i_right = rht;
215
 
216 23 dgisselq
                m_log[(m_iaddr++)&(NFTLOG*FFTLEN-1)] = (long)lft;
217
                m_log[(m_iaddr++)&(NFTLOG*FFTLEN-1)] = (long)rht;
218 9 dgisselq
 
219 7 dgisselq
                tick();
220
 
221
                if (m_fft->o_sync) {
222 26 dgisselq
                        if (!m_syncd) {
223
                                m_logbase = m_iaddr;
224
                        } // else printf("RESYNC AT %lx\n", m_fft->m_tickcount);
225 9 dgisselq
                        m_oaddr &= (-1<<LGWIDTH);
226
                        m_syncd = true;
227
                } else m_oaddr += 2;
228 7 dgisselq
 
229 26 dgisselq
                printf("%8x,%5d: %08x,%08x -> %011lx,%011lx",
230
                        m_iaddr, m_oaddr,
231
                        lft, rht, m_fft->o_left, m_fft->o_right);
232
                printf( // "\t%011lx,%011lx"
233
                        "\t%3x"
234
                        "\t%011lx,%011lx"               // w_e128, w_o128
235
                        // "\t%011lx,%011lx"            // w_e4, w_o4
236 9 dgisselq
                        // "\t%06x,%06x"
237
                        // "\t%06x,%06x"
238 23 dgisselq
                        // "\t%011lx,%06x,%06x"
239 26 dgisselq
                        "\t%011lx,%06x,%06x"            // ob_a, ob_b_r, ob_b_i
240
                        "\t%06x,%06x,%06x,%06x",        // o_out_xx
241
                        // "\t%011lx,%011lx"
242
                        m_fft->v__DOT__revstage__DOT__iaddr,
243
                        m_fft->v__DOT__w_e128,
244
                        m_fft->v__DOT__w_o128,
245
                        // m_fft->v__DOT__w_e4,
246
                        // m_fft->v__DOT__w_o4,
247 9 dgisselq
                        // m_fft->v__DOT__stage_e512__DOT__ib_a,
248
                        // m_fft->v__DOT__stage_e512__DOT__ib_b,
249
                        // m_fft->v__DOT__stage_e256__DOT__ib_a,
250
                        // m_fft->v__DOT__stage_e256__DOT__ib_b,
251
                        // m_fft->v__DOT__stage_e128__DOT__ib_a,
252
                        // m_fft->v__DOT__stage_e128__DOT__ib_b,
253
                        // m_fft->v__DOT__stage_e64__DOT__ib_a,
254
                        // m_fft->v__DOT__stage_e64__DOT__ib_b,
255
                        // m_fft->v__DOT__stage_e32__DOT__ib_a,
256
                        // m_fft->v__DOT__stage_e32__DOT__ib_b,
257
                        // m_fft->v__DOT__stage_e16__DOT__ib_a,
258
                        // m_fft->v__DOT__stage_e16__DOT__ib_b,
259
                        // m_fft->v__DOT__stage_e8__DOT__ib_a,
260
                        // m_fft->v__DOT__stage_e8__DOT__ib_b,
261
                        // m_fft->v__DOT__stage_o8__DOT__ib_a,
262
                        // m_fft->v__DOT__stage_o8__DOT__ib_b,
263
                        // m_fft->v__DOT__stage_e4__DOT__sum_r,
264
                        // m_fft->v__DOT__stage_e4__DOT__sum_i,
265
                        // m_fft->v__DOT__stage_o4__DOT__sum_r,
266
                        // m_fft->v__DOT__stage_o4__DOT__sum_i,
267 23 dgisselq
                        // m_fft->v__DOT__stage_e4__DOT__ob_a,
268
                        // m_fft->v__DOT__stage_e4__DOT__ob_b_r,
269
                        // m_fft->v__DOT__stage_e4__DOT__ob_b_i,
270 9 dgisselq
                        m_fft->v__DOT__stage_o4__DOT__ob_a,
271
                        m_fft->v__DOT__stage_o4__DOT__ob_b_r,
272
                        m_fft->v__DOT__stage_o4__DOT__ob_b_i,
273 23 dgisselq
                        m_fft->v__DOT__stage_2__DOT__o_out_0r,
274
                        m_fft->v__DOT__stage_2__DOT__o_out_0i,
275
                        m_fft->v__DOT__stage_2__DOT__o_out_1r,
276 26 dgisselq
                        m_fft->v__DOT__stage_2__DOT__o_out_1i);
277
/*
278
                printf(" DBG:%c%c:%08x [%6d,%6d]",
279
                                (m_fft->o_dbg&(1l<<33))?'T':' ',
280
                                (m_fft->o_dbg&(1l<<32))?'C':' ',
281
                                (unsigned)(m_fft->o_dbg&((-1l<<32)-1)),
282
                                ((int)(m_fft->o_dbg))>>16,
283
                                (((unsigned)(m_fft->o_dbg&0x0ffff))
284
                                        |((m_fft->o_dbg&0x08000)?(-1<<16):0)));
285
*/
286
                printf(" %s%s%s%s%s%s%s %s%s\n",
287
                        // m_fft->v__DOT__br_o_left,
288
                        // m_fft->v__DOT__br_o_right,
289
                        // (m_fft->v__DOT__w_s2048)?"S":"-",
290
                        // (m_fft->v__DOT__w_s1024)?"S":"-",
291
                        // (m_fft->v__DOT__w_s512)?"S":"-",
292
                        // (m_fft->v__DOT__w_s256)?"S":"-",
293 7 dgisselq
                        (m_fft->v__DOT__w_s128)?"S":"-",
294
                        (m_fft->v__DOT__w_s64)?"S":"-",
295
                        (m_fft->v__DOT__w_s32)?"S":"-",
296 9 dgisselq
                        (m_fft->v__DOT__w_s16)?"S":"-",
297 7 dgisselq
                        (m_fft->v__DOT__w_s8)?"S":"-",
298 9 dgisselq
                        (m_fft->v__DOT__w_s4)?"S":"-",
299 23 dgisselq
                        (m_fft->v__DOT__br_sync)?"S":((m_fft->v__DOT__r_br_started)?".":"x"),
300 9 dgisselq
                        (m_fft->o_sync)?"\t(SYNC!)":"",
301
                        (m_fft->o_left | m_fft->o_right)?"  (NZ)":"");
302 7 dgisselq
 
303 9 dgisselq
                m_data[(m_oaddr  )&(FFTLEN-1)] = m_fft->o_left;
304
                m_data[(m_oaddr+1)&(FFTLEN-1)] = m_fft->o_right;
305 7 dgisselq
 
306 9 dgisselq
                if ((m_syncd)&&((m_oaddr&(FFTLEN-1)) == FFTLEN-2)) {
307 7 dgisselq
                        dumpwrite();
308 9 dgisselq
                        checkresults();
309
                }
310 7 dgisselq
 
311
                return (m_fft->o_sync);
312
        }
313
 
314
        bool    test(double lft_r, double lft_i, double rht_r, double rht_i) {
315
                int     ilft, irht, ilft_r, ilft_i, irht_r, irht_i;
316
 
317 9 dgisselq
                ilft_r = (int)(lft_r) & ((1<<IWIDTH)-1);
318
                ilft_i = (int)(lft_i) & ((1<<IWIDTH)-1);
319
                irht_r = (int)(rht_r) & ((1<<IWIDTH)-1);
320
                irht_i = (int)(rht_i) & ((1<<IWIDTH)-1);
321 7 dgisselq
 
322
                ilft = (ilft_r << IWIDTH) | ilft_i;
323
                irht = (irht_r << IWIDTH) | irht_i;
324
 
325
                return test(ilft, irht);
326
        }
327
 
328
        double  rdata(int addr) {
329 26 dgisselq
                int     index = addr & (FFTLEN-1);
330
 
331
                // index = bitrev(LGWIDTH, index);
332
                return (double)sbits(m_data[index]>>OWIDTH, OWIDTH);
333 7 dgisselq
        }
334
 
335
        double  idata(int addr) {
336 26 dgisselq
                int     index = addr & (FFTLEN-1);
337
 
338
                // index = bitrev(LGWIDTH, index);
339
                return (double)sbits(m_data[index], OWIDTH);
340 7 dgisselq
        }
341
 
342
        void    dump(FILE *fp) {
343
                m_dumpfp = fp;
344
        }
345
 
346
        void    dumpwrite(void) {
347
                if (!m_dumpfp)
348
                        return;
349
 
350
                double  *buf;
351
 
352
                buf = new double[FFTLEN * 2];
353
                for(int i=0; i<FFTLEN; i++) {
354
                        buf[i*2] = rdata(i);
355
                        buf[i*2+1] = idata(i);
356
                }
357
 
358
                fwrite(buf, sizeof(double), FFTLEN*2, m_dumpfp);
359
                delete[] buf;
360
        }
361
};
362
 
363 9 dgisselq
 
364 7 dgisselq
int     main(int argc, char **argv, char **envp) {
365
        Verilated::commandArgs(argc, argv);
366
        FFT_TB *fft = new FFT_TB;
367
        FILE    *fpout;
368
 
369
        fpout = fopen("fft_tb.dbl", "w");
370
        if (NULL == fpout) {
371
                fprintf(stderr, "Cannot write output file, fft_tb.dbl\n");
372
                exit(-1);
373
        }
374
 
375
        fft->reset();
376
        fft->dump(fpout);
377
 
378 26 dgisselq
        // 1.
379
        fft->test(0.0, 0.0, 32767.0, 0.0);
380
        for(int k=0; k<FFTLEN/2-1; k++)
381
                fft->test(0.0,0.0,0.0,0.0);
382
 
383
        // 2. 
384
        fft->test(32767.0, 0.0, 32767.0, 0.0);
385
        for(int k=0; k<FFTLEN/2-1; k++)
386
                fft->test(0.0,0.0,0.0,0.0);
387
 
388
        // 3. 
389
        fft->test(0.0,0.0,0.0,0.0);
390
        fft->test(32767.0, 0.0, 0.0, 0.0);
391
        for(int k=0; k<FFTLEN/2-1; k++)
392
                fft->test(0.0,0.0,0.0,0.0);
393
 
394
        // 4.
395
        for(int k=0; k<8; k++)
396
                fft->test(32767.0, 0.0, 32767.0, 0.0);
397
        for(int k=8; k<FFTLEN/2; k++)
398
                fft->test(0.0,0.0,0.0,0.0);
399
 
400
        // 5.
401
        if (FFTLEN/2 >= 16) {
402
                for(int k=0; k<16; k++)
403
                        fft->test(32767.0, 0.0, 32767.0, 0.0);
404
                for(int k=16; k<FFTLEN/2; k++)
405
                        fft->test(0.0,0.0,0.0,0.0);
406
        }
407
 
408
        // 6.
409
        if (FFTLEN/2 >= 32) {
410
                for(int k=0; k<32; k++)
411
                        fft->test(32767.0, 0.0, 32767.0, 0.0);
412
                for(int k=32; k<FFTLEN/2; k++)
413
                        fft->test(0.0,0.0,0.0,0.0);
414
        }
415
 
416
        // 7.
417
        if (FFTLEN/2 >= 64) {
418
                for(int k=0; k<64; k++)
419
                        fft->test(32767.0, 0.0, 32767.0, 0.0);
420
                for(int k=64; k<FFTLEN/2; k++)
421
                        fft->test(0.0,0.0,0.0,0.0);
422
        }
423
 
424
        if (FFTLEN/2 >= 128) {
425
                for(int k=0; k<128; k++)
426
                        fft->test(32767.0, 0.0, 32767.0, 0.0);
427
                for(int k=128; k<FFTLEN/2; k++)
428
                        fft->test(0.0,0.0,0.0,0.0);
429
        }
430
 
431
        if (FFTLEN/2 >= 256) {
432
                for(int k=0; k<256; k++)
433
                        fft->test(32767.0, 0.0, 32767.0, 0.0);
434
                for(int k=256; k<FFTLEN/2; k++)
435
                        fft->test(0.0,0.0,0.0,0.0);
436
        }
437
 
438
        if (FFTLEN/2 >= 512) {
439
                for(int k=0; k<256+128; k++)
440
                        fft->test(32767.0, 0.0, 32767.0, 0.0);
441
                for(int k=256+128; k<FFTLEN/2; k++)
442
                        fft->test(0.0,0.0,0.0,0.0);
443
        }
444
 
445
        /*
446
        for(int k=0; k<FFTLEN/2; k++)
447
                fft->test(0.0,0.0,0.0,0.0);
448
 
449
        for(int k=0; k<FFTLEN/2; k++)
450
                fft->test(0.0,0.0,0.0,0.0);
451
 
452
        for(int k=0; k<FFTLEN/2; k++)
453
                fft->test(0.0,0.0,0.0,0.0);
454
 
455
        for(int k=0; k<FFTLEN/2; k++)
456
                fft->test(0.0,0.0,0.0,0.0);
457
 
458
        for(int k=0; k<FFTLEN/2; k++)
459
                fft->test(0.0,0.0,0.0,0.0);
460
 
461
        for(int k=0; k<FFTLEN/2; k++)
462
                fft->test(0.0,0.0,0.0,0.0);
463
        */
464
 
465
#ifndef NO_JUNK
466
        // 7.
467
 
468 9 dgisselq
        //     1 -> 0x0001 
469
        //     2 -> 0x0002 
470
        //     4 -> 0x0004 
471
        //     8 -> 0x0008 
472
        //    16 -> 0x0010 
473
        //    32 -> 0x0020 
474
        //    64 -> 0x0040 
475
        //   128 -> 0x0080 
476
        //   256 -> 0x0100 
477
        //   512 -> 0x0200 
478
        //  1024 -> 0x0400 
479
        //  2048 -> 0x0800
480
        //  4096 -> 0x1000
481
        //  8192 -> 0x2000
482
        // 16384 -> 0x4000
483
        for(int v=1; v<32768; v<<=1) for(int k=0; k<FFTLEN/2; k++)
484
                fft->test((double)v,0.0,(double)v,0.0);
485
        //     1 -> 0xffff      
486
        //     2 -> 0xfffe
487
        //     4 -> 0xfffc
488
        //     8 -> 0xfff8
489
        //    16 -> 0xfff0
490
        //    32 -> 0xffe0
491
        //    64 -> 0xffc0
492
        //   128 -> 0xff80
493
        //   256 -> 0xff00
494
        //   512 -> 0xfe00
495
        //  1024 -> 0xfc00
496
        //  2048 -> 0xf800
497
        //  4096 -> 0xf000
498
        //  8192 -> 0xe000
499
        // 16384 -> 0xc000
500
        // 32768 -> 0x8000
501 26 dgisselq
        fft->test(0.0,0.0,16384.0,0.0);
502
        for(int k=0; k<FFTLEN/2-1; k++)
503
                fft->test(0.0,0.0,0.0,0.0);
504
 
505 9 dgisselq
        for(int v=1; v<=32768; v<<=1) for(int k=0; k<FFTLEN/2; k++)
506
                fft->test(-(double)v,0.0,-(double)v,0.0);
507
        //     1 -> 0x000040    CORRECT!!
508
        //     2 -> 0x000080 
509
        //     4 -> 0x000100 
510
        //     8 -> 0x000200
511
        //    16 -> 0x000400
512
        //    32 -> 0x000800
513
        //    64 -> 0x001000
514
        //   128 -> 0x002000
515
        //   256 -> 0x004000
516
        //   512 -> 0x008000
517
        //  1024 -> 0x010000
518
        //  2048 -> 0x020000
519
        //  4096 -> 0x040000
520
        //  8192 -> 0x080000
521
        // 16384 -> 0x100000
522
        for(int v=1; v<32768; v<<=1) for(int k=0; k<FFTLEN/2; k++)
523
                fft->test(0.0,(double)v,0.0,(double)v);
524
        //     1 -> 0x3fffc0
525
        //     2 -> 0x3fff80
526
        //     4 -> 0x3fff00
527
        //     8 -> 0x3ffe00
528
        //    16 -> 0x3ffc00
529
        //    32 -> 0x3ff800
530
        //    64 -> 0x3ff000
531
        //   128 -> 0x3fe000
532
        //   256 -> 0x3fc000
533
        //   512 -> 0x3f8000
534
        //  1024 -> 0x3f0000
535
        //  2048 -> 0x3e0000
536
        //  4096 -> 0x3c0000
537
        //  8192 -> 0x380000
538
        // 16384 -> 0x300000
539
        for(int v=1; v<32768; v<<=1) for(int k=0; k<FFTLEN/2; k++)
540
                fft->test(0.0,-(double)v,0.0,-(double)v);
541
 
542
        // 61. Now, how about the smallest alternating real signal
543 7 dgisselq
        for(int k=0; k<FFTLEN/2; k++)
544 9 dgisselq
                fft->test(2.0,0.0,0.0,0.0); // Don't forget to expect a bias!
545
        // 62. Now, how about the smallest alternating imaginary signal
546 7 dgisselq
        for(int k=0; k<FFTLEN/2; k++)
547 9 dgisselq
                fft->test(0.0,2.0,0.0,0.0); // Don't forget to expect a bias!
548
        // 63. Now, how about the smallest alternating real signal,2nd phase
549 7 dgisselq
        for(int k=0; k<FFTLEN/2; k++)
550 9 dgisselq
                fft->test(0.0,0.0,2.0,0.0); // Don't forget to expect a bias!
551
        // 64.Now, how about the smallest alternating imaginary signal,2nd phase
552 7 dgisselq
        for(int k=0; k<FFTLEN/2; k++)
553 9 dgisselq
                fft->test(0.0,0.0,0.0,2.0); // Don't forget to expect a bias!
554
 
555
        // 65.
556 7 dgisselq
        for(int k=0; k<FFTLEN/2; k++)
557 9 dgisselq
                fft->test(32767.0,0.0,-32767.0,0.0);
558
        // 66.
559 7 dgisselq
        for(int k=0; k<FFTLEN/2; k++)
560 9 dgisselq
                fft->test(0.0,-32767.0,0.0,32767.0);
561
        // 67.
562 7 dgisselq
        for(int k=0; k<FFTLEN/2; k++)
563 9 dgisselq
                fft->test(-32768.0,-32768.0,-32768.0,-32768.0);
564
        // 68.
565 7 dgisselq
        for(int k=0; k<FFTLEN/2; k++)
566 9 dgisselq
                fft->test(0.0,-32767.0,0.0,32767.0);
567
        // 69.
568 7 dgisselq
        for(int k=0; k<FFTLEN/2; k++)
569 9 dgisselq
                fft->test(0.0,32767.0,0.0,-32767.0);
570
        // 70. 
571
        for(int k=0; k<FFTLEN/2; k++)
572 7 dgisselq
                fft->test(-32768.0,-32768.0,-32768.0,-32768.0);
573
 
574 9 dgisselq
        // 71. Now let's go for an impulse (SUCCESS)
575
        fft->test(16384.0, 0.0, 0.0, 0.0);
576
        for(int k=0; k<FFTLEN/2-1; k++)
577 7 dgisselq
                fft->test(0.0,0.0,0.0,0.0);
578
 
579 9 dgisselq
        // 72. And another one on the next clock (FAILS, ugly)
580
        fft->test(0.0, 0.0, 16384.0, 0.0);
581
        for(int k=0; k<FFTLEN/2-1; k++)
582
                fft->test(0.0,0.0,0.0,0.0);
583 7 dgisselq
 
584 26 dgisselq
        // 72. And another one on the next clock (FAILS, ugly)
585
        fft->test(0.0, 0.0,  8192.0, 0.0);
586
        for(int k=0; k<FFTLEN/2-1; k++)
587
                fft->test(0.0,0.0,0.0,0.0);
588
 
589
        // 72. And another one on the next clock (FAILS, ugly)
590
        fft->test(0.0, 0.0,   512.0, 0.0);
591
        for(int k=0; k<FFTLEN/2-1; k++)
592
                fft->test(0.0,0.0,0.0,0.0);
593
 
594 9 dgisselq
        // 73. And an imaginary one on the second clock
595
        fft->test(0.0, 0.0, 0.0, 16384.0);
596
        for(int k=0; k<FFTLEN/2-1; k++)
597
                fft->test(0.0,0.0,0.0,0.0);
598 7 dgisselq
 
599 9 dgisselq
        // 74. Likewise the next clock
600
        fft->test(0.0,0.0,0.0,0.0);
601
        fft->test(16384.0, 0.0, 0.0, 0.0);
602
        for(int k=0; k<FFTLEN/2-2; k++)
603
                fft->test(0.0,0.0,0.0,0.0);
604 7 dgisselq
 
605 9 dgisselq
        // 75. And it's imaginary counterpart
606
        fft->test(0.0,0.0,0.0,0.0);
607
        fft->test(0.0, 16384.0, 0.0, 0.0);
608
        for(int k=0; k<FFTLEN/2-2; k++)
609
                fft->test(0.0,0.0,0.0,0.0);
610
 
611
        // 76. Likewise the next clock
612
        fft->test(0.0,0.0,0.0,0.0);
613
        fft->test(0.0, 0.0, 16384.0, 0.0);
614
        for(int k=0; k<FFTLEN/2-2; k++)
615
                fft->test(0.0,0.0,0.0,0.0);
616
 
617
        // 77. And it's imaginary counterpart
618
        fft->test(0.0,0.0,0.0,0.0);
619
        fft->test(0.0, 0.0, 0.0, 16384.0);
620
        for(int k=0; k<FFTLEN/2-2; k++)
621
                fft->test(0.0,0.0,0.0,0.0);
622
 
623
 
624
        // 78. Now let's try some exponentials
625
        for(int k=0; k<FFTLEN/2; k++) {
626
                double cl, cr, sl, sr, W;
627
                W = - 2.0 * M_PI / FFTLEN;
628
                cl = cos(W * (2*k  )) * 16383.0;
629
                sl = sin(W * (2*k  )) * 16383.0;
630
                cr = cos(W * (2*k+1)) * 16383.0;
631
                sr = sin(W * (2*k+1)) * 16383.0;
632
                fft->test(cl, sl, cr, sr);
633
        }
634
 
635
        // 72.
636
        for(int k=0; k<FFTLEN/2; k++) {
637
                double cl, cr, sl, sr, W;
638
                W = - 2.0 * M_PI / FFTLEN * 5;
639
                cl = cos(W * (2*k  )) * 16383.0;
640
                sl = sin(W * (2*k  )) * 16383.0;
641
                cr = cos(W * (2*k+1)) * 16383.0;
642
                sr = sin(W * (2*k+1)) * 16383.0;
643
                fft->test(cl, sl, cr, sr);
644
        }
645
 
646
        // 73.
647
        for(int k=0; k<FFTLEN/2; k++) {
648
                double cl, cr, sl, sr, W;
649
                W = - 2.0 * M_PI / FFTLEN * 8;
650
                cl = cos(W * (2*k  )) * 8190.0;
651
                sl = sin(W * (2*k  )) * 8190.0;
652
                cr = cos(W * (2*k+1)) * 8190.0;
653
                sr = sin(W * (2*k+1)) * 8190.0;
654
                fft->test(cl, sl, cr, sr);
655
        }
656
 
657
        // 74.
658
        for(int k=0; k<FFTLEN/2; k++) {
659
                double cl, cr, sl, sr, W;
660
                W = - 2.0 * M_PI / FFTLEN * 25;
661
                cl = cos(W * (2*k  )) * 4.0;
662
                sl = sin(W * (2*k  )) * 4.0;
663
                cr = cos(W * (2*k+1)) * 4.0;
664
                sr = sin(W * (2*k+1)) * 4.0;
665
                fft->test(cl, sl, cr, sr);
666
        }
667 26 dgisselq
#endif
668 9 dgisselq
        // 19.--24. And finally, let's clear out our results / buffer
669
        for(int k=0; k<(FFTLEN/2) * 5; k++)
670
                fft->test(0.0,0.0,0.0,0.0);
671
 
672
 
673
 
674 7 dgisselq
        fclose(fpout);
675 16 dgisselq
 
676
        printf("SUCCESS!!\n");
677
        exit(0);
678 7 dgisselq
}
679
 
680 9 dgisselq
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.