第六章合集代码2:chatGPT生成的数字信号处理算法代码及在stm32中的整合

ARM_MATH_CM4
#include "arm_math.h"
#include "arm_const_structs.h"
#define FFT_SIZE 512
#define FFT_LEN FFT_SIZE
#define SAMPLING_FREQUENCY 2400000
float32_t inputSignal[FFT_SIZE*2];
float32_t signal[FFT_SIZE*2];
float32_t fftOutput[FFT_SIZE];
/*通过计算fft来得到周期性信号的频率值的函数,来源于chatGPT*/
float32_t fftCalculate(void)
{
arm_cfft_f32(&arm_cfft_sR_f32_len512, inputSignal, 0, 1);
arm_cmplx_mag_f32(inputSignal, fftOutput, FFT_LEN);
uint32_t maxValueIndex = 0;
float32_t maxValue = 0;
arm_max_f32(&fftOutput[1], FFT_LEN, &maxValue, &maxValueIndex);
float32_t frequency =(float32_t) (maxValueIndex+1) * (float32_t)SAMPLING_FREQUENCY / (float32_t)FFT_SIZE;
return frequency ;
}
/*计算信号最大值的函数,来源于chatGPT*/
float32_t get_signal_max(void)
{
float32_t max_value = 0.0f;
arm_max_f32(signal, FFT_SIZE, &max_value, NULL);
return max_value;
}
/*计算信号最小值的函数,来源于chatGPT*/
float32_t get_signal_min(void)
{
float32_t min_value = 0.0f;
arm_min_f32(signal, FFT_SIZE, &min_value, NULL);
return min_value;
}
/*计算信号峰-峰值的函数,来源于chatGPT*/
float32_t get_signal_peak_to_peak(void)
{
float32_t min_value = 0.0f;
float32_t max_value = 0.0f;
arm_min_f32(signal, FFT_SIZE, &min_value, NULL);
arm_max_f32(signal, FFT_SIZE, &max_value, NULL);
return (max_value - min_value);
}
/*计算信号有效值的函数,来源于chatGPT*/
float32_t get_signal_rms(void)
{
float32_t rms_value = 0.0f;
for(int k=0;k<FFT_SIZE;k++)//采样数据转换为0-3.3伏
signal[k]=signal[k]-get_signal_peak_to_peak()/2;
arm_rms_f32(signal, FFT_SIZE, &rms_value);
return rms_value;
}
for(int j=0;j<FFT_SIZE;j++)//采样数据转换为0-3.3伏
{
signal[j]=(AdcConvertedValue[j]&0xfff)*3.3f/4095.0f;//signal是用来计算有效值的数组
inputSignal[j*2]=(AdcConvertedValue[j]&0xfff)*3.3f/4095.0f;//inputSignal是用来计算复数fft的数组
inputSignal[j*2+1]=0;//交替插零,添加数据的虚部,以便使用复数傅里叶变换计算信号频率
}
/*使用chatGPT提供的算法计算信号最大值、最小值。峰峰值、有效值、频率*/
Unicode::snprintfFloat(textMaxValueBuffer, 10, "%2.3f", get_signal_max());
textMaxValue.invalidate();//更新最大值显示内容
Unicode::snprintfFloat(textMinValueBuffer, 10, "%2.3f", get_signal_min());
textMinValue.invalidate();//更新最小值显示内容
Unicode::snprintfFloat(textPPValueBuffer, 10, "%2.3f", get_signal_peak_to_peak());
textPPValue.invalidate();//更新峰-峰值显示内容
Unicode::snprintfFloat(textFreBuffer, 10, "%5.0f", fftCalculate());
textFre.invalidate();//更新频率显示内容
Unicode::snprintfFloat(textRMSValueBuffer, 10, "%2.3f", get_signal_rms());
textRMSValue.invalidate();//更新有效值显示内容