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.
大家好、我在 CPU1中完成了 FFT 计算、其中有2048个样本与 DMA 配合使用、我从 ADC 中获取了样本并将其放入缓冲器中、我从中进行了计算。 现在我想将 FFT 移动到 CLA (以节省时间)、但它对我来说不能正常工作。 在 CLA 中、我使用1024个样本、我将填充的缓冲器从 DMA 复制到 IOBuffer、并在 CLA 中计算 FFT。 在计算完成后,我得到 ISR,在这里我计算幅度,然后再从中进行其他计算(rms、能量、相移等)。 我在这里看到了错误 对于50Hz (20ms)正弦信号、我使用 ePWM 作为 ADC 触发器来计算所需样本的确切数量(现在为1024)(ePWM TBCLK = 100MHz;CLKDIV = 0;TBPRD = 1953;CMPA = 977;)。
RFFTmag 还必须位于 LS RAM 中? 因为我没有足够的空间、所以我将其放置在 GSram 中。
我的链接器: e2e.ti.com/.../2837xD_5F00_FLASH_5F00_lnk_5F00_cpu1.rar
我的 CLA 代码:
/*----------------- *
//FFT CLA
/*----------------- *
RFFT_F32_struct rfft;// FFT 对象
#pragma DATA_SECTION (IOBuffer、"IOBuffer"); //输入数组的缓冲区对齐、
float32 IOBuffer[RFFT_SIZE]; //RFFT_f32u (可选)、RFFT_F32 (必需)
// FFT 的输出会覆盖输入 IF
//RFFT_STOPENAINAINESDON_STOPEN
#pragma DATA_SECTION (IOBuffer2、"IOBuffer");
float32 IOBuffer2[RFFT_SIZE]; //此处的 FFT 输出(如果 RFFT_STOPENAINAINSES偶 数)
#pragma DATA_SECTION (RFFTmagBuff、"RFFTmag");
float32 RFFTmagBuff[RFFT_SIZE/2+1]; //幅度计算中使用的附加缓冲器
#pragma DATA_SECTION (RFFTF32Coef、"RFFTTwides");
float32 RFFTF32Coef[512]; //Twiddle 缓冲器
空 init_cla (空)
{
extern uint32_t Cla1funcsRunStart、Cla1funcsLoadStart、Cla1funcsLoadSize;
extern uint32_t Cla1ConstRunStart、Cla1ConstLoadStart、Cla1ConstLoadSize;
EALLOW;
#ifdef _flash
//CLA 存储器初始化
memcpy (((uint32_t *)&Cla1funcsRunStart、(uint32_t *)&Cla1funcsLoadStart、(uint32_t)&Cla1funcsLoadSize);
memcpy (((uint32_t *)&Cla1ConstRunStart、(uint32_t *)&Cla1ConstLoadStart、(uint32_t)&Cla1ConstLoadSize);
#endif
//初始化并等待 CLA1ToCPUMsgRAM
MemCfgRegs.MSGxINIT.bit.init_CLA1TOCPU = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CLA1TOCPU!= 1){};
//初始化并等待 CPUToCLA1MsgRAM
MemCfgRegs.MSGxINIT.bit.init_CPUTOCLA1 = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CPUTOCLA1!= 1){};
//LS RAM 控制 PRE CLA
//程序空间
MemCfgRegs.LSxMSEL.bit.MSEL_LS2 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS2 = 1;
MemCfgRegs.LSxMSEL.bit.MSEL_LS3 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS3 = 1;
//数据空间
MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0;
MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 0;
MemCfgRegs.LSxMSEL.bit.MSEL_LS4 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS4 = 0;
MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 1;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 0;
EDIS;
//任务
EALLOW;
Cla1Regs.MVECT1 =(uint16_t)(&Cla1Task1);
// Cla1Regs.MVECT2 =(uint16_t)(&Cla1Task2);
// Cla1Regs.MVECT3 =(uint16_t)(&Cla1Task3);
// Cla1Regs.MVECT4 =(uint16_t)(&Cla1Task4);
// Cla1Regs.MVECT5 =(uint16_t)(&Cla1Task5);
// Cla1Regs.MVECT6 =(uint16_t)(&Cla1Task6);
// Cla1Regs.MVECT7 =(uint16_t)(&Cla1Task7);
Cla1Regs.MVECT8 =(uint16_t)(&Cla1Task8);
//触发集
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.task1 = CLA_TRIG_NOPERPH;
DmaClaSrcSelRegs.CLA1TASSKSRCSEL2.bit.TASK8 = CLA_TRIG_NOPERPH;
Cla1Regs.MIER = (M_INT1 | M_INT8);
//SW 任务组启用
Cla1Regs.MCTL.bit.IACKE = 1;
//CLA ISR
PieVectTable.CLA1_1_INT =&cla1Isr1;
PieCtrlRegs.PIEIER11.bit.INTx1 = 0x01;
IER |=(M_INT11);
EDIS;
}
void init_ClaFFT (void)
{
memset (&IOBuffer、0、sizeof (IOBuffer));
memset (&IOBuffer2、0、sizeof (IOBuffer2));
memset (&RFFTmagBuff、0、sizeof (RFFTmagBuff));
rfft.FFTize = RFFT_SIZE;//(1 << RFFT_STACTS)
rfft.FFTStages = RFFT_STACages;//(10U)
rfft.InBuf =&IOBuffer[0]; //输入缓冲区
rfft.OutBuf =&IOBuffer2[0]; //输出缓冲区
rfft.CosSinBuf =&RFFTF32Coef[0]; //Twiddle 因子缓冲器
rfft.MagBuf =&RFFTmagBuff[0]; //Magnitude buffer
RFFT_F32_SINCOSTable (&rfft); //计算旋转因子
}
CLA:
_interrupt void Cla1Task1 (void)
{
//_mdebugstop();
CLA_CFFT_run512Pt ();
CLA_CFFT_unpack512Pt ();
}
_interrupt void cla1Isr1 ()
{
if (CLASignalType = 0)
{
///Volt 结构
FFT_COMPUTATION_CLA (&volt1、rfft.OutBuf);//Harmonic from rfft.OutBuf
}
其他
{
if (CLASignalType = 1)
{
//当前结构
FFT_COMPUTATION_CLA (&curr1、rfft.OutBuf);
}
}
ClaComputationDone = true;
PieCtrlRegs.PIEACK.ALL = M_INT11;
}
用于比较 CLA 和旧 CPU 计算(效果良好)的图形 rfft.MagBuf、相同的正弦信号50Hz、CLA 1024个样本 FFT、CPU 2048个样本 FFT。
感谢您的建议、Marek。
您好 Marek、
如果 CLA 要访问 RFFTmag、则必须将其放置在 LSx 存储器中。 请参阅 TMS320F28379D 技术参考手册的第6.3.1节。
https://www.ti.com/lit/ug/spruhm8i/spruhm8i.pdf
此外、以下帖子还提供了更多信息、包括可能有所帮助的资源链接:
谢谢、
Ashwini
我试过它、但这更糟糕。 我在 CPU1中的 ISR 中计算 RFFTMag。 在 FFT_COMPUTATION_CLA ()中;使用命令 RFFT_F32_MAG_TMU0 (&rfft)的函数;
我在 Lsrams 中没有空间、我尝试削减一半 Ls (例如、Ls 3)并将其分配给另一个 RAMS (例如、我的链接器中的 Ls4_5)、但这会影响整个 Ls 和 CLA 程序、 因为它们未对齐、我告诉寄存器 LS3用于程序存储器而不是数据(我不能告诉一半 LS3用于程序、一半用于数据)。
专家能否检查我的链接器、是否一切正常?
尊敬的 Marek:
LSx 块不能拆分、它们必须作为数据或程序分配。 此外、将在 CLA 侧使用的所有全局变量都必须映射到指定为数据的 LSx 块或 CPU-CLA 消息 RAM。
谢谢、
Ashwini
大家好、但我不能将所有缓冲区移动到 Ls... 如何操作?
我甚至没有全范围(1024)的双围因子。 我很不明白,我不知道该怎么做...
我的内存分配:
例如、来自 Vishal Coelho (CLA_HandsOnWorkshop)的 TwiddlesFactors 被放置在 GSram 中。 对我来说毫无意义
您好 Marek、
我查看了 CLA_code 配置的 CLAHandsOn 解决方案。 在该实现中、2个 IOBuffers 被放置在 LS RAM 中。 我认为这是 CLA 端使用的唯一共享 FFT 数据结构。 RFFTMag 和 RFFTTwidages"被放置在 GSRAM 中、因为在 main 中执行 RFFT 幅度时、只有代码的 C28端需要这些代码。 因此、分区是有道理的。 如果这是您的实现所执行的操作、则可以遵循相同的操作。
有关您在以下两行中共享的代码片段的一个问题。 如何触发任务1和任务8? 您是否确认正在运行 CLA1任务?
//触发集
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.task1 = CLA_TRIG_NOPERPH;
DmaClaSrcSelRegs.CLA1TASSKSRCSEL2.bit.TASK8 = CLA_TRIG_NOPERPH;
谢谢、
Ashwini
大家好、感谢您的回答。 我使用 DMA 进行乒乓缓冲、因此在我向本地缓冲器(例如、InBuf_Volt1)填充1024个样本后、我将值复制到 IOBuffer 和 inc Task1。 任务1完成 FFT 后、我得到了 CLA ISR、其中程序计算幅度和相位。
如下所示:
DMA
while( (Cla1Regs.MIRUN.bit.INT1 == 1) && (ClaComputationDone == false) ){;} memcpy(IOBuffer, InBuf_Volt1, sizeof IOBuffer*sizeof(float32)); ClaComputationDone = false; CLASignalType = 0; Cla1ForceTask1();
__interrupt void Cla1Task1 ( void ) { //__mdebugstop(); CLA_CFFT_run512Pt(); CLA_CFFT_unpack512Pt(); }
__interrupt void cla1Isr1 () { if(CLASignalType == 0) { //Volt struct FFT_Computation_Cla(&volt1, rfft.MagBuf); //Calculating mag and phs } else { if(CLASignalType == 1) { //Curr struct FFT_Computation_Cla(&curr1, rfft.MagBuf); //Calculating mag and phs } } ClaComputationDone = true; PieCtrlRegs.PIEACK.all = M_INT11; }
尊敬的 Marek:
在 DMA 代码片段行1中:当 CLA 任务1正在运行时、while 条件为 true、并且标志为 false。 我想知道是否会有一个竞争条件、在 CLA 任务结束时、while 条件变为 false 并在 cla1Isr1被触发前继续运行。 也许有人建议尝试将条件更改为仅检查 ClaComputationDone 标志并删除 MIRUN.INT1检查?
关于访问冲突-它是否表示 CLA 读取或写入或提取故障?
谢谢、
Ashwini
您好、是的、我可以编辑此条件。 但这不应导致问题。 我使用正弦信号尝试了解决方案程序(CLAHandsOn 解决方案)、结果与主程序中的结果完全相同。 我在 MATLAB FFT 中有相同的信号(用于比较),在 CLA 中,一些采样/谐波是好的,一些是坏的(例如,在 MATLAB FFT[1]= 51444.12和 CLA FFT[1]= 0.0中)。
它可能是获取故障。
我的朋友告诉我、TwiddlesFactors 必须位于 LSram 中(检查 RFFT_F32.asm 文件)。 但是、如果它在 GS 或 LS 中、结果不会改变。
请看、这是我的正弦 LSB 表:
float32 sineLSB[]= { 32768,32969,33170,33371,33572,33774,33975,34176, 34377,34578,34779,34980,35180,35381,35582,35782, 35982,36183,36383,36583,36782,36982,37182,37381, 37580,37779,37978,38177,38375,38573,38771,38969, 39166,39364,39561,39757,39954,40150,40346,40542, 40737,40932,41127,41321,41515,41709,41903,42096, 42288,42481,42673,42864,43056,43247,43437,43627, 43817,44006,44195,44383,44571,44759,44946,45133, 45319,45504,45690,45874,46058,46242,46425,46608, 46790,46972,47153,47333,47513,47693,47872,48050, 48228,48405,48582,48758,48933,49108,49282,49455, 49628,49800,49972,50143,50313,50483,50652,50820, 50988,51155,51321,51487,51651,51815,51979,52142, 52303,52465,52625,52785,52944,53102,53259,53416, 53572,53727,53881,54035,54188,54339,54491,54641, 54790,54939,55087,55234,55380,55525,55669,55813, 55955,56097,56238,56378,56517,56655,56793,56929, 57065,57199,57333,57466,57597,57728,57858,57987, 58115,58242,58368,58493,58618,58741,58863,58984, 59104,59224,59342,59459,59575,59691,59805,59918, 60030,60141,60251,60360,60468,60575,60681,60786, 60890,60993,61095,61195,61295,61393,61491,61587, 61682,61776,61869,61961,62052,62142,62230,62318, 62404,62490,62574,62657,62739,62820,62899,62978, 63055,63131,63206,63280,63353,63425,63495,63565, 63633,63700,63766,63830,63894,63956,64017,64077, 64136,64193,64250,64305,64359,64412,64464,64514, 64563,64611,64658,64704,64748,64791,64834,64874, 64914,64952,64990,65025,65060,65094,65126,65157, 65187,65216,65243,65269,65294,65318,65340,65362, 65382,65401,65418,65435,65450,65464,65476,65488, 65498,65507,65515,65521,65526,65530,65533,65535, 65535,65534,65532,65528,65524,65518,65511,65503, 65493,65482,65470,65457,65442,65427,65410,65391, 65372,65351,65329,65306,65282,65256,65230,65201, 65172,65142,65110,65077,65043,65008,64971,64933, 64894,64854,64813,64770,64726,64681,64635,64587, 64539,64489,64438,64386,64332,64278,64222,64165, 64107,64047,63987,63925,63862,63798,63733,63666, 63599,63530,63460,63389,63317,63244,63169,63093, 63017,62939,62860,62779,62698,62616,62532,62447, 62361,62274,62186,62097,62007,61915,61823,61729, 61635,61539,61442,61344,61245,61145,61044,60942, 60838,60734,60629,60522,60415,60306,60196,60086, 59974,59862,59748,59633,59517,59401,59283,59164, 59044,58924,58802,58679,58556,58431,58305,58179, 58051,57923,57793,57663,57532,57399,57266,57132, 56997,56861,56724,56586,56448,56308,56168,56026, 55884,55741,55597,55452,55307,55160,55013,54865, 54716,54566,54415,54264,54111,53958,53804,53650, 53494,53338,53181,53023,52864,52705,52545,52384, 52223,52060,51897,51734,51569,51404,51238,51071, 50904,50736,50568,50398,50228,50058,49886,49714, 49542,49369,49195,49020,48845,48670,48493,48317, 48139,47961,47782,47603,47424,47243,47062,46881, 46699,46517,46334,46150,45966,45782,45597,45412, 45226,45039,44852,44665,44477,44289,44101,43912, 43722,43532,43342,43151,42960,42769,42577,42385, 42192,41999,41806,41612,41418,41224,41029,40835, 40639,40444,40248,40052,39856,39659,39462,39265, 39068,38870,38672,38474,38276,38077,37879,37680, 37481,37281,37082,36882,36683,36483,36283,36083, 35882,35682,35481,35281,35080,34879,34678,34477, 34276,34075,33874,33673,33472,33271,33069,32868, 32667,32466,32264,32063,31862,31661,31460,31259, 31058,30857,30656,30455,30254,30054,29853,29653, 29452,29252,29052,28852,28653,28453,28254,28054, 27855,27656,27458,27259,27061,26863,26665,26467, 26270,26073,25876,25679,25483,25287,25091,24896, 24700,24506,24311,24117,23923,23729,23536,23343, 23150,22958,22766,22575,22384,22193,22003,21813, 21623,21434,21246,21058,20870,20683,20496,20309, 20123,19938,19753,19569,19385,19201,19018,18836, 18654,18473,18292,18111,17932,17753,17574,17396, 17218,17042,16865,16690,16515,16340,16166,15993, 15821,15649,15477,15307,15137,14967,14799,14631, 14464,14297,14131,13966,13801,13638,13475,13312, 13151,12990,12830,12671,12512,12354,12197,12041, 11885,11731,11577,11424,11271,11120,10969,10819, 10670,10522,10375,10228,10083,9938,9794,9651, 9509,9367,9227,9087,8949,8811,8674,8538, 8403,8269,8136,8003,7872,7742,7612,7484, 7356,7230,7104,6979,6856,6733,6611,6491, 6371,6252,6134,6018,5902,5787,5673,5561, 5449,5339,5229,5120,5013,4906,4801,4697, 4593,4491,4390,4290,4191,4093,3996,3900, 3806,3712,3620,3528,3438,3349,3261,3174, 3088,3003,2919,2837,2756,2675,2596,2518, 2442,2366,2291,2218,2146,2075,2005,1936, 1869,1802,1737,1673,1610,1548,1488,1428, 1370,1313,1257,1203,1149,1097,1046,996, 948,900,854,809,765,722,681,641, 602,564,527,492,458,425,393,363, 334,305,279,253,229,206,184,163, 144,125,108,93,78,65,53,42, 32,24,17,11,7,3,1,0, 0,2,5,9,14,20,28,37, 47,59,71,85,100,117,134,153, 173,195,217,241,266,292,319,348, 378,409,441,475,510,545,583,621, 661,701,744,787,831,877,924,972, 1021,1071,1123,1176,1230,1285,1342,1399, 1458,1518,1579,1641,1705,1769,1835,1902, 1970,2040,2110,2182,2255,2329,2404,2480, 2557,2636,2715,2796,2878,2961,3045,3131, 3217,3305,3393,3483,3574,3666,3759,3853, 3948,4044,4142,4240,4340,4440,4542,4645, 4749,4854,4960,5067,5175,5284,5394,5505, 5617,5730,5844,5960,6076,6193,6311,6431, 6551,6672,6794,6917,7042,7167,7293,7420, 7548,7677,7807,7938,8069,8202,8336,8470, 8606,8742,8880,9018,9157,9297,9438,9580, 9722,9866,10010,10155,10301,10448,10596,10745, 10894,11044,11196,11347,11500,11654,11808,11963, 12119,12276,12433,12591,12750,12910,13070,13232, 13393,13556,13720,13884,14048,14214,14380,14547, 14715,14883,15052,15222,15392,15563,15735,15907, 16080,16253,16427,16602,16777,16953,17130,17307, 17485,17663,17842,18022,18202,18382,18563,18745, 18927,19110,19293,19477,19661,19845,20031,20216, 20402,20589,20776,20964,21152,21340,21529,21718, 21908,22098,22288,22479,22671,22862,23054,23247, 23439,23632,23826,24020,24214,24408,24603,24798, 24993,25189,25385,25581,25778,25974,26171,26369, 26566,26764,26962,27160,27358,27557,27756,27955, 28154,28353,28553,28753,28952,29152,29352,29553, 29753,29953,30154,30355,30555,30756,30957,31158, 31359,31560,31761,31963,32164,32365,32566,32768 };
尊敬的 Marek:
CLA FFT API 库是为技术讲座示例创建的、不属于我们官方软件支持的一部分。 因此、我对实现没有可见性、也不知道这是否是预期的。 我正在与其他团队成员联系、并将告诉您我发现的内容。
同时、也许可以检查共享数据类型、看看它们在 C28和 CLA 上的大小是相同的。 您可以在以下链接中找到相关信息:
谢谢、
Ashwini
非常感谢您的观看、非常乐意为我提供帮助。 我将等待回复:)
尊敬的 Marek:
以下是我从团队那里得到的一个意见、您能否检查您是否确实如此:
C28 FPU32 RFFT 输出:实数占用缓冲区的前半部分、虚数占用第二个部分(顺序相反):
OutBuf[0]=实数[0]
OutBuf[1]=实数[1]
OutBuf[2]=实数[2]
………μ A
OutBuf[N/2]=实数[N/2]
OutBuf[N/2+1]= imag[N/2-1]
………μ A
OutBuf[N-3]= imag[3]
OutBuf[N-2]= imag[2]
OutBuf[N-1]= imag[1]
基于 CFFT+Unpackt 的 CLA RFFT:实数+虚数对:
OutBuf[0]=实数[0]
OutBuf[1]= imag[0]
OutBuf[2]=实数[1]
OutBuf[3]= imag[1]
………μ A
OutBuf[N-2]=实数[N-1]
OutBuf[N-1]= imag[N-1]
谢谢、
Ashwini
大家好、我现在已经把它弄清楚了。
我是否还应该为阶段运行整个 IOBuffer2? 或者,我是否应该首先获取实部(到本地缓冲区)并开始运行相位函数? (笑声) 或者,我是否只能在计算后为实际零件选择角度?
你给我带来了问题,非常感谢,哦:)
尊敬的 Marek:
相关知识。 我向专家询问您的问题、并在听到反馈后通知您。
谢谢、
Ashwini
尊敬的 Marek:
您将使用哪种 API 进行幅度计算? 如果它是 RFFT_F32_MAG_TMU0、与车间应用相同、则 IOBuffer2实值和虚值必须与 RFFT 在 C28上输出的布局相同。 因此、需要对 CLA CFFT 中的缓冲区进行后处理并以相同的方式进行订购、这是很好的。
谢谢、
Ashwini
您好、是的、我使用此 API。 因此,实数部分将位于前512个数组位置或否?
编辑:好的、我明白了。 Thx
尊敬的 Marek:
太棒了、我将继续并结束这条线程。
谢谢、
Ashwini