主题中讨论的其他部件:controlSUITE,
工具/软件:Code Composer Studio
我正在使用以下代码(来自控制套件的定点库)。 该代码不能用于执行实时FFT。请帮助我获取ADC A0上提供的信号的FFT组件。
//===========================================================================================================================
//此软件已获得许可,可以与德州仪器(TI) C28x一起使用
//家庭DSC。 此许可证是在安装之前提供给您的
//软件。 您可以通过查阅的副本来查看此许可证
//此库的doc目录中的协议。
//------------------
//版权所有(C) 2010-2011 Texas2011 Texas Instruments,Incorporated。
//保留所有权利。
//===========================================================================================================================
//
//文件:main.c --具有12位ADC输入测试示例的实时RFFT
//
//标题:DSP2833x器件实时FFT测试程序。
//
//=============================================================================================================
//描述:
//
//此程序显示如何计算具有12位实时ADC的真实FFT
//输入和相关频谱幅值,相位。 输入数据为
//由中断服务例程函数ADC_ISR()收集。 信号
//输入(可以是来自信号发生器或传感器的任何信号)被摘录
//输入ADC A0。 信号由ePWM模块和采样进行采样
//频率在Lab.h中定义 这是48kHz。 的动态范围
//输入信号应小于0~3V。 进行实时实际FFT
//逐帧。 只要ADC_ISR收集一帧数据,
//将设置FFTStartFlag。 只要主程序检测到
// FFTStartFlag设置,FFT计算开始。 FFTStartFlag被清除
//计算完成后。
//
//如果使用,输入缓冲区必须与FFT大小的倍数对齐
// RFFT_ADC_F32。 如果您不希望对齐输入缓冲区,请使用
// RFFT_ADC_f32u函数。 在这种情况下,节对齐#pragma可以
//评论。 但是,使用此功能会降低循环性能
算法的//。
//
//
//功能:
//
//作废RFFT_ADC_F32 (RFFT_ADC_F32_structt *)
//作废RFFT_F32_MAG (RFFT_F32_structt *)
//作废RFFT_F32_phase (RFFT_F32_structt *)
//
//其中RFFT_ADC_F32_structure是定义为:
//
// typedef结构{
// UINT16 * InBuf;
// void *尾;
//} RFFT_ADC_F32_struct;
//
//其中RFFT_F32_struct是定义为以下内容的结构:
//
// typedef结构{
// float32 *InBuf;
// float32 *OutBuf;
// float32 *CosSinBuf;
// float32 * MagBuf;
// float32 * PhaseBuf;
// UINT16 FFTSize;
// UINT16 FFTStages;
//} RFFT_F32_struct;
//
//假设:
//
//* RFFT_F32_struct的OutBuf必须传递给Tail of
// RFFT_ADC_F32_struct
//*输入信号存储在Signal.asm中
//* FFTSize必须是2的幂(32,6.4128万等)
//* FFTSize必须大于或等于32
//* FFTStages必须为log2 (FFTSize)
//* InBuf,OutBuf,CosSinBuf的长度是FFTSize
//* MagBuf和PhaseBuf的长度为FFTSize/2+1
//*此函数不使用MagBuf和PhaseBuf。
//它们仅用于磁位和相位计算函数。
//
//监视变量:
//
// InBuf (RFFT_ADC_F32_structt)输入缓冲区
// InBuf (RFFT_F32_struct)未使用
// Tail存储OutBuf的地址
// OutBuf输出缓冲区
// CosSinBuf Twiddle因子缓冲区
// MagBuf幅度缓冲器
// PhaseBuf相位缓冲区
// j标准化数字频率组件的索引
//原始信号的频率真实模拟频率
//
//###################################################################
//$TI发行版:C28x浮点库1.30 单元$
//$发布日期:2012年1月4日$
//###################################################################
#include "DSP28x_Project.h"//设备头文件和示例包括文件
包含"math.h"
#include "float.h"
#include "FPU.h"
#define RFFT_Stages 9.
#define RFFT_size (1 << RFFT_STEEN级)
#define ADC_BUF_LEN RFFT_SIZE // ADC buffer length
#define ADC_SAMPLE_Period 3124 // 3124 =(3125-1)= 48 KHz采样,带150 MHz SYSCLKOUT
#define F_per样本4.8万.0L/(FLOC)RFFT_SIZE //内部采样率为48kHz
RFFT_ADC_F32_structt rfft_ADC;
RFFT_F32_structt rfft;
Float32 RFFToutBuff[RFFT_size];//计算的FFT结果
Float32 RFFTF32Coef[RFFT_size];//系数表缓冲区
Float32 RFFTmagBuff[RFFT_size/2+1];//Magnitude of frequency spectrum
//---全局变量
UINT16 AdcBuf[ADC_BUF_LEN];// ADC缓冲区分配
Volatile UINT16 FFTStartFlag =0;//一个帧数据就绪标志
UINT16 DEBUG_TOGGLE = 1;//用于实时模式调查
//本文件中找到的函数的prototype语句。
中断无效ADC_ISR(void);
/****************************************************************
*函数:main()
*
*说明:C2833x实时RFFT的主要功能
*************** /
Void主(void)
{
UINT16 I,j;
float32 freq;//单频率分量信号的频率
//--- CPU初始化
InitSysCtrl();//初始化CPU (文件:sysctrl.c)
InitGpio();//初始化共享GPIO引脚(文件:gPIO.c)
InitPieCtrl();//初始化并启用PIECTRL.c (文件:PIECTRL.c)
//---外围设备初始化
InitAdc();//初始化ADC (文件:adc.c)
//本示例中使用的中断被重新映射到
//此文件中找到ISR函数。
EALLOW;//这是写入EALLOW保护寄存器所必需的
PieVectorTable.ADCINT =&ADC_ISR;
EDIS;//这是禁用写入EALLOW保护寄存器所必需的
rfft_adc.Tail =&rfft.OutBuf;//将RFFT_ADC_F32_structt链接到
//RFFT_F32_struct. 的尾指针
//RFFT_ADC_F32_structt被传递到
// RFFT_F32_struct的OutBuf指针
rfft.FFTSize = RFFT_SIZE;//实际FFT大小
rfft.FFTStages = RFFT_Stages;//Real FFT Stages
Rfft_ADC.InBuf =&AdcBuf[0];//输入缓冲区
rfft.OutBuf =&RFFToutBuff[0];//输出缓冲区
Rfft.CosSinBuf =&RFFTF32Coef[0];//twiddle因子
rfft.MagBuf =&RFFTmagBuff[0];//Magnitude输出缓冲区
RFFT_F32_Sincostable (&rfft);//计算宽度因子
//清除输出缓冲区
对于(i=0;i < RFFT_SIZE;i++)
{
RFFToutBuff[i]= 0;
}
//清除量级缓冲区
对于(i=0;i < RFFT_size=2;i++)
{
RFFTmagBuff[i]= 0;
}
//---启用全局中断
ASM (" CLRC INTM,DBGM");//启用全局中断和实时调试
//---主环路
while (1)//无限循环-等待中断
{
IF (FFTStartFlag)//如果一个帧数据就绪,则执行FFT
{
RFFT_ADC_f32u (&rfft_ADC);//此版本的FFT不需要缓冲区对齐
RFFT_F32_MAG (&rfft);//计算频谱振幅
J = 1;
Freq = RFFTmagBuff[1];
对于(i=2;i<RFFT_size=2+1;i++)
{
//查找频谱幅度的最大值
IF (RFFTmagBuff[i]> freq)
{
J = I;
Freq = RFFTmagBuff[i];
}
}
Freq = F_Per抽样*(float) j;//将标准化数字频率转换为模拟频率
FFTStartFlag =0;//开始收集下一帧数据
}
ASM (" NOP");
}
}//main()的结尾
中断无效ADC_ISR(void)
{
静态UINT16 *AdcBufPtr = AdcBuf;//指向ADC数据缓冲器的指针
静态易失性UINT16 GPIO34_COUNT = 0;//引脚切换计数器
PIECtrlRegs.PIEACK/ALL = PIEACK_Group1;//必须确认PIE组
//---管理ADC寄存器
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//将SEQ1重置为CONV00状态
AdcRegs.ADCST.Bit.INT_SEQ1_CLR = 1;//清除ADC SEQ1中断标志
//--读取ADC结果
*AdcBufPter++= AdcMirror.ADCRESULT0;//读取结果
//--强力使用循环缓冲区
IF( AdcBufPtr ==(AdcBuf + ADC_BUF_LEN))
{
AdcBufPtr = AdcBuf;//将指针反转至开头
FFTStartFlag =1;//一个帧数据就绪
}
//--示例:切换GPIO18以便我们可以使用ADC读取它
IF (DEBUG_Toggle == 1)
{
GpioDataRegs.GPATOGLE.bit.GPIO18 = 1;//切换引脚
}
//--示例:以0.5 秒速率切换GPIO34 (连接到controlCARD上的LED)。
//(1/4.8万 sec/sample)*(1 samples/int)*(x中断/切换)=(0.5 sec/切换)
//=> x = 2.4万
IF (GPIO34_COUNT++> 2.4万)//缓慢切换以查看LED闪烁
{
GpioDataRegs.GPBTOGLE.bit.GPIO34 = 1;//切换引脚
GPIO34_COUNT = 0;//重置计数器
}
返回;
}//main()的结尾
//===========================================================================================================================================
//文件结束
//===========================================================================================================================================