器件型号:DK-TM4C129X
工具/软件:Code Composer Studio
您好、
我不熟悉此 CMSIS DSP 库函数。 我目前正在研究一个项目、该项目涉及通过函数发生器计算外部模拟信号的 FFT。 我已使用由计时器触发的 ADC 成功采样模拟信号、并使用 DMA 将值存储在1024长度的数组"g_ui8RxBufA"中。 现在、我想计算该信号的 FFT。 我成功构建了 CMSIS DSP 库并运行了此处给出的示例。 我运行了其中给出的 FFT 示例、该示例计算了测试数据信号的 FFT。 我只想这样做。 因此、输出"g_ui8RxBufA"数组、我在数组的每个奇数索引处添加了0值、方法是使用代码中所示的 for 循环(阵列索引从0开始)来形成数组" testInput_F32_10kHz"(长度为2048)、并遵循与示例相同的过程。 但是、当我运行代码时、"testInput_F32_10kHz" 数组的所有值都为0。 不知怎么说、这些值不是从"g_ui8RxBufA"数组传输的。 是否有人可以指出代码中的缺陷?
主函数:
uint32_t sysclock;
SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
while (!(SysCtlPeripheralReady (SYSCTL_Periph_UDMA)));
SysCtlPeripheralSlepEnable (SYSCTL_Periph_UDMA);
IntMasterEnable();
IntEnable (INT_UDMAERR);
uDMAEnable();
uDMAControlBaseSet (pui8ControlTable);
InitUART1传输(sysclock);
//FFT 开始
uint32_t i;
对于(I = 0;I < 1024;I++)
{
//if (I % 2 = 0)
testInput_F32_10kHz[2*i]= g_ui8RxBufA[i];
//else
testInput_F32_10kHz[2*I + 1]= 0;
}
/*----------------------------------------------
*最大幅度 FFT Bin 测试
************************************************************************************************** *
//int32_t main (空)
//{
ARM_STATUS 状态;
float32_t maxValue;
状态= ARM_MATH_SUCCESS;
/*通过 CFFT/CIFFT 模块处理数据*/
ARM_CFFT_F32 (&ARM_CFFT_SR_F32_len1024、testInput_F32_10kHz、ifftFlag、doBitReverse);
/*通过的复数幅度模块处理数据
计算每个区间的幅度*/
arm_cmplx_mag_F32 (testInput_F32_10kHz、TestOutput、fftSize);
/*计算 maxValue 并返回相应的 bin 值*/
arm_max_F32 (TestOutput、fftSize、&maxValue、&testIndex);
if (testIndex!= refIndex)
{
状态= ARM_MATH_TEST_FAILURE;
}
/*----------------------------------------------
**如果信号未通过通过通过检查,则在此环路。
**这表示测试失败
**-------------------------------------- *
if (status!= ARM_MATH_SUCCESS)
{
while (1);
}
//FFT 结束
// while (1); /*主函数不返回*/
while (1)
{
}
InitUART1 Transfer()函数:
uint32_t ui32Period; //uint32_t div; SysCtlPeripheralEnable (SYSCTL_Periph_ADC0); while (!(SysCtlPeripheralReady (SYSCTL_Periph_ADC0))); SysCtlPeripheralSlepEnable (SYSCTL_Periph_ADC0); //ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PIOSC | ADC_CLOCK_RATE_FULL、1); // ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL、 30); ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL、24); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); while (!(SysCtlPeripheralReady (SYSCTL_Periph_GPIOE))); GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3); //ADCSequenceConfigure (ADC0_BASE、0 /*SS0*/、ADC_TRIGGER_AYSHOW、3 /*Priority*/);// SS0-SS3优先级必须始终不同 ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_TIMER、0); ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END); ADCSequenceEnable (ADC0_BASE、0); ADCIntClear (ADC0_BASE、0); //启用计时器外设 SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0); //计时器应定期运行 TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE); //设置每次计时器完成时加载到计时器中的值 //这是计时器触发 ADC 之前所需的时钟周期数 //#define F_sample 1000 ui32Period = 1200000/1024000; TimerLoadSet (TIMER0_BASE、TIMER_A、ui32Period-1); //启用触发 TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE); ADCIntEnable (ADC0_BASE、0); //启用计时器 TimerEnable (TIMER0_BASE、TIMER_A); ADCSequenceDMAEnable (ADC0_BASE、0); uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、 UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK); uDMAChannelControlSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、 UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_NEW_USEBURST | UDMA_ARB_1024); uDMAChannelControlSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、 UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_NEW_USEBURST | UDMA_ARB_1024); uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、 UDMA_MODE_PINGONG、 (void *)(ADC0_BASE + ADC_O_SSFIFO0)、 G_ui8RxBufA、MEM_buffer_size); uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、 UDMA_MODE_PINGONG、 (void *)(ADC0_BASE + ADC_O_SSFIFO0)、 G_ui8RxBufB、MEM_buffer_size); uDMAChannelEnable (UDMA_CHANGE_ADC0); ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS0); IntEnable (INT_ADC0SS0);