嵌入式开发者社区
标题:
实时音频信号的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