直接上干货
一. 欧拉公式
二. 傅里叶变换
- N为采样的总个数,也就是样本的总个数
- 应用欧拉公式
三. 傅里叶逆变换
- 公式
四. c++编程实现
#include<iostream> #include<cmath> #include<iomanip> using namespace std; #define PI 3.1415926535 class FFT { private: double real[8], imag[8]; double re[8], im[8]; int i = 0; public: FFT() {}; void init(); void print(); void fft(); void ifft(); }; void FFT::init() { for (int i = 1; i < 9; i++) real[i-1] = double(i), imag[i-1] = 0.0; } void FFT::print() { if (i==0) cout << "原始数据" << endl; i++; for (int i = 0; i < 8; i++) cout << real[i] << " " << imag[i] << endl; } void FFT::fft() { double a=0, b=0; for (int i = 0; i < 8; i++) { a = 0; b = 0; for (int j = 0; j < 8; j++) { a += real[j] * cos((2 * PI*i*j) / 8); b += real[j] * sin((2 * PI*i*j) / 8); } re[i] = a; im[i] = -b; } cout << "变换后的数据" << endl; for (int i = 0; i < 8; i++) { cout << re[i] << " " <<setiosflags(ios::fixed)<<setprecision(10)<< im[i] << endl; } } void FFT::ifft() { double a = 0, b = 0; for (int i = 0; i < 8; i++) { a = 0; b = 0; for (int j = 0; j < 8; j++) { a += re[j] * cos((i*j * 2 * PI) / 8) - im[j] * sin((i*j * 2 * PI) / 8); b += im[j] * cos((i*j * 2 * PI) / 8) + re[j] * sin((i*j * 2 * PI) / 8); } real[i] = a / 8; imag[i] = b / 8; } } int main() { FFT a; a.init(); a.print(); a.fft(); a.ifft(); cout << "逆变换后的数据" << endl; a.print(); return 0; }
程序结果
刚开始学,理解程度不够,只能写一下公式,程序,哎。O(∩_∩)O哈哈~
Thank for your reading !!!
公众号:FPGA之旅