嵌入式开发者社区

标题: 关于FFT计算相角方法求助 [打印本页]

作者: tulipyyf    时间: 2015-1-6 17:14
标题: 关于FFT计算相角方法求助
创龙工程师,你好,贵司的FFT程序中,已经有计算幅值的样例程序,如下   

DSPF_sp_fftSPxSP(n,CFFT_In,Cw,CFFT_Out,brev,rad,0,n);

    // 计算振幅
    for(i=0;i<n;i++)
    {
        Cmo=sqrtsp(CFFT_Out[2*i]*CFFT_Out[2*i]+CFFT_Out[2*i+1]*CFFT_Out[2*i+1]);

        if(i==0)
            Cmo=Cmo/n;
        else
            Cmo=Cmo*2/n;
    }

请问,如何计算对应的相角。谢谢




作者: tulipyyf    时间: 2015-1-6 17:32
自己解决了


作者: 希望缄默    时间: 2015-1-6 17:39



呃~ 这个是一个数学问题吧

tanθ = 虚部/实部
然后用 atan2sp(tanθ) 求得角度
值不唯一 可以相差 2kπ,k∈Z

作者: tulipyyf    时间: 2015-1-7 08:41
谢谢创龙工程师

作者: tulipyyf    时间: 2015-1-7 08:55
早上发现一个问题
我设置一个曲线如下:
        for(i=0;i<n;i++)
                Input[i]=20+
                30*sinsp(2*PI*1.00*(i/fs)+PI*30/180)+
                3*sinsp(2*PI*2*1.00*(i/fs)+PI*60/180)+
                2*sinsp(2*PI*3*1.00*(i/fs)+PI*90/180)+
                0.3*sinsp(2*PI*4*1.00*(i/fs)+PI*120/180)+
                0.2*sinsp(2*PI*5*1.00*(i/fs)+PI*150/180)+
            0.1*sinsp(2*PI*6*1.00*(i/fs)+PI*180/180);

        // 计算振幅
        for(i=0;i<n;i++)
        {
                Cmo[i]=sqrtsp(CFFT_Out[2*i]*CFFT_Out[2*i]+CFFT_Out[2*i+1]*CFFT_Out[2*i+1]);

                if(i==0)
                        Cmo[i]=Cmo[i]/n;
                else
                        Cmo[i]=Cmo[i]*2/n;
        }
        i=0;

        //计算相位       
        for(i=0;i<n;i++)
        {
                Cmo_phase[i]=atan2dp(CFFT_Out[2*i+1],CFFT_Out[2*i]);
        }

发现相位结果不对
基波相位=5.23
二次谐波=5.75
三次谐波=6.28
四次谐波=0.52
五次谐波=1.04
六次谐波=1.57

好像整体角度偏移了 90度。请指教



作者: tulipyyf    时间: 2015-1-7 08:57
CFFT_Out[2*i+1]  应该是虚部,CFFT_Out[2*i] 应该是实部  是吧

作者: tulipyyf    时间: 2015-1-7 09:00
设置成
        for(i=0;i<n;i++)
                Input[i]=20+
                30*cossp(2*PI*1.00*(i/fs)+PI*30/180)+
                3*cossp(2*PI*2*1.00*(i/fs)+PI*60/180)+
                2*cossp(2*PI*3*1.00*(i/fs)+PI*90/180)+
                0.3*cossp(2*PI*4*1.00*(i/fs)+PI*120/180)+
                0.2*cossp(2*PI*5*1.00*(i/fs)+PI*150/180)+
            0.1*cossp(2*PI*6*1.00*(i/fs)+PI*180/180);

角度就对了。但是数字信号处理书本上均是 sin函数构成的,感觉奇怪

作者: 希望缄默    时间: 2015-1-7 20:12
tulipyyf 发表于 2015-1-7 09:00
设置成
        for(i=0;i

[attach]140[/attach]






欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4