集完 256 点数据后,转入数据处理,并且将处理结果送回 CODEC,通过它的 D/A 转换
成模拟信号。连续运行时,程序处于数据采集->数据处理->等待->数据采集(256 点)
->……的无限循环(for(;;))中,直到被用户干预停止。
3)数据采集和处理模式的切换:程序设置了全局整形变量 mode 标志当前工作状态。若
mode==SAMPLE_MODE,工作在数据采集模式,此模式下每一次 for 循环都会调用
子程序 sample_codec()采集一个数据,当采集到 256 个数据后,子程序 sample_codec()
会自动设置 mode=CALCULATE_MODE,即进入数据处理阶段。数据处理结束后,进
入等待模式,然后又重新进入数据采集阶段开始新的循环。注意不管 mode 处于什么状
态,每一次 for 循环都会将处理后的数据输出到示波器。
4)数据处理方法:当 mode==CALCULATE_MODE 时,程序把采集到的整形数据转化
为浮点数据,然后将得到的浮点数据与窗函数进行相乘运算,经过这样预处理后的数据
通过调用系统函数 rfft256()进行傅里叶变换,再求模值,然后对模值进行适当的处理,
最后得到的浮点结果转化为整形数据,输出到示波器。
5)程序中用到的几个主要数据变量的用途说明如下:
int window ; //选择窗函数的形式。0:矩形窗;1:汉明窗。
int data_count; // 采集到的数据样本数计数器
int out_count; //发送数据到 DAC 的索引计数器
int tempdata[NUM_POINTS]; // 存放采样数据,可用 plot 功能描绘
float i_output[NUM_POINTS]; // 存放 FFT 变换后得到的虚部
float r_output[NUM_POINTS]; // 存放 FFT 变换后得到的实部
float Magnitude[NUM_POINTS]; //存放 FFT 变换后得到的频谱幅度
int OutputBuffer[NUM_POINTS]; //存放输出频谱数据
实验三使用的源程序位于子目录…\DSP_exp\unit_3\FFT目录下,打开工程文件
FFT.DPJ,可以看到程序由以下几个模块构成:
065L_hdr.asm ——ADSP21065L 中断向量及其管理
BUFFERS.asm——变量定义
FFT.c——主控模块,完成从CODEC输入数据,进行FFT,其程序如下:
/****************************************************************************
** $TITLE: FFT.C$
** FFT.C
** ---------
** Brings data in from the codec, and runs it through an fft algorithm.
** the data can be plotted in real time at the host or be sent to
** oscilloscope through the codec.
**
****************************************************************************/
/*--------------------------------------------------------------------------
EXTERNAL DECLARATIONS
--------------------------------------------------------------------------*/
extern volatile int user_tx_buf[6];
extern volatile int user_tx_ready;
extern volatile int user_rx_buf[6];
extern volatile int user_rx_ready;
/*--------------------------------------------------------------------------