我在使用dsplib中的fft库函数时,我使用相同的数据(matlab产生,用single转换为单精度模式,写入dat文件中,在CCS端使用load memory加载到指定数组),使用TI参考的例程,但是计算得到的结果与matlab并不一致。下面是程序和部分数据的截图,FFT_Out是DSPfft库函数的计算输出。下面的截图展示的是部分数据,请问为什么会这样?
#include <stdint.h>
#include <math.h>
#include <stdio.h> // C 语言标准输入输出函数库
#include <math.h> // C 数学函数库
#include "mathlib.h" // DSP 数学函数库
#include "dsplib.h" // DSP 函数库
/* Global definitions */
/* Number of samples for which FFT needs to be calculated */
#define N 16384
/* Number of unique sine waves in input data */
#define NUM_SIN_WAVES 4
#define SW_BREAKPOINT asm(" SWBP 0 ");
#define PI 3.141592654
#define F_TOL (1e-06)
#pragma DATA_ALIGN(Input, 8);// 信号
float Input[2*N];
float InputOrig[2*N];// 信号 副本
#pragma DATA_ALIGN(FFT_Out, 8);// FFT 输出
float FFT_Out[2*N];
#pragma DATA_ALIGN(IFFT_Out, 8);// IFFT 输出
float IFFT_Out[2*N];
#pragma DATA_ALIGN(W, 8);// 旋转因子
float W[2*N];
#pragma DATA_ALIGN(x, 8);// 旋转因子
float x[2*N];
/* Align the tables that we have to use */
unsigned char brev[64] = {
0x0, 0x20, 0x10, 0x30, 0x8, 0x28, 0x18, 0x38,
0x4, 0x24, 0x14, 0x34, 0xc, 0x2c, 0x1c, 0x3c,
0x2, 0x22, 0x12, 0x32, 0xa, 0x2a, 0x1a, 0x3a,
0x6, 0x26, 0x16, 0x36, 0xe, 0x2e, 0x1e, 0x3e,
0x1, 0x21, 0x11, 0x31, 0x9, 0x29, 0x19, 0x39,
0x5, 0x25, 0x15, 0x35, 0xd, 0x2d, 0x1d, 0x3d,
0x3, 0x23, 0x13, 0x33, 0xb, 0x2b, 0x1b, 0x3b,
0x7, 0x27, 0x17, 0x37, 0xf, 0x2f, 0x1f, 0x3f
};
void gen_twiddle_fft_sp (float *w, int n)
{
int i, j, k;
// const double PI = 3.141592654;
for (j = 1, k = 0; j <= n >> 2; j = j << 2)
{
for (i = 0; i < n >> 2; i += j)
{
#ifdef _LITTLE_ENDIAN
w[k] = (float) sin (2 * PI * i / n);
w[k + 1] = (float) cos (2 * PI * i / n);
w[k + 2] = (float) sin (4 * PI * i / n);
w[k + 3] = (float) cos (4 * PI * i / n);
w[k + 4] = (float) sin (6 * PI * i / n);
w[k + 5] = (float) cos (6 * PI * i / n);
#else
w[k] = (float) cos (2 * PI * i / n);
w[k + 1] = (float) -sin (2 * PI * i / n);
w[k + 2] = (float) cos (4 * PI * i / n);
w[k + 3] = (float) -sin (4 * PI * i / n);
w[k + 4] = (float) cos (6 * PI * i / n);
w[k + 5] = (float) -sin (6 * PI * i / n);
#endif
k += 6;
}
}
}
void main () {
/* Generate the input data */
// generateInput (NUM_SIN_WAVES);
/* Genarate twiddle factors */
gen_twiddle_fft_sp(W, N);
SW_BREAKPOINT
/* Call FFT routine */
DSPF_sp_fftSPxSP(N, Input, W, FFT_Out, brev, 4, 0, N);
SW_BREAKPOINT
}
CCS显示的部分计算结果
matlab的计算结果
使用的数据文件6683.ccsdata.dat