FFT变换,一遍文章入门上手
前言
目前`FFT用于频域的特征值,相似性,幅值和相位的判断。用的开发环境是Arduino 2.3.2,arduinoFFT库用的是1.5.6版[]建议先阅读这篇文章的前半段(http://www.ilovematlab.cn/thread-119939-1-1.html)。
对实时检测到的波形或者数组,进行FFT变换,得出频域图像,基波,相位,对该现测波形进行处理。
提示:以下是本篇文章正文内容,下面案例可供参考
一、本程序作用是什么?
示例:得出FFT之后的幅度值,可得出现测时域波形的频域波形图。
二、使用步骤
1.引入库
代码如下(示例):
本人现测数组是171个,采样率8533.(3)。采样点数需要2的次方,不然会在开始FFT变换那卡住,但不会报错,只会后面输出的数组是空的。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "arduinoFFT.h"
#include "BCStData.h"
#define SAMPLES 171 // 样本数
#define fftn 512 // 定义采样点数
#define Fs 8533.333333 // 定义采样率
#define PI 3.14159265358979323846
arduinoFFT FFT = arduinoFFT(); // 创建FFT对象
double vReal[fftn]; // 实部数组
double vImag[fftn]; // 虚部数组
double AnFd[fftn]; // 创建幅度数组
void setup() {
// 初始化串口通信
Serial.begin(115200);
while (!Serial);
for(int i = 0; i < SAMPLES; i++){
vReal[i] = BCStData[i] * 0.54 - 0.46 * cos(2 * PI * i / (SAMPLES - 1)); // 汉宁窗函数的应用
vImag[i] = 0; // 虚部数组初始化为0
}
for(int i = 0; i < SAMPLES; i++){
vReal[i] = BCStData[i]; // 将数据从BCStData复制到实部数组
vImag[i] = 0; // 虚部数组初始化为0
}
for(int i = SAMPLES; i < fftn; i++){
vReal[i] = 0;
vImag[i] = 0;
}
// 执行 FFT
FFT.Compute(vReal, vImag, fftn, FFT_FORWARD);
for (int i = 0; i < fftn; i++) {
AnFd[i] =2*sqrt(vReal[i] * vReal[i] + vImag[i] * vImag[i])/fftn;
}
Serial.println("变换后的幅度数组:");
for (int i = 0; i < fftn; i++) {
Serial.print(AnFd[i]);
Serial.print(", ");
}
Serial.println();
delay(1000); // 延迟1秒再次执行
}
void loop() {
}
2.读入数据
代码如下(示例):
FFT.Compute(vReal, vImag, fftn, FFT_FORWARD);
开始FFT之前,要对虚部初始化,实部数组等于输入的数组,窗函数会对输出的数组造成干扰,加了是因为这个程序里没有的话输出的是nan。
现测波形取零点依据测量电压,但是还是会存在零点偏移的情况。
总结
之后本人会持续更新,总的来说FFT还是应用很广泛的。