请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F2812 大家好!
我的系统由 FIR16 LPF、FIR16 HPF 和 RFFT32_512组成。
在 FFT.calc 函数的末尾没有更新我的 FFT_MAG_OUT。
以下是我的链接器配置
.othersys_coefffilt > EXT_SRAM PAGE = 1
.othersys_firfilter > EXT_SRAM PAGE = 1
othersys_x_delay_buffer > L01SARAM PAGE = 1
othersys_y_delay_buffer > L01SARAM PAGE = 1
othersys_z_delay_buffer > L01SARAM PAGE = 1
.mysys_lpfdb ALIGN(0x100) > L01SARAM PAGE = 1
.mysys_hpfdb ALIGN(0x100) > L01SARAM PAGE = 1
.mysys_coeff > L01SARAM PAGE = 1
.mysys_fft > L01SARAM PAGE = 1
FFTipcb ALIGN(0x400) > H0SARAM | L01SARAM PAGE = 1
.mysys_ext > EXT_SRAM PAGE = 1
FFTtf > EXT_SRAM PAGE = 1
FIR16HPF 的运行频率为2500Hz、其输出将为 FFT 输入。
RAM 内存非常有限、因此必须初始化外部 SRAM 上的 Twiddle Factors。 (是不是问题??)
请查看以下代码、我不确定缺少什么内容。
感谢您的任何帮助。
#define FFT_SIZE 512
#define FFT_CB_SIZE FFT_SIZE+2
#define __MYSYS_FFTCB__ __attribute__((section("FFTipcb")))
#define __MYSYS_EXT__ __attribute__((section(".mysys_ext")))
//...
//...
__MYSYS_FFTCB__ int32_t ipcb[FFT_CB_SIZE];
__MYSYS_EXT__ int32_t fft_mag_out[FFT_SIZE]; // No_memory on RAM so it's ext
__MYSYS_FFT__ RFFT32 rfft = RFFT32_512P_DEFAULTS;
const long win[FFT_SIZE/2]=HAMMING512;
typedef struct
{
RFFT32* RFFT;
struct{
int32_t RawBuff_Q31[FFT_SIZE]__attribute__((aligned(FFT_SIZE*2)));
uint16_t RawIndex;
int32_t ReadyToUseBuff_Q31[FFT_SIZE]__attribute__((aligned(FFT_SIZE*2)));
uint16_t RTUIndex;
}Input;
}RFFT_t;
typedef struct
{
DualBuffer_t InputBuff;
LPF_t LPF;
HPF_t HPF;
RFFT_t RFFT;
}MySys_t;
__MYSYS_EXT__ MySys_t MY_SYS;
void FFT_Init(RFFT_t * this)
{
memset(&ipcb[0], 0, ARRAY_SIZE(ipcb));
memset(&fft_mag_out[0], 0, ARRAY_SIZE(fft_mag_out));
this->Input.RTUIndex = 0;
this->Input.RawIndex = 0;
memset(this->Input.RawBuff_Q31, 0, ARRAY_SIZE(this->Input.RawBuff_Q31) );
memset(this->Input.ReadyToUseBuff_Q31, 0, ARRAY_SIZE(this->Input.ReadyToUseBuff_Q31) );
this->RFFT = &rfft;
this->RFFT->ipcbptr = &ipcb[0];
this->RFFT->magptr = &fft_mag_out[0];
this->RFFT->winptr = (long *)&win[0]; // Window coefficient array
this->RFFT->init(this->RFFT); // Twiddle factor pointer initialization
}
void FFT_Compute(RFFT_t * this)
{
RFFT32* rff = this->RFFT;
RFFT32_brev(this->Input.ReadyToUseBuff_Q31, &ipcb[0], FFT_SIZE); // Bit reversed
this->RFFT->calc(rff);
//this->RFFT->split(rff); // Post processing to get the correct spectrum
//this->RFFT->mag(rff); // Q31 format (abs(ipcbsrc)/2^16).^2
}
void MYSYS_Prepare(...)
{
//....
MY_SYS->HPF.OutBuff[MY_SYS->HPF.OutIndex++] = hpfOutput;
int32_t val = (int32_t)hpfOutput << 15;
MY_SYS->RFFT.Input.RawBuff_Q31[MY_SYS->RFFT.Input.RawIndex++] = val;
if (MY_SYS->RFFT.Input.RawIndex == FFT_SIZE)
{
memcpy( &MY_SYS->RFFT.Input.ReadyToUseBuff_Q31[0], &MY_SYS->RFFT.Input.RawBuff_Q31[0], FFT_SIZE);
EventNofication(); // Trigger the computation
MY_SYS->RFFT.Input.RawIndex = 0;
}
//...
}