你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
FFT.rar
2016-10-8 16:59 上传
点击文件名下载附件
10.37 KB, 下载次数: 71, 下载积分: ST金币 -1
举报
现在我的输入信号:CH1: 800HZ 3Vpp 加了1.5V的直流偏置的正弦波(函数发生器产生) CH2: 200HZ 2Vpp 加了1V的直流偏置的正弦波(函数发生器产生)采样频率是16.322K 做1024点FFT 输出的后换算出来的直流分量和频率点都能对的上 但是800HZ和200HZ的幅值却不对应 打印:
逍遥李 发表于 2016-10-8 17:30 FFT我记得不就是对称的吗?
MrLi... 发表于 2016-10-9 16:27 你好!现在我的输入信号:CH1: 800HZ 3Vpp 加了1.5V的直流偏置的正弦波(函数发生器产生) ...
STM32隐藏
5.18活动板子会不会是STM32L4呢
1122
56465
STM32 CUBE软件中找不到STM32L4系列单片机
Your UAT Feedback is needed within today.
应用
AAA
测试标签123
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,我只是了解过一点点