器件型号: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);