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.

2812实现FFT问题,计算结果的反正切相位不符

Other Parts Discussed in Thread: CONTROLSUITE

学习的例程,使用蝶形运算进行fft。

发现改变NL(即N)从256变成512,fft结果变差,output[5]从0.99变成0.95

而且相位值利用fft输出Sample[N]数组计算  atan2(Sample[5].imag,Sample[5].real)和产生的输入数据不符合,这是为什么呢?fft计算方法有错误么?

附件是fft主函数,cmd文件就在N变成512时增大了DRAMH0 ,长度从0x001000变成0x002000

  • N 改变,数组各点的频率点将改变,所得到数值会变化,你是否根据频率点来界定数据正确与否

  • 您好,谢谢你的回复。输入信号采用的 Input[i]=sin(2*pi*5*i/(NL-1)+30*pi/180)+sin(2*pi*i*5*3/(NL-1)+60*pi/180)/3+sin(2*pi*i*5*5/(NL-1)+90*pi/180)/5;

    N改变后,对应的基波应该还是在output[5]这个位置呀。而且output中最大值一直就是在5hz这个频率点,从0.99变成了0.95.

    相位用虚部实部计算就不是输入信号。

     我用matlab进行fft,对同样的信号进行变换,fft输出结果的虚实部满足输入信号的幅值和相位,是这种fft算法不对么? dsp实现fft的结果和matlab实现fft的结果不一样,虚部实部不同

  • Fn=(n-1)*Fs/N, 点变了应该会变的吧,你用的是TI 的库吗?可以把数据导出到matlab中运算一下,对比一下,运算应该会一致的

  • 没用ti的库,用的研旭的例程,我试了N变成128,输出的output[5]也十分接近1,N=256就是例程自带的。N=512就变差了,这个Fs采样频率,我看程序中好像没有定义,针对的信号是相同的,N不同,采样点数值也会变化。我直接查看fft计算结果,发现输出复数的虚部实部和matlab计算的并不相同

     TI库的fft函数实在看不懂cfft32xxx.asm的内容,同时也不明白fft.ipcbptr  ,fft.magptr之类的代表什么,我没找到这个fft包含的东西,您那有TI库的使用例子么?

    void MYFFT(struct Complex *xin,int N)//输入为复数指针*xin,做N点的FFT
    {
    int L=0;//级间运算层
    int J=0;//级内运算层
    int K=0,KB=0;//蝶形运算层
    int M=1,Nn=0;//N=2^M
    float B=0;//蝶形运算亮数据间隔
    //建立倒序运算局部变量
    int LH=0,J2=0,N1=0,K2=0,I;
    struct Complex T;
    //倒序运算
    LH=N/2;
    J2=LH;
    N1=N-2;
    for(I=1;I<=N1;I++) //N1有问题
    {
    if(I<J2)
    {
    T=xin[I];
    xin[I]=xin[J2];
    xin[J2]=T;
    }
    K2=LH;
    while(J2>=K2)
    {
    J2-=K2;
    K2=K2/2;
    }
    J2+=K2;
    }
    //计算M
    Nn=N;
    while(Nn!=2)
    {
    M++;
    Nn=Nn/2;
    }
    //蝶形运算
    for(L=1;L<=M;L++)
    {
    B=pow(2,(L-1));
    Vn.real=1;
    Vn.imag=0;
    Wn.real=cos(pi/B);
    Wn.imag=-sin(pi/B); //Wn=cos(pi/2^(L-1))-j*sin(pi/2^(L-1))
    //Wn=e^(-j*2pi/2^L)
    for(J=0;J<B;J++)//级内
    {
    for(K=J;K<N;K=K+2*B)//蝶形
    {
    KB=K+B;
    T=MUL(xin[KB],Vn);
    xin[KB].real=xin[K].real-T.real;//原址运算,将计算结果存放在原来数组中
    xin[KB].imag=xin[K].imag-T.imag;
    xin[K].real=xin[K].real+T.real;
    xin[K].imag=xin[K].imag+T.imag;
    }
    Vn=MUL(Wn,Vn);
    }

    }

    }

    for(i=0;i<NL;i++) //产生一个三次谐波叠加而成的方波
    {
    //Input[i]=sin(2*pi*5*i/(NL-1));
    Input[i]=sin(2*pi*5*i/(NL-1))+sin(2*pi*i*5*3/(NL-1)+pi*30/180)/3+sin(2*pi*i*5*5/(NL-1)+pi*90/180)/5;
    //Input[i]=2+3*cos(2*pi*50*i/(NL-1)-pi*30/180)+1.5*cos(2*pi*75*i/(NL-1)+pi*90/180);
    }
    for(i=0;i<NL;i++) //输入实数信号转换为复数
    {
    Sample[i].real=Input[i];
    Sample[i].imag=0;
    }
    MYFFT(Sample,NL); //FFT
    ModelComplex(Sample,NL,output); //求模
    PhaseComplex(Sample,NL,phase);

  • TI的dsp库,看官方文档就好了,controlsuite中:

    controlSUITE\libs\dsp\FixedPointLib\v101\doc

  • N变化,由于使用的是 Input[i]=sin(2*pi*5*i/(NL-1)+30*pi/180)+sin(2*pi*i*5*3/(NL-1)+60*pi/180)/3+sin(2*pi*i*5*5/(NL-1)+90*pi/180)/5;这种作为输入采样数据,可见其采样频率也跟着变化了呀

    Fn=(n-1)*Fs/N对应的频率点应该仍旧是n Hz吧,相当于是256采样点,采样频率256Hz;512采样点,采样频率512Hz

  • 嗯,找到了C28x Fixed Point DSP Library v101.pdf这个文档,估计也只能看懂如何调用的,具体的汇编语言实现真是看不明白

  • 之前没注意到你的这个信号源,这样的话,的确信号源频率有跟着变化,对应的点虽然频率不是原来的频率,但是却是原来的幅值。

    理想情况是一致的,但由于fft的本身一些效应,结果会有一些差异。

    FFT算法是一致的,用汇编实现是针对dsp的优化,完全可以不用管。