实时音频信号的FFT变换,求教各位大神!!! - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3290|回复: 0
打印 上一主题 下一主题

[未解决] 实时音频信号的FFT变换,求教各位大神!!!

[复制链接]

4

主题

8

帖子

84

积分

注册会员

Rank: 2

积分
84
跳转到指定楼层
楼主
发表于 2017-7-7 09:24:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 方穹 于 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");

        }

    }








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-5-21 03:07 , Processed in 0.035608 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表