【CMSIS-DSP】— 针对嵌入式系统的优化计算库

频谱的横坐标是频率,纵坐标表示该频率下的振幅

功率谱是以频率为自变量的函数,代表原始时域信号中包含的每个频段的功率(单位时间的能量)

CMSIS-DSP — 针对嵌入式系统的优化计算库

CMSIS: Introduction (arm-software.github.io)

调用函数arm_cfft_f32(); 实现FFT
void arm_cfft_f32(
    const arm_cfft_instance_f32 *     S,
    float32_t *                       p1,
    uint8_t                           ifftFlag,
    uint8_t                           bitReverseFlag
);

cmsis-dsp 20arm_cfft_f32

  • 结构const arm_cfft_instance_f32的定义如下(在文件arm_math.h文件):

    typedef struct
    {
       uint16_t             fftLen;  //转换数据长度
       const float32_t *    pTwiddle;      
       const uint16_t *     pBitRevTable;    
       uint16_t             bitRevLength;        
    } arm_cfft_instance_f32;
    
  • p1输入和输出都是复数(complex number),偶数地址(从0开始)用于存储复数实部,随后的奇数地址用于存储同一个复数的虚部(默认为0)

  • ifftFlag用于指定函数执行的FFT逆变换ifftFlag=1,还是FFT正变换ifftFlag=0

  • bitReverseFlag用于指定是否对结果进行位翻转变换,根据FFT理论知识可知,对自然顺序输入进行FFT蝶形运算的结果的顺序,是自然顺序输出的地址高低位翻转的结果。当bitReverseFlag=1时,该函数能够对输出的结果执行地址高低位翻转和顺序置换;当bitReverseFlag=0时,该功能被禁止。大多数情况下,为得到频率依次递增的频域数据,需要使用该函数的位翻转功能。

bandpass.c
    
    inline void setInput0()
    {
        inputBuf_B0[2 * i] = (float)(*(p_data + offset));      //生成实部
        inputBuf_B0[2 * i + 1] = 0;                            //虚部全部为0
    }
调用函数arm_cmplx_mag_f32();计算信号的幅度谱
void arm_cmplx_mag_f32(
    const float32_t * 	 pSrc,
    float32_t * 	     pDst,
    uint32_t 	         numSamples 
);	

cmsis-dsp arm_cmplx_mag_f32

  • pSrc计算复数模的数组指针

  • pDst指定了计算结果存放的数组指针 — 输出双边对称幅值

  • numSamples需要计算复数模的数据个数

	arm_cfft_f32(p_arm_cfft, inputBuf, 0, 1); //FFT计算,FFT长度只能为128,256,512目前测试过这几个长度
	arm_cmplx_mag_f32(inputBuf, outputBuf.data(), detectWndPointNum);  //把运算结果复数求模得幅值,将FFT结果转换为幅度谱
直流分量

在频谱中,直流分量通常对应于频率为 0 Hz 的分量,其幅度表示了信号的直流偏移量。

直流分量通常只有实部而没有虚部,代表信号的平均值或偏移量,其在频域中的幅度为实数值,而不存在频率相位的概念,因此幅度的虚部为零

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值