This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28335:TMS320F28335

Guru**** 2605845 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/681715/ccs-tms320f28335-tms320f28335

器件型号:TMS320F28335

工具/软件: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()

//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束
//========================================

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从另一个线程复制 Nikhil 的查询(已关闭)

    "我只想知道代码中使用的 DFT 类型是什么... 8点 DIT DFT 或其他"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于 RFFT_STACages 设置为9、我想说这是运行一个512点实数 FFT。 代码来自哪里? 它与 FPU 库的 v1.30不同、它在代码注释中。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复 Richard。。。

    这意味着
    3级、则为2至功率3 = 8点 DFT。
    9级、则为2至功率9 = 512点 DFT
    11个功率级、则为2至功率11 = 2048点 DFT

    如果我错了、请纠正我...

    还是时间或频率的抽取?

    此致、

    Nikhil
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Nikhil、

    它是时间抽取算法。 代码是一个9级 FFT、因此为512点。