请教 DSP FFT库到底怎么调用啊~
需要准备些什么?调用什么函数呢
只用DSPF_sp_bitrev_cplx 和DSPF_sp_cfftr2_dit 这个就可以了?
DSPF_sp_bitrev_cplx 中的index数组是怎么得到的啊?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
SUPPORT?能否具体说下呢
我看到 C:\ti\dsplib_c674x_3_1_1_1\examples\fft_example_sp.c 是这样调用的
gen_twiddle_fft_sp(w_sp, N);
DSPF_sp_fftSPxSP(N, x_sp, w_sp, y_sp, brev, 4, 0, N);
brev是单独写出来的
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
};
函数 gen_twiddle_fft_sp 是另外写的
/* Function for generating Specialized sequence of twiddle factors */
void gen_twiddle_fft_sp (float *w, int n)
{
int i, j, k;
double x_t, y_t, theta1, theta2, theta3;
const double PI = 3.141592654;
for (j = 1, k = 0; j <= n >> 2; j = j << 2)
{
for (i = 0; i < n >> 2; i += j)
{
theta1 = 2 * PI * i / n;
x_t = cos (theta1);
y_t = sin (theta1);
w[k] = (float) x_t;
w[k + 1] = (float) y_t;
theta2 = 4 * PI * i / n;
x_t = cos (theta2);
y_t = sin (theta2);
w[k + 2] = (float) x_t;
w[k + 3] = (float) y_t;
theta3 = 6 * PI * i / n;
x_t = cos (theta3);
y_t = sin (theta3);
w[k + 4] = (float) x_t;
w[k + 5] = (float) y_t;
k += 6;
}
}
}
他给的这个例程是不是对所有C6000都是通用的~
gen_twiddle_fft_sp(w_sp, N);和brev数组不知道是通用的么?
我用的是OMAPL138,里面的DSP是C6748的~
你说的那个方法在 C6713测试通过了吧 能不能给个例子呢?
我用的这个库是在C6713下面实现的,是可以用的,用法如下
tw_genr2fft(wd,N); // 产生旋转因子
bit_rev(wd, N>>1); // 把系数倒置,为下面函数输入准备
DSPF_sp_cfftr2_dit(xd, wd, N); //计算该FFT,需要先调用上面两个函数
bit_rev(xd,N); //输出是倒置的,所以重新倒置为正常
tw_genr2fft(wd,N),bit_rev(xd,N),这2个函数在D:\ccstudio3.3\c6700\dsplib\support\fft,这个路径下面,是单独用C语言写的,这个路径就是DSPLIB的安装路径,C6748没用过,不晓得这个库可不可以用。C6748好像和C6713有很大的不同了,连CSL库都没了,你试一试看行不行。C67xDSPLIB_v200.exe,这个库在官网有下载的。
请帮忙看一下我的
tw_genr2fft(w, Numlength);
bit_rev(w,Numlength>>1);
DSPF_sp_cfftr2_dit(Input,w,Numlength);
bit_rev(Input,Numlength);
我头文件用了#include "utility.h" lib有dsp67x.lib但为什么显示这样的错误:
undefined first referenced
symbol in file
--------- ----------------
_bit_rev F:\CCS_Files\FFT_1\FFT\Debug\fft_6713.obj
_tw_genr2fft F:\CCS_Files\FFT_1\FFT\Debug\fft_6713.obj
>> Compilation failure
显示三个函数未定义,但在#include "utility.h"已经声明了呀 ,请指导一下
我把鼠标放函数上点击它弹出来的框可以跳转到utility.h文件的函数声明上,即
void tw_genSPxSPfft(float * w, int n);
void bit_rev(float* x, int n);
void tw_genr2fft(float* w, int n);
void tw_genr4fft(float *, int);
void R4DigitRevIndexTableGen(int n, int * count, unsigned short *IIndex, unsigned short *JIndex);
void digit_reverse(double *yx, unsigned short *JIndex, unsigned short *IIndex, int count);
我的困惑是我用了DSPF_sp_cfftr2_dit()函数,添加了库文件DSPF_sp_cfftr2_dit.h,库文件只有声明,该函数不报错,但bit_rev()h和void tw_genr2fft()在库文件utility.h声明了却报错,是不是support文件里的库文件和include的库文件有很大区别?请专家指导一下,谢谢
penghui zhang 说:我把鼠标放函数上点击它弹出来的框可以跳转到utility.h文件的函数声明上,即
void tw_genSPxSPfft(float * w, int n);
void bit_rev(float* x, int n);
void tw_genr2fft(float* w, int n);
void tw_genr4fft(float *, int);
void R4DigitRevIndexTableGen(int n, int * count, unsigned short *IIndex, unsigned short *JIndex);
void digit_reverse(double *yx, unsigned short *JIndex, unsigned short *IIndex, int count);我的困惑是我用了DSPF_sp_cfftr2_dit()函数,添加了库文件DSPF_sp_cfftr2_dit.h,库文件只有声明,该函数不报错,但bit_rev()h和void tw_genr2fft()在库文件utility.h声明了却报错,是不是support文件里的库文件和include的库文件有很大区别?请专家指导一下,谢谢
库函数里面应该只有DSPF_sp_cfftr2_dit()函数,至少6748是这样的~
二进制位反转和旋转因子的生成函数需要自己写
Ti的例程里面有
我看了support文件里的例子,把二进制反转和旋转因子的生成函数自己复制过来了,可以编译通过,但运行时出现
Trouble running Target CPU: *** Runtime error at PC = 00000994
Resource(s) L Unit Write Port on side B in conflict in E1 phase. Ref SPRU189F Sec 3.7, Sec 4.5, Sec 7.2
的错误,把Numlength大小改成128运行出现
Trouble running Target CPU: Illegal opcode (c394a031) at pc = 0x00002328
的错误,我看了Ref SPRU189F Sec 3.7, Sec 4.5, Sec 7.2 但是根本没有思路,自己理解是内存的问题,还是其他呢,能详细解答吗,谢谢!
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <DSPF_sp_cfftr2_dit.h>
//#include <utility.h>
# define PI 3.14159265358979323846
# define Numlength 32
void gen_w_r2(float* , int );
void bit_rev(float* , int );
void main()
{
int i;
float w[Numlength];
float Input[Numlength*2],Output[Numlength*2];
for(i=0;i<Numlength;i++) //输入Input
{
Input[2*i]=cos(PI*2*i/Numlength*3)*1024;
Input[2*i+1]=0;
}
gen_w_r2(w,Numlength); //产生旋转因子
// tw_genr2fft(w, Numlength); // 产生旋转因子
bit_rev(w,Numlength>>1); //把系数倒置,为下面函数输入准备
DSPF_sp_cfftr2_dit(Input,w,Numlength); ///计算该FFT,需要先调用上面两个函数
bit_rev(Input,Numlength); //输出是倒置的,所以重新倒置为正常
for(i=0;i<(Numlength*2);i++)
{
Output[i]=Input[i];
}
while(1);
}
void gen_w_r2(float* w, int n)
{
int i, j=1;
float pi = 4.0*atan(1.0);
float e = pi*2.0/n;
for(j=1; j < n; j <<= 1)
{
for(i=0; i < ( n>>1 ); i += j)
{
*w++ = cos(i*e);
*w++ = -sin(i*e);
}
}
}
void bit_rev(float* x, int n)
{
int i, j, k;
float rtemp, itemp;
j = 0;
for(i=1; i < (n-1); i++)
{
k = n >> 1;
while(k <= j)
{
j -= k;
k >>= 1;
}
j += k;
if(i < j)
{
rtemp = x[j*2];
x[j*2] = x[i*2];
x[i*2] = rtemp;
itemp = x[j*2+1];
x[j*2+1] = x[i*2+1];
x[i*2+1] = itemp;
}
}
}
东西有点多,刚开始上论坛,写的很杂,见谅,请给点指导,谢谢
penghui zhang 说:我用的是c6713,软件仿真,程序如下:#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <DSPF_sp_cfftr2_dit.h>
//#include <utility.h>
# define PI 3.14159265358979323846
# define Numlength 32void gen_w_r2(float* , int );
void bit_rev(float* , int );void main()
{
int i;
float w[Numlength];
float Input[Numlength*2],Output[Numlength*2];
for(i=0;i<Numlength;i++) //输入Input
{
Input[2*i]=cos(PI*2*i/Numlength*3)*1024;
Input[2*i+1]=0;
}gen_w_r2(w,Numlength); //产生旋转因子
// tw_genr2fft(w, Numlength); // 产生旋转因子
bit_rev(w,Numlength>>1); //把系数倒置,为下面函数输入准备
DSPF_sp_cfftr2_dit(Input,w,Numlength); ///计算该FFT,需要先调用上面两个函数
bit_rev(Input,Numlength); //输出是倒置的,所以重新倒置为正常
for(i=0;i<(Numlength*2);i++)
{
Output[i]=Input[i];
}
while(1);
}
void gen_w_r2(float* w, int n)
{
int i, j=1;
float pi = 4.0*atan(1.0);
float e = pi*2.0/n;
for(j=1; j < n; j <<= 1)
{
for(i=0; i < ( n>>1 ); i += j)
{
*w++ = cos(i*e);
*w++ = -sin(i*e);
}
}
}
void bit_rev(float* x, int n)
{
int i, j, k;
float rtemp, itemp;
j = 0;
for(i=1; i < (n-1); i++)
{
k = n >> 1;
while(k <= j)
{
j -= k;
k >>= 1;
}
j += k;
if(i < j)
{
rtemp = x[j*2];
x[j*2] = x[i*2];
x[i*2] = rtemp;
itemp = x[j*2+1];
x[j*2+1] = x[i*2+1];
x[i*2+1] = itemp;
}
}
}东西有点多,刚开始上论坛,写的很杂,见谅,请给点指导,谢谢
6713的例程里有没有要求变量要内存对齐呢?
类似这样的
#pragma DATA_ALIGN(CFFT_In,8);
使用#pragma预编译命令
我把我测试成功的DSP C6748的代码发上来你参考下哈
bin wang2 说:我用的是c6713,软件仿真,程序如下:#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <DSPF_sp_cfftr2_dit.h>
//#include <utility.h>
# define PI 3.14159265358979323846
# define Numlength 32void gen_w_r2(float* , int );
void bit_rev(float* , int );void main()
{
int i;
float w[Numlength];
float Input[Numlength*2],Output[Numlength*2];
for(i=0;i<Numlength;i++) //输入Input
{
Input[2*i]=cos(PI*2*i/Numlength*3)*1024;
Input[2*i+1]=0;
}gen_w_r2(w,Numlength); //产生旋转因子
// tw_genr2fft(w, Numlength); // 产生旋转因子
bit_rev(w,Numlength>>1); //把系数倒置,为下面函数输入准备
DSPF_sp_cfftr2_dit(Input,w,Numlength); ///计算该FFT,需要先调用上面两个函数
bit_rev(Input,Numlength); //输出是倒置的,所以重新倒置为正常
for(i=0;i<(Numlength*2);i++)
{
Output[i]=Input[i];
}
while(1);
}
void gen_w_r2(float* w, int n)
{
int i, j=1;
float pi = 4.0*atan(1.0);
float e = pi*2.0/n;
for(j=1; j < n; j <<= 1)
{
for(i=0; i < ( n>>1 ); i += j)
{
*w++ = cos(i*e);
*w++ = -sin(i*e);
}
}
}
void bit_rev(float* x, int n)
{
int i, j, k;
float rtemp, itemp;
j = 0;
for(i=1; i < (n-1); i++)
{
k = n >> 1;
while(k <= j)
{
j -= k;
k >>= 1;
}
j += k;
if(i < j)
{
rtemp = x[j*2];
x[j*2] = x[i*2];
x[i*2] = rtemp;
itemp = x[j*2+1];
x[j*2+1] = x[i*2+1];
x[i*2+1] = itemp;
}
}
}东西有点多,刚开始上论坛,写的很杂,见谅,请给点指导,谢谢
6713的例程里有没有要求变量要内存对齐呢?
类似这样的
#pragma DATA_ALIGN(CFFT_In,8);
使用#pragma预编译命令
我把我测试成功的DSP C6748的代码发上来你参考下哈
[/quote]
工程中引用的函数
原文件名 DSPF_sp_fftSPxSP.s
原文件名 DSPF_sp_ifftSPxSP.s
关于变量对齐的问题我在C6713的例程里没有,您给的这两个.s文件是汇编程序,我不知道如何调用,我把函数DSPF_sp_cfftr2_dit()自己用C在主函数之前重新定义,运行可以通过,问题就出在用库文件的DSPF_sp_cfftr2_dit()运行出错,您能不能推荐几个资料我看看,以下是我现在在看的资料,另外TI给的英文资料TMS320C67x_DSP_Library_Programmer's_Reference_Guide.pdf。谢谢您给我之前的帮助
penghui zhang 说:关于变量对齐的问题我在C6713的例程里没有,您给的这两个.s文件是汇编程序,我不知道如何调用,我把函数DSPF_sp_cfftr2_dit()自己用C在主函数之前重新定义,运行可以通过,问题就出在用库文件的DSPF_sp_cfftr2_dit()运行出错,您能不能推荐几个资料我看看,以下是我现在在看的资料,另外TI给的英文资料TMS320C67x_DSP_Library_Programmer's_Reference_Guide.pdf。谢谢您给我之前的帮助
直接声明函数名就可以了~
你可以试试安装新版本的DSP库
资料的话直接看DSP库自带的说明文档就好了
不客气~
我改用 DSPF_sp_fftSPxSP(Numlength,CFFT_In,w,CFFT_Out,brev,2,0,Numlength);这个函现在程序可以跑了,没有用C674X系列的板子,手头拿的是合众达的seed—dec6713,以前跑的出错是在void DSPF_sp_cfftr2_dit(float* , float* , int);的调用上,看了disassemble窗口,以前都停在类似:
000030B0 AACED2C7 .word 0xaaced2c7
000030B4 00000000 || NOP
000030B8 38B504F2 .word 0x38b504f2
000030BC AACED2C7 .word 0xaaced2c7
000030C0 2ACED2C7 .word 0x2aced2c7
000030C4 00000000 || NOP
000030C8 46FA0000 .word 0x46fa0000
000030CC 2ACED2C7 .word 0x2aced2c7
这样的地方,换了函数能跑了,单找不到原因,lib的话我用的是最新的C67xDSPLIB_v200.exe,cmd文件也是照着Ti给的资料写的。
我第一次用这个论坛,遇到好人了,十分感谢!!!!!
penghui zhang 说:我改用 DSPF_sp_fftSPxSP(Numlength,CFFT_In,w,CFFT_Out,brev,2,0,Numlength);这个函现在程序可以跑了,没有用C674X系列的板子,手头拿的是合众达的seed—dec6713,以前跑的出错是在void DSPF_sp_cfftr2_dit(float* , float* , int);的调用上,看了disassemble窗口,以前都停在类似:
000030B0 AACED2C7 .word 0xaaced2c7
000030B4 00000000 || NOP
000030B8 38B504F2 .word 0x38b504f2
000030BC AACED2C7 .word 0xaaced2c7
000030C0 2ACED2C7 .word 0x2aced2c7
000030C4 00000000 || NOP
000030C8 46FA0000 .word 0x46fa0000
000030CC 2ACED2C7 .word 0x2aced2c7这样的地方,换了函数能跑了,单找不到原因,lib的话我用的是最新的C67xDSPLIB_v200.exe,cmd文件也是照着Ti给的资料写的。
我第一次用这个论坛,遇到好人了,十分感谢!!!!!
客气了 大家互相学习罢了
建议关注下Ti的wiki
C674x DSPLIB 函数详解
http://processors.wiki.ti.com/index.php/C674x_DSPLIB
C674x_DSPLIB 已知问题 这里就说了一些库函数使用上需要注意的问题
http://processors.wiki.ti.com/index.php/C674x_DSPLIB_Known_Issues#DSPF_sp_fftSPxSP_Only_Supports_n_.3C.3D_8K
高效实数FFT
http://processors.wiki.ti.com/index.php/Efficient_FFT_Computation_of_Real_Input
C6000 DSP除了外设其它差异不大 你也可以参考下