嵌入式开发者社区

标题: 实时音频信号的FFT变换,求教各位大神!!! [打印本页]

作者: 方穹    时间: 2017-7-7 09:24
标题: 实时音频信号的FFT变换,求教各位大神!!!
本帖最后由 方穹 于 2017-7-7 09:37 编辑

在mic_in例程上,稍作修改,对传入的音频信号做FFT变换。FFT部分用到的数组定义都和例程中一样,debug模式下,各个数组的值看起来都没有问题,可是测试结果一直是FFT失败。不知道怎么回事啊
// 采样点数
#define Tn  16384
// 采样频率
#define Fs  48000
// 快速傅里叶变换基
#define rad 4

...........
static unsigned int tempBuf[AUDIO_BUF_SIZE];
..........


unsigned int *pWave;
          pWave = tempBuf;
          //pWave++;

          unsigned int *send;
          send = tempBuf1;
          send++;


    // 主循环,当一个新的 buffer 接收完成后,lastFullRxBuf 将会在接收完成中断
    // 里更新。如果 lastFullRxBuf 与 lastSentTxBuf 不相等就会发送新的数据。
    while(1)
    {

        if(lastFullRxBuf != lastSentTxBuf)
        {
                // 标志将要设置的下一个要传输数据的链接 DAM 参数
            parToSend =  PAR_TX_START + (parOffTxToSend % NUM_PAR);
            parOffTxToSend = (parOffTxToSend + 1) % NUM_PAR;
            parToLink  = PAR_TX_START + parOffTxToSend;

            lastSentTxBuf = (lastSentTxBuf + 1) % NUM_BUF;


            // 取出输入指针数组的值
            memcpy((void *)pWave,
                   (void *)rxBufPtr[lastFullRxBuf],
                   AUDIO_BUF_SIZE);

           //将值存入Input
            for(i=0;i<sizeof(tempBuf);i++)
            {
                    Input = *(pWave+i);
            }

            // 复数 FFT
                    for (i=0;i<2*Tn;i++)
                            CFFT_In=0.0;
                    for (i=0;i<Tn;i++)
                    {

                        CFFT_In[2*i]=Input;                // 实部
                            CFFT_In[2*i+1]=0;                     // 虚部为 0

                    }

                        // 保留一份输入信号副本
                                memcpy(CFFT_InOrig,CFFT_In,2*Tn*sizeof(float));

            // 产生旋转因子
                    tw_gen(Cw,Tn);

            // FFT 计算
                    DSPF_sp_fftSPxSP(Tn,CFFT_In,Cw,CFFT_Out,brev,rad,0,Tn);

           // 计算振幅,Cmo为频谱图
                                for(i=0;i<Tn;i++)
                                        Cmo=0.0;
                                for(i=0;i<Tn+2;i++)
                                {
                                        Cmo=sqrtsp(CFFT_Out[2*i]*CFFT_Out[2*i]+CFFT_Out[2*i+1]*CFFT_Out[2*i+1]);
                                        Cmo=Cmo*2/Tn;
                                }

                        // 保留一份 FFT 结果副本
                                memcpy(CTemp,CFFT_Out,2*Tn*sizeof(float));

                        // IFFT 计算
                                DSPF_sp_ifftSPxSP(Tn,CFFT_Out,Cw,CFFT_InvOut,brev,rad,0,Tn);

                        // 恢复 FFT 结果
                                memcpy(CFFT_Out,CTemp,2*Tn*sizeof(float));

                                printf("\n复数 FFT 测试结果:");

                                unsigned char Flag;
                                for(i=0;i<Tn;i++)
                                        if(abs(CFFT_InOrig-CFFT_InvOut)>F_TOL)
                                                Flag=1;

                                if(Flag==1)
                                                printf ("失败!\n");
                                else
                                                printf ("成功!\n");

        }

    }













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