工具/软件:Code Composer Studio
在下面的代码中...使用的 DFT 类型是什么 8点 DIT DFT 或其他....
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//此软件已获得与德州仪器 C28x 一起使用的许可
//系列 DSC。 此许可证是在安装之前提供给您的
//软件。 您可以通过查阅的副本来查看此许可证
//此库的 doc 目录中的协议。
//----------------------------------
//版权所有(C) 2010-2011 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 置1、FFT 计算开始。 FFTStartFlag 被清零
//计算完成后。
//
//如果使用输入缓冲区,则必须将其与 FFT 大小的倍数对齐
// RFFT_ADC_F32。 如果您不希望对齐输入缓冲器、请使用
// RFFT_ADC_f32u 函数。 在本例中、段对齐#pragma 可以
//添加注释。 但是、使用此函数会降低周期性能
算法的//。
//
//
//函数:
//
// void RFFT_ADC_F32 (RFFT_ADC_F32_struct *)
// void RFFT_F32_MAG (RFFT_F32_struct *)
// void RFFT_F32_PHASE (RFFT_F32_STRURT *)
//
//其中 RFFT_ADC_F32_struct 是定义为:
//
// 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 FFTStage;
//}RFFT_F32_struct;
//
//假设:
//
//* RFFT_F32_struct 的 OutBuf 必须传递到的尾
// RFFT_ADC_F32_struct
//*输入信号存储在 Signal.asm 中
//* FFTize 必须是2的幂(32、64、128等)
//* FFTize 必须大于或等于32
//* FFTStages 必须为 log2 (FFTize)
//* InBuf、OutBuf、CosSinBuf 在长度上是 FFTize
//* MagBuf 和 PhaseBuf 的长度为 FFTize/2+1
//*此函数不使用 MagBuf 和 PhaseBuf。
//它们仅供磁振和相位计算函数使用。
//
//监视变量:
//
// InBuf (RFFT_ADC_F32_struct)输入缓冲器
//未使用 InBuf (RFFT_F32_struct)
//尾存储 OutBuf 的地址
// OutBuf 输出缓冲器
// CosSinBuf Twiddle 因子缓冲器
// MagBuf Magnitude buffer
// PhaseBuf 相位缓冲器
// j 归一化数字频率分量的索引
//频率原始信号的实数模拟频率
//
//######################################################################################################################
//$TI 版本:C28x 浮点单元库 V1.30美元
//$Release Date:2012年1月4日$
//######################################################################################################################
#include "DSP28x_Project.h"//器件头文件和示例 include 文件
#include "math.h"
#include "float.h"
#include "FPU.h"
#define RFFT_STACages 9.
#define RFFT_SIZE (1 << RFFT_STOPENAINSages)
#define ADC_BUF_LEN RFFT_SIZE // ADC 缓冲区长度
#define ADC_SAMPLE_PERIOD 3124 // 3124 =(3122-1)= 48KHz 采样、具有150MHz SYSCLKOUT
#define F_PER_SAMPLE 48000.0L/(float) RFFT_SIZE //内部采样率为48kHz
RFFT_ADC_F32_struct rfft_ADC;
RFFT_F32_struct rfft;
float32 RFFToutBuff[RFFT_SIZE];//计算的 FFT 结果
float32 RFFTF32Coef[RFFT_SIZE];//系数表缓冲器
float32 RFFTmagBuff[RFFT_SIZE/2+1];//频谱幅度
//--全局变量
uint16 AdcBuf[ADC_BUF_LEN];// ADC 缓冲区分配
易失性 UINT16 FFTStartFlag = 0;//一帧数据就绪标志
UINT16 DEBUG_TOGGLE = 1;//用于实时模式研究
//此文件中找到的函数的原型语句。
中断空 ADC_ISR (空);
/********
*函数:main()
*
*说明:C2833x 实时 RFFT 的主函数
(二 /
void main (void)
{
uint16 i、j;
float32 freq;//单频分量信号的频率
//-- CPU 初始化
InitSysCtrl();//初始化 CPU (文件:sysctrl.c)
InitGpio();//初始化共享 GPIO 引脚(文件:gpio.c)
InitPieCtrl();//初始化并启用 PIE (文件:PIECTRL.c)
//--外设初始化
InitAdc();//初始化 ADC (文件:adc.c)
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ADCINT =&ADC_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
rfft_adc.Tail =&rfft.OutBuf;//将 RFFT_ADC_F32_struct 链接到
//RFFT_F32_struct。 的尾指针
//RFFT_ADC_F32_struct 被传递到
//RFFT_F32_struct 的 OutBuf 指针
rfft.FFTize = RFFT_SIZE;//实数 FFT 大小
rfft.FFTStages = RFFT_STACages;//实数 FFT 级
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_SIZ/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];
for (i=2;<RFFT_SIZE/2+1;i++))
{
//查找频谱幅度的最大值
if (RFFTmagBuff[i]> freq)
{
J = I;
FREQ = RFFTmagBuff[i];
}
}
FREQ = F_PER_SAMPLE *(float) j;//将标准化数字频率转换为模拟频率
FFTStartFlag = 0;//开始收集下一个数据帧
}
asm (" NOP");
}
}//end of main()
中断空 ADC_ISR (空)
{
静态 uint16 * AdcBufPtr = AdcBuf;//指向 ADC 数据缓冲区的指针
静态易失性 UINT16 GPIO34_COUNT = 0;//引脚切换计数器
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//必须确认 PIE 组
//--管理 ADC 寄存器
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//将 SEQ1复位为 CONV00状态
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除 ADC SEQ1中断标志
//---读取 ADC 结果
* AdcBufPtR++= AdcMirror.ADCRESULT0;//读取结果
//--蛮力强制循环缓冲器
if (AdcBufPtr ==(AdcBuf + ADC_BUF_LEN))
{
AdcBufPtr = AdcBuf;//将指针回卷到开头
FFTStartFlag = 1;//一个帧数据就绪
}
//--示例:切换 GPIO18、以便我们可以使用 ADC 读取它
if (debug_toggle = 1)
{
GpioDataRegs.GPATOGGLE.bit.GPIO18 = 1;//切换引脚
}
//--示例:以0.5秒的速率切换 GPIO34 (连接到 controlCARD 上的 LED)。
//(1/48000秒/采样)*(1个采样/内部)*(x 个中断/切换)=(0.5秒/切换)
//=> x = 24000
if (GPIO34_count++> 24000)//缓慢切换以查看 LED 闪烁
{
GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;//切换引脚
GPIO34_count = 0;//重置计数器
}
返回;
}//end of main()
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束
//========================================