第六章合集代碼2:chatGPT生成的數(shù)字信號處理算法代碼及在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來得到周期性信號的頻率值的函數(shù),來源于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 ;
}
/*計算信號最大值的函數(shù),來源于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;
}
/*計算信號最小值的函數(shù),來源于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;
}
/*計算信號峰-峰值的函數(shù),來源于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);
}
/*計算信號有效值的函數(shù),來源于chatGPT*/
float32_t get_signal_rms(void)
{
? ? float32_t rms_value = 0.0f;? ? ? ? ??
for(int k=0;k<FFT_SIZE;k++)//采樣數(shù)據(jù)轉(zhuǎn)換為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++)//采樣數(shù)據(jù)轉(zhuǎn)換為0-3.3伏
{
signal[j]=(AdcConvertedValue[j]&0xfff)*3.3f/4095.0f;//signal是用來計算有效值的數(shù)組
inputSignal[j*2]=(AdcConvertedValue[j]&0xfff)*3.3f/4095.0f;//inputSignal是用來計算復數(shù)fft的數(shù)組
inputSignal[j*2+1]=0;//交替插零,添加數(shù)據(jù)的虛部,以便使用復數(shù)傅里葉變換計算信號頻率
}
/*使用chatGPT提供的算法計算信號最大值、最小值。峰峰值、有效值、頻率*/
Unicode::snprintfFloat(textMaxValueBuffer, 10, "%2.3f", get_signal_max());
textMaxValue.invalidate();//更新最大值顯示內(nèi)容
Unicode::snprintfFloat(textMinValueBuffer, 10, "%2.3f", get_signal_min());
textMinValue.invalidate();//更新最小值顯示內(nèi)容
Unicode::snprintfFloat(textPPValueBuffer, 10, "%2.3f", get_signal_peak_to_peak());
textPPValue.invalidate();//更新峰-峰值顯示內(nèi)容
Unicode::snprintfFloat(textFreBuffer, 10, "%5.0f", fftCalculate());
textFre.invalidate();//更新頻率顯示內(nèi)容
Unicode::snprintfFloat(textRMSValueBuffer, 10, "%2.3f", get_signal_rms());
textRMSValue.invalidate();//更新有效值顯示內(nèi)容