我按照官网的例子改了一个FFT 输入是500HZ的正弦波(用的函数发生器),采样频率50KHZ,经AD采集后做1024点的FFT变换得出结果,但结果中从第512点开始向两边是对称的,按理应该不对称才对啊,求解,谢谢,MDK的原程序在:https://pan.baidu.com/s/1bHe8ua main程序和打印的TXT文件如附件 |
FFT.rar
下载10.37 KB, 下载次数: 72, 下载积分: ST金币 -1
问个关于STM32L4 SPI读数据,前3个字节永远是0
STM32L432 2个SPI同时使用的问题
STM32L476 ADC采集内部温度传感器电压值
STM32L431通过串口下载程序问题
ST的hal库有问题手头有STM32L4或STM32F7的帮忙测试DMA SD卡
STM32L476-Discovery开发板如何进行串口固件烧写
大家有用到STM32L433的CAN通信的吗?
STM32L4 FFT 自带arm_math.h编译不成功
想问一个关于STM32L475 flash的问题
谁有STM32L476的编程手册,传一个,感谢
CH1 maxvalue1= 614.746094 Index1= 51
CH2 DC2= 974.417603
CH2 maxvalue1= 431.114563 Index2= 13
我的换算:
CH1:
直流分量:1501/1024=1.46V
频点:51*16.322/1024=0.812K
800HZ频点幅值:614/(1024/2)=1.19V 实际用函数发生器输出的正弦波幅值是1.5V 难道是误差?求解?谢谢
main函数如下:
int main(void)
{
/* USER CODE BEGIN 1 */
//arm_status status;
float32_t maxValue1;
float32_t maxValue2;
//float32_t maxValue3;
uint16_t i;
int32_t timer=0,timer1=0,timer2=0,timer3=0;
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
/* 启动AD转换并使能DMA传输和中断 */
HAL_ADC_Start_DMA(&hadc1,ADC_ConvertedValue,ADC_NUMOFCHANNEL);
timer=HAL_GetTick();
//arm_status status;
//status = ARM_MATH_SUCCESS;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(__HAL_DMA_GET_COUNTER(&hdma_adc1)==1)
{
timer1=HAL_GetTick();
//printf("ADwc time1:%d\r\n",timer1-timer);
HAL_ADC_Stop_DMA(&hadc1);
HAL_ADC_Stop(&hadc1);
for(i=0;i<1024;i++)
{
ADC_ConvertedValueLocal1[2*i]=(float)(ADC_ConvertedValue[3*i]&0xFFF)*3.3/4096;
ADC_ConvertedValueLocal1[2*i+1]=0;
ADC_ConvertedValueLocal2[2*i]=(float)(ADC_ConvertedValue[3*i+1]&0xFFF)*3.3/4096;
ADC_ConvertedValueLocal2[2*i+1]=0;
//ADC_ConvertedValueLocal3[2*i]=(float)(ADC_ConvertedValue[3*i+2]&0xFFF)*3.3/4096;
//ADC_ConvertedValueLocal3[2*i+1]=0;
}
// for(i=0;i<2048;i++)
// {
// printf("Bufwc[%d]:%f\r\n",i,ADC_ConvertedValueLocal1);
// }
timer2=HAL_GetTick();
//printf("Bufwc time2:%d\r\n",timer2-timer1);
HAL_ADC_Start_DMA(&hadc1,ADC_ConvertedValue,ADC_NUMOFCHANNEL);
arm_cfft_f32(&arm_cfft_sR_f32_len1024, ADC_ConvertedValueLocal1, ifftFlag, doBitReverse);
// for(i=0;i<2048;i++)
// {
// printf("Bufwc[%d]:%f\r\n",i,ADC_ConvertedValueLocal1);
// }
arm_cmplx_mag_f32(ADC_ConvertedValueLocal1, testOutput1, fftSize);
// for(i=0;i<1024;i++)
// {
// printf("fft_outputbuf[%d]:%f\r\n",i,testOutput1);
// }
printf("CH1 DC1= %f \r\n",testOutput1[0]);
for(i=513;i<1024;i++)
{
testOutput1=0;
}
testOutput1[0]=0;
arm_max_f32(testOutput1, fftSize, &maxValue1, &testIndex1);
printf("CH1 maxvalue1= %f Index1= %d\r\n",maxValue1,testIndex1);
arm_cfft_f32(&arm_cfft_sR_f32_len1024, ADC_ConvertedValueLocal2, ifftFlag, doBitReverse);
arm_cmplx_mag_f32(ADC_ConvertedValueLocal2, testOutput2, fftSize);
printf("CH2 DC2= %f \r\n",testOutput2[0]);
for(i=513;i<1024;i++)
{
testOutput2=0;
}
testOutput2[0]=0;
arm_max_f32(testOutput2, fftSize, &maxValue2, &testIndex2);
printf("CH2 maxvalue1= %f Index2= %d\r\n",maxValue2,testIndex2);
//arm_cfft_f32(&arm_cfft_sR_f32_len1024, ADC_ConvertedValueLocal3, ifftFlag, doBitReverse);
//arm_cmplx_mag_f32(ADC_ConvertedValueLocal3, testOutput3, fftSize);
//arm_max_f32(testOutput3, fftSize, &maxValue3, &testIndex3);
timer3=HAL_GetTick();
printf("FFTwc time3:%d\r\n",timer3-timer1);
//while(1);
}
}
}
对,是的,刚接触到FFT,我以为是前面1024个点和后面1024个点是对称的,谢谢
这个stm32上我也没用过FFT,我只是了解过一点点
知道了 16.322是采用