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/TMS320F28379D:如何为阵列数据取平方根?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/590179/ccs-tms320f28379d-how-can-i-take-square-root-for-array-data

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

我将 TMS320F28379D 与 Code Composer Studio 结合使用。

使用了'2837x_RFFT_ADC'项目。

我想在'RFFTmagBuff'中取数据的平方根。 所以、我在'main.c'中构建了'RFFTsqrtBuff'、我想我有一些错误、但我找不到 它。

请帮助我 怎么做!

这是我的 main.c 代码

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include "fpu_rfft.h"//主 include 文件

#include "math.h"

#include "examples_setup.h"

#include "F2837xD_DEVICE.h"

#define RFFT_STOPENAINTS11 //9

#define RFFT_SIZE (1 << RFFT_STOPENAINSages)

#define F_PER_SAMPLE (ADC_SAMPLING_FREQ/(float) RFFT_SIZE)

#pragma DATA_SECTION (RFFTin1Buff、"RFFTdata1")

uint16_t RFFTin1Buff[2*RFFT_SIZE];

#pragma DATA_SECTION (RFFTmagBuff、"RFFTdata2")

float RFFTmagBuff[RFFT_SIZE];///2+1

#pragma DATA_SECTION (RFFToutBuff、"RFFTdata3")

float RFFToutBuff[RFFT_SIZE];

#pragma DATA_SECTION (RFFTF32Coef、"RFFTdata4")

float RFFTF32Coef[RFFT_SIZE];

RFFT_ADC_F32_struct rfft_ADC;

RFFT_ADC_F32_struct_Handle HND_rfft_ADC =&rfft_ADC;//& bit 运算符

RFFT_F32_struct rfft;

RFFT_F32_struct_Handle HND_rfft =&rfft;

volatile uint16_t flagInputReady = 0;

volatile uint16_t sampleIndex = 0;

uint16_t pass = 0;

uint16_t 故障= 0;

_interrupt void adcaIsr()

int16_t main ()

//局部变量

uint16_t i、j;

float freq = 0.0;

float freq1 = 0.0;

float RFFTsqrtBuff[RFFT_SIZE];

ifdef 闪存

EALLOW;

Flash0EccRegs.ecc_enable.bit.enable = 0;

memcpy (((uint32_t *)&RamfuncsRunStart、(uint32_t *)&RamfuncsLoadStart、(uint32_t)&RamfuncsLoadSize);

FPU_initFlash()

#endif //闪存

FPU_initSystemClocks()

FPU_initEPIE ();//设置 ADC-A

FPU_initADCA()

FPU_initEPWM ();//将 EPWM1A 设置为采样时钟,将 EPWM2A 设置为要采样的信号

EALLOW;//映射 ISR 函数

PieVectTable.ADCA1_INT =&adcaIsr;// ADCA 中断1的函数

EDIS;//启用全局中断和更高优先级的实时调试事件:

PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//启用 ADC1INT

IER |= M_INT1;//启用组1中断

EINT;//启用全局中断 INTM

ERTM;//启用全局实时中断 DBGM

FPU_startEPWM ();//启动 ePWM

hnd_rfft_adc->Tail =&(hnd_rfft->OutBuf);

hnd_rfft->FFTize = RFFT_SIZE;// FFT 大小

hnd_rfft->FFTStage = RFFT_STA期;// FFT 级

hnd_rfft_adc->InBuf =&RFFTin1Buff[0];//输入缓冲器(16位 ADC)输入

hnd_rfft->OutBuf =&RFFToutBuff[0];//输出缓冲区

hnd_rfft->CosSinBuf =&RFFTF32Coef[0];// Twiddle 因子

hnd_rfft->MagBuf =&RFFTmagBuff[0];//幅度输出缓冲器

RFFT_F32_SINCOSTable (HND_rfft);//计算旋转因子

对于(i=0;i < RFFT_SIZE;i++){

RFFToutBuff[i]= 0;//清理输出缓冲器

对于(i=0;i < RFFT_SIZE;i++){///2

RFFTmagBuff[i]= 0;//清理幅度缓冲器

对于(i=0;i < RFFT_SIZE;i++){///2

RFFTsqrtBuff[i]= 0;//清理平方根缓冲器

while (1){

while (flagInputReady = 0){};//等待 ADC ISR 设置标志、然后再继续

RFFT_ADC_F32 (HND_rfft_ADC);//使用16位 ADC 输入计算实数 FFT

FlagInputReady = 0;//重置标志

RFFT_F32_MAG (HND_RFFT);//计算幅度

J = 1;

FREQ = RFFTmagBuff[1];

freq1 = RFFTsqrtBuff[1];

for (i=2;<RFFT_SIZE;i++){ // /2+1)

if (RFFTmagBuff[i]> freq){

J = I;

FREQ = RFFTmagBuff[i];

for (i=2;<RFFT_SIZE;i++){)

if (RFFTsqrtBuff[i]< freq1){

J = I;

freq1 = sqrtf (RFFTmagBuff[i]);

FREQ = F_PER_SAMPLE *(float) j;

freq1 = f_per_sample *(float) j;

Done ();

返回1;

_interrupt void adcaIsr ()

RFFTin1Buff[sampleIndex++]= AdcaResultRegs.ADCRESULT0

if (sampleIndex ==(2*RFFT_SIZE -1))){

sampleIndex = 0;

flagInputReady = 1;

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志

PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

    很抱歉、答复较晚、但很难从代码中得知您尝试执行的操作。 RFFT_F32_MAG ()会计算复数输出的平方根、即

    f_mag (i)= sqrt (F (i)^2 + F (i+1)^2)

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

    谢谢!

    在代码中,通过 RFFT_F32_MAG ()计算幅度。

    它似乎计算 FFT 输出的2norm。

    正确吗?

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