栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

STM32f429使用DSP库相应函数进行FFT、IFFT、复数共轭、相乘等操作

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

STM32f429使用DSP库相应函数进行FFT、IFFT、复数共轭、相乘等操作

STM32F4中进行FFT等复数运算相应函数使用方法,使用友善串口助手查看函数运行结果
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "math.h"
#include "arm_math.h"
#include "arm_const_structs.h"

#define F 10  //
#define PI2 6.28318530717959

__IO uint16_t  ADC1ConvertedValue[4096];

float rfft_inputbuf[F];
float rfft_outputbuf[F*2];
float routputbuf[F];//幅度输出数组

float cfft_inputbuf[F*2];
//float cfft_outputbuf[4096*2];
float coutputbuf[F];//幅度输出数组

float conj_rfft_outputbuf[F*2];
	float squared_rfft_outputbuf[F];

	float mult_fft_outputbuf[F*2];
	float mult_real_fft_outputbuf[F*2];
	float sub_fft_outputbuf[F*2];
	float scale_fft_outputbuf[F*2];


int main(void)
{
    
	
//    u8 len;	
//	u16 times=0; 
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED 
    KEY_Init();                     //初始化按键

	for(int j =0; j
		rfft_inputbuf[j]=0.0f;
		routputbuf[j]=0.0f;
				squared_rfft_outputbuf[j]=0.0f;
		coutputbuf[j]=0.0f;
	}
	for(int j =0; j
		rfft_outputbuf[j]=0.0f;
		cfft_inputbuf[j]=0.0f;
				conj_rfft_outputbuf[j]=0.0f;
				mult_fft_outputbuf[j]=0.0f;
				mult_real_fft_outputbuf[j]=0.0f;
				sub_fft_outputbuf[j]=0.0f;
				scale_fft_outputbuf[j]=0.0f;
//		cifft_inputbuf[j]=0.0f;
	}	
	
	uint16_t i; 
	arm_rfft_fast_instance_f32 S; 

	  
	uint16_t fftSize = F;  
	  
    uint8_t ifftFlag = 0;  

	 
	arm_rfft_fast_init_f32(&S, fftSize); 

     
	for(i=0; i 
     
    rfft_inputbuf[i] = 2*arm_sin_f32(PI2*i*38.0/F) + 
               3*arm_sin_f32(PI2*i*47.0/F)  + 
               4*arm_sin_f32(PI2*i*23.0/F); 
	} 
	
	printf("rfft_inputbufn"); 
	for(i=0; i 
		printf("%frn", rfft_inputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
    
  arm_rfft_fast_f32(&S, rfft_inputbuf, rfft_outputbuf, ifftFlag); 

	printf("2-rfft_inputbufn"); 
	for(i=0; i 
		printf("%frn", rfft_inputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	printf("rfft_outputbufn"); 
	for(i=0; i 
		printf("%frn", rfft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	 	
//	arm_rfft_fast_f32(&S, rifft_inputbuf, rifft_outputbuf, 1);
//	
//    
	
	
   arm_cmplx_mag_f32(rfft_outputbuf, routputbuf, fftSize); 
	
	printf("2—rfft_outputbufn"); 
	for(i=0; i 
		printf("%frn", rfft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	printf("绝对值n"); 
	for(i=0; i 
		printf("%frn", routputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	//复数共轭  每个数组都有2*fftSize个值
	arm_cmplx_conj_f32(rfft_outputbuf,conj_rfft_outputbuf,fftSize);
	
	printf("3—rfft_outputbufn"); 
	for(i=0; i 
		printf("%frn", rfft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	printf("共轭3—rfft_outputbufn"); 
	for(i=0; i 
		printf("%frn", conj_rfft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	//
	
	arm_cmplx_mag_squared_f32(rfft_outputbuf,squared_rfft_outputbuf,fftSize);
	
	printf("4—rfft_outputbufn"); 
	for(i=0; i 
		printf("%frn", rfft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	printf("复数能量4—rfft_outputbufn"); 
	for(i=0; i 
		printf("%frn", squared_rfft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	//
	for(i=0; i 
		squared_rfft_outputbuf[i]=i;
    }
	
	arm_cmplx_mult_cmplx_f32 (rfft_outputbuf,squared_rfft_outputbuf,mult_fft_outputbuf,fftSize);
	
	printf("5—rfft_outputbufn"); 
	for(i=0; i 
		printf("%frn", rfft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	printf("复数乘法5—rfft_outputbuf*fft_outputbufn"); 
	for(i=0; i 
		printf("%frn", mult_fft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	//
	
	
	arm_cmplx_mult_real_f32(rfft_outputbuf,squared_rfft_outputbuf,mult_real_fft_outputbuf,fftSize);
	
	printf("6—rfft_outputbufn"); 
	for(i=0; i 
		printf("%frn", rfft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	
	
	printf("复数与实数相乘6—rfft_outputbuf*squared_rfft_outputbufn"); 
	for(i=0; i 
		printf("%frn", mult_real_fft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	//
	
	arm_sub_f32(rfft_outputbuf,mult_real_fft_outputbuf,sub_fft_outputbuf,2*fftSize);
	
	printf("7—rfft_outputbufn"); 
	for(i=0; i 
		printf("%frn", rfft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	printf("向量减法7—rfft_outputbuf-mult_real_fft_outputbufn"); 
	for(i=0; i 
		printf("%frn", sub_fft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	//
	
	arm_scale_f32(rfft_outputbuf,3.3,scale_fft_outputbuf,2*fftSize);
	
	printf("8—rfft_outputbufn"); 
	for(i=0; i 
		printf("%frn", rfft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	printf("向量乘以标量值8—rfft_outputbuf*3.3n"); 
	for(i=0; i 
		printf("%frn", scale_fft_outputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	
	float max;
	uint32_t num;
	for(i=0; i 
		rfft_inputbuf[i]=9; 
		
    }
	
	arm_max_f32(rfft_inputbuf,fftSize,&max,&num);
	
	printf("rfft_inputbufn"); 
	for(i=0; i 
		printf("%frn", rfft_inputbuf[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	printf("最大值n"); 
	
		printf("%frn", max); 
	printf("在数组中的位置n");
		printf("%drn", num); 
		LED0=!LED0;
		delay_ms(40);
    
	float rfft_inputbuf22[F];
	
	arm_copy_f32(rfft_inputbuf,rfft_inputbuf22,fftSize);// ( float32_t *pSrc, float32_t *pDst, uint32_t blockSize )
	
	printf("rfft_inputbuf22n"); 
	for(i=0; i 
		printf("%frn", rfft_inputbuf22[i]); 
		LED0=!LED0;
		delay_ms(40);
    }
	
	
	
	
	
	
	
	for (int i = 0; i < F*2; i++)
	{
		//cfft_inputbuf[i * 2] = ADC1ConvertedValue[i] * 3.3 / 4096;//实部赋值,* 3.3 / 4096是为了将ADC采集到的值转换成实际电压
		cfft_inputbuf[i * 2] = 500+1000*arm_sin_f32(PI2*i*50.0/F) + 
               2000*arm_sin_f32(PI2*i*1500.0/F)  + 
               3000*arm_sin_f32(PI2*i*1550.0/F);
		cfft_inputbuf[i * 2 + 1] = 0;//虚部赋值,固定为0.
	}
	
	 
	
	uint32_t doBitReverse = 1;
 	
	arm_cfft_f32(&arm_cfft_sR_f32_len4096, cfft_inputbuf, ifftFlag, doBitReverse);

	arm_cfft_f32(&arm_cfft_sR_f32_len4096, cfft_inputbuf, 1, doBitReverse);
	
  
	arm_cmplx_mag_f32(cfft_inputbuf, coutputbuf, fftSize);
	
//	for(i=0; i
		LED0=!LED0;
		delay_ms(1000);
	};
    
		
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960380.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号