直接上干货
一. 欧拉公式
二. 傅里叶变换
-
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 !!!
版权声明:本文为weixin_44678052原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。