<br /><br />#include <stdio.h><br />#include <stdlib.h><br />#include <csl.h><br />#include <csl_timer.h><br />#include <math.h><br /><br />/* ======================================================================== */<br />/* Include the DSPLIB header file */<br />/* ======================================================================== */<br />#include "dsp_fft32x32.h"<br /><br />/* ======================================================================== */<br />/* Macro definition */<br />/* ======================================================================== */<br />#define PI (3.141592654)<br />#define NN (512)<br /><br />/* ======================================================================== */<br />/* Input and output arrays */<br />/* ======================================================================== */<br />#pragma DATA_ALIGN(x, 8) <br />#pragma DATA_ALIGN(xx, 8) <br />#pragma DATA_ALIGN(y, 8)<br />#pragma DATA_ALIGN(w, 8)<br />int x[2*NN]; <br />int w[2*NN]; <br />int xx[2*NN]; <br />int y[2*NN]; <br />unsigned int z[2*NN]; <br />short ch[NN];<br />/* ======================================================================== */<br />/* D2I -- Truncate a 'double' to a 'int', with clamping. */<br />/* ======================================================================== */<br />static int d2i(double d)<br />{<br /> if (d >= 2147483647.0) return (int)0x7FFFFFFF;<br /> if (d <= -2147483648.0) return (int)0x80000000;<br /> return (int)d;<br />}<br /><br /><br />int gen_twiddle_fft32x32(int *w, int n, double scale)<br />{<br /> int i, j, k, s=0, t;<br /><br /> for (j = 1, k = 0; j < n >> 2; j = j << 2, s++)<br /> {<br /> for (i = t=0; i < n >> 2; i += j, t++)<br /> {<br /> w[k + 5] = d2i(scale * cos(6.0 * PI * i / n));<br /> w[k + 4] = d2i(scale * sin(6.0 * PI * i / n));<br /><br /> w[k + 3] = d2i(scale * cos(4.0 * PI * i / n));<br /> w[k + 2] = d2i(scale * sin(4.0 * PI * i / n));<br /><br /> w[k + 1] = d2i(scale * cos(2.0 * PI * i / n));<br /> w[k + 0] = d2i(scale * sin(2.0 * PI * i / n));<br /><br /> k += 6;<br /> }<br /> }<br /><br /> return k;<br />}<br /><br /><br /><br />void main(void)<br />{<br /> FILE *file;<br /><br /> short iRead; <br /> int i; <br /><br /> int tempI,tempR;<br /><br /> /* ==================================================================== */<br /> /* Initialize Chip Support Library */<br /> /* ==================================================================== */<br /> CSL_init(); <br /><br /><br /> file = fopen("test1.PCM", "rb");<br /><br /> iRead = fread(ch, 1, NN, file);<br /> //iRead = fread(ch, 1, NN, file);<br /><br /> fclose(file);<br /><br /> /* ==================================================================== */<br /> /* Generate Q.31 input data */<br /> /* ==================================================================== */<br /> for(i=0; i<NN; i++) <br /> {<br /> x[2*i] = xx[2*i] = (int)ch; <br /> x[2*i+1] = xx[2*i+1] = 0; <br /> }<br /><br /><br /> /* ==================================================================== */<br /> /* Generate twiddle factors */<br /> /* ==================================================================== */<br /> gen_twiddle_fft32x32(w, NN, 2147483647.); <br /> DSP_fft32x32(w, NN, x, y); <br /> <br /> for(i=0; i<NN; i++) <br /> { tempI=y[i*2];<br /> tempR=y[i*2+1];<br /> z = tempI * tempI + tempR * tempR; <br /> <br /> }<br /> <br /> <br /> printf("END\n" );<br /><br />}<br /><br />/* ======================================================================== */<br />/* End of file: fft32x32_main.c */<br />/* ======================================================================== */<br /><br /><br />test1.pcm是8K采样的16BIT语音信号文件。用cool edit pro软件产生。实际是一个440hz正弦信号。<br />问题描述(用的是CCS3.1环境):<br />1、当信号幅值很小的时候,运行程序到末尾后用view/graph看z数组。发现会出现两个对称的峰值。第一个落在z[28]附件,另外一个落在z[480]附件。为什么这样?这是一个正弦波<br /> 。虽然z没有开平方,但是应该是单一峰值啊。<br />2、当增大波形的幅值,频率不变后,再看z。发现峰值的波形变宽变乱。为什么这个算法和输入的动态范围有关?如何让FFT变换和输入幅值没有关系?<br />3、把iRead = fread(ch, 1, NN, file);语句重复,也就是ch的值取文件的第二次读写结果进行变换,z的结果完全乱了。按照道理,波形文件足够长,又是一个正弦波形。<br /> 应该没有变化才对。我怀疑什么地方错了。但是我用view/graph看xx的FFT,没有改变。这么说变换前数据是一样的。这是为什么?<br /> |
|