基于GD32F303,CMSIS-DSP支持包,实现FFT,得到频率,还原单一频率的波形

本文介绍了在M33M4处理器中使用FFT进行1.25Hz信号分析的方法,包括配置FFT和IFFT结构,处理采样频率对信号重建的影响,并提到奈奎斯特-香农采样定理的重要性。
摘要由CSDN通过智能技术生成

        一般情况下M33 M4的内核是支持DSP包的,用户只需要自己添加支持包,并添加相应的头文件即可,比如#include "arm_math.h",#include "arm_const_structs.h" 等等。

(1)main.c

#include "gd32f30x.h"
#include "stdio.h"
#include "string.h"
#include "arm_math.h"
#include "arm_const_structs.h"

#define FFT_LENGTH 				512              //做512个点的FFT
#define SAMPLING_RATE 			640              //计算final_value_a 数组的采样率      
#define TARGET_FREQUENCY	    1.25f            //要IFF还原的目标频率

float32_t fft_output_a[FFT_LENGTH];
float32_t final_value_a[FFT_LENGTH * 2]; //采集到的数据,按照复数的形式保存
float32_t ifft_output_a[FFT_LENGTH];


arm_cfft_radix2_instance_f32  Ua_cfft_config;    //声明fft变换结构体
arm_cfft_radix2_instance_f32  Ua_ifft_config;    //声明ifft变换结构体

int main(void)
{

arm_cfft_radix2_init_f32(&Ua_cfft_config, FFT_LENGTH, 0, 1);      //配置正变换
arm_cfft_radix2_init_f32(&Ua_ifft_config, FFT_LENGTH, 1, 1);      //配置逆变换

    while(1)

    {
        arm_cfft_radix2_f32(&Ua_cfft_config,final_value_a);  //基2的FFT

        //fft_output_a[FFT_LENGTH]为频谱
        arm_cmplx_mag_f32(final_value_a,fft_output_a,FFT_LENGTH);

        //计算1.25HZ的索引位置,看看1.25HZ的波形在频谱中的第几个点
        int target_index = (int)((float)FFT_LENGTH  * TARGET_FREQUENCY / SAMPLING_RATE);  
																							                      
		float32_t target_amplitude_a,target_amplitude_b;
		float32_t target_phase_a,target_phase_b;
			
        //提取1.25Hz振幅
		arm_sqrt_f32(final_value_a[2 * target_index] * final_value_a[2 * target_index] +
		final_value_a[2 * target_index + 1] * final_value_a[2 * target_index + 1],&target_amplitude_a);

        //提取1.25Hz相位
        target_phase_a = atan2f(final_value_a[2 * target_index + 1], final_value_a[2 * target_index]);	


		for (int i = 0; i < FFT_LENGTH; i++) 			// 构造IFFT输入数组
		{
			if (i == target_index ) 
			{
				final_value_a[2 * i] = target_amplitude_a * cos(target_phase_a);
				final_value_a[2 * i + 1] = target_amplitude_a * sin(target_phase_a);

			} 
			else 
			{
					final_value_a[2 * i] = 0.0f;
					final_value_a[2 * i + 1] = 0.0f;

			}
		}	
        arm_cfft_radix2_f32(&Ua_ifft_config, final_value_a);  //基2的IFFT


		for (int i = 0; i < FFT_LENGTH; i++)   //提取IFFT数组的实部,就是还原的1.25HZ的波形
		{
			ifft_output_a[i] = final_value_a[2 * i]; 
        }

    }

}

注意:(1)根据奈奎斯特-香农采样定理,要对一个连续时间信号进行完美的重构,需要以不低于信号最高频率两倍的采样频率对其进行采样。简而言之,采样率越高,采到的目标频率的最大幅值的可能性越大

(2)通过fft想要滤除一些波形,得到自己想要的波形,首先要保证目标波形为整周期的波形,否则会出现频谱泄露的问题。

目前还没有摸索到如果通过不是完整周期,怎么FFT和IFFT,不过,听人说可以通过自己写DFT函数来实现,算了有时间再搞!

  • 24
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Qt中使用CMSIS-DSP库,可以通过以下步骤进行配置和集成: 1. 下载CMSIS-DSP库:从ARM官方网站上下载CMSIS-DSP库的压缩,并解压到本地目录。 2. 创建Qt项目:在Qt Creator中创建一个新的Qt项目。 3. 将CMSIS-DSP库添加到项目中:将CMSIS-DSP库中的头文件(.h文件)和源文件(.c文件)添加到Qt项目中。可以在Qt Creator中的项目资源管理器中右键点击项目名称,选择"添加现有文件",并选择CMSIS-DSP库的头文件和源文件。 4. 在.pro文件中添加相关配置:在Qt项目的.pro文件中添加必要的配置,以链接CMSIS-DSP库。例如,可以使用类似以下的语句: ``` INCLUDEPATH += /path/to/cmsis_dsp_library LIBS += -L/path/to/cmsis_dsp_library -larm_cortexM4lf_math ``` 这里的 "/path/to/cmsis_dsp_library" 是CMSIS-DSP库的路径,根据实际情况进行替换。 5. 在Qt代码中使用CMSIS-DSP函数:在Qt项目的代码中,括所需的头文件,并使用CMSIS-DSP库提供的函数进行信号处理、滤波、FFT等数字信号处理任务。 需要注意的是,CMSIS-DSP库是为ARM Cortex-M处理器优化的。在使用CMSIS-DSP库时,需要确保目标平台与库所针对的处理器兼容。 以上是使用CMSIS-DSP库的基本步骤,具体的集成过程可能会因项目和平台的不同而有所变化。建议参考CMSIS-DSP库的官方文档和Qt的相关文档,以便更详细地了解如何在Qt中使用CMSIS-DSP库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值