频谱的横坐标是频率,纵坐标表示该频率下的振幅
功率谱是以频率为自变量的函数,代表原始时域信号中包含的每个频段的功率(单位时间的能量)
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
);
-
结构
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
);
-
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 的分量,其幅度表示了信号的直流偏移量。
直流分量通常只有实部而没有虚部,代表信号的平均值或偏移量,其在频域中的幅度为实数值,而不存在频率相位的概念,因此幅度的虚部为零