微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > 中断函数中调用fft库的问题

中断函数中调用fft库的问题

时间:10-02 整理:3721RD 点击:


我要做一个语音端点检测的程序,用的vpm642的开发板,aic23b语音芯片,用EDMA输入和输出采集的语音信号,使用了输出和输出两个pingpong缓存,在输入ping或pong缓存接受完数据后产生中断,将数据做fft变换等算法,然后再把处理后的数据复制到输出ping或pong缓存。
可是奇怪的是,好像程序运行完fft库函数后就被下一个中断给中断了,无法完成全部算法。可是我计算了一下,应该是有足够的时间在两次中断间完成算法的啊,不知斑竹或是那位大牛能够提点一二,解决这个问题呢。

没人回复。自己顶一下,问下是不是和缓存优化有关。

我问一下.你的程序是用防真器调的还是烧入片子里调的?

没有烧进去,是用仿真器调的,希望各位能够指点一二。

仿真器中断会出问题的.

难道仿真器处理中断是会出问题?
我不用fft的话,还是可以处理信号的,就是怕中断服务函数处理时间太长,不能下下个中断到来前完成。

库可以在ti的网站上下载。
不知道你用的什么版本的ccs
我用的3.1里面就有这个库,都不用下载。在c6400文件夹下面。

void DSP_fft(const short *w, int nsamp, short *x, short *y); *
* *
* nsamp = length of DSP_fft in complex samples *
* x = pointer to complex data input, time domain *
* w = pointer to complex twiddle factors *
* y = pointer to complex data output, frequency domain

如果我调用,是否必须把我的数据组合成复数的形式而且必须是一个特殊的排列格式?好像54XX的是通过先调用一个函数来实现的,这里的需要吗?还有,W是干嘛的?

w是旋转因子,可以由函数产生,也可以先计算出来,赋值给一个数组,x和y都要写成复数的数组形式,建议调用经过优化的函数,好好看看文档和ti的例程

我的问题还没解决呢,现在经过优化以后,程序中断一次后就再也进不了中断了,看了看中断寄存器,好像没问题啊,这是怎么回事啊,有那位做过这个的大虾知道原因呢。



#include <stdio.h>
#include <stdlib.h>
#include <csl.h>
#include <csl_timer.h>
#include <math.h>

/* ======================================================================== */
/* Include the DSPLIB header file */
/* ======================================================================== */
#include \"dsp_fft32x32.h\"

/* ======================================================================== */
/* Macro definition */
/* ======================================================================== */
#define PI (3.141592654)
#define NN (512)

/* ======================================================================== */
/* Input and output arrays */
/* ======================================================================== */
#pragma DATA_ALIGN(x, 8)
#pragma DATA_ALIGN(xx, 8)
#pragma DATA_ALIGN(y, 8)
#pragma DATA_ALIGN(w, 8)
int x[2*NN];
int w[2*NN];
int xx[2*NN];
int y[2*NN];
unsigned int z[2*NN];
short ch[NN];
/* ======================================================================== */
/* D2I -- Truncate a \'double\' to a \'int\', with clamping. */
/* ======================================================================== */
static int d2i(double d)
{
if (d >= 2147483647.0) return (int)0x7FFFFFFF;
if (d <= -2147483648.0) return (int)0x80000000;
return (int)d;
}

int gen_twiddle_fft32x32(int *w, int n, double scale)
{
int i, j, k, s=0, t;

for (j = 1, k = 0; j < n >> 2; j = j << 2, s++)
{
for (i = t=0; i < n >> 2; i += j, t++)
{
w[k + 5] = d2i(scale * cos(6.0 * PI * i / n));
w[k + 4] = d2i(scale * sin(6.0 * PI * i / n));

w[k + 3] = d2i(scale * cos(4.0 * PI * i / n));
w[k + 2] = d2i(scale * sin(4.0 * PI * i / n));

w[k + 1] = d2i(scale * cos(2.0 * PI * i / n));
w[k + 0] = d2i(scale * sin(2.0 * PI * i / n));

k += 6;
}
}

return k;
}

void main(void)
{
FILE *file;

short iRead;
int i;

int tempI,tempR;

/* ==================================================================== */
/* Initialize Chip Support Library */
/* ==================================================================== */
CSL_init();

file = fopen(\"test1.PCM\", \"rb\"

;

iRead = fread(ch, 1, NN, file);
//iRead = fread(ch, 1, NN, file);

fclose(file);

/* ==================================================================== */
/* Generate Q.31 input data */
/* ==================================================================== */
for(i=0; i<NN; i++)
{
x[2*i] = xx[2*i] = (int)ch;
x[2*i+1] = xx[2*i+1] = 0;
}

/* ==================================================================== */
/* Generate twiddle factors */
/* ==================================================================== */
gen_twiddle_fft32x32(w, NN, 2147483647.);
DSP_fft32x32(w, NN, x, y);

for(i=0; i<NN; i++)
{ tempI=y[i*2];
tempR=y[i*2+1];
z = tempI * tempI + tempR * tempR;

}


printf(\"END\\n\" );

}

/* ======================================================================== */
/* End of file: fft32x32_main.c */
/* ======================================================================== */

test1.pcm是8K采样的16BIT语音信号文件。用cool edit pro软件产生。实际是一个440hz正弦信号。
问题描述(用的是CCS3.1环境):
1、当信号幅值很小的时候,运行程序到末尾后用view/graph看z数组。发现会出现两个对称的峰值。第一个落在z[28]附件,另外一个落在z[480]附件。为什么这样?这是一个正弦波
。虽然z没有开平方,但是应该是单一峰值啊。
2、当增大波形的幅值,频率不变后,再看z。发现峰值的波形变宽变乱。为什么这个算法和输入的动态范围有关?如何让FFT变换和输入幅值没有关系?
3、把iRead = fread(ch, 1, NN, file);语句重复,也就是ch的值取文件的第二次读写结果进行变换,z的结果完全乱了。按照道理,波形文件足够长,又是一个正弦波形。
应该没有变化才对。我怀疑什么地方错了。但是我用view/graph看xx的FFT,没有改变。这么说变换前数据是一样的。这是为什么?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top