#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
/*

/
#define PI 3.14159265

#define N 4095 //采样256次
/
**定义结构体****/
typedef struct
{
double
real;/*实部*/
double
img;/*虚部*/
}complex;
/*输出序列的值*/
complex x[N * 2], W;

/
***建立运算类测试类***/
class test {
public:
void add(complex a, complex b, complex *c);
void sub(complex a, complex b, complex *c);
void mul(complex a, complex b, complex *c);
void divi(complex a, complex b, complex *c);
void initW(int size);
void changex(int size);
void fftx();
void output();
};
void test:: add(complex a, complex b, complex *c) // 复数加运算
{
c->real = a.real + b.real;

``````c->img = a.img + b.img;
``````

}
void test:: sub(complex a, complex b, complex *c) // 复数减运算

{
c->real = a.real - b.real;

``````c->img = a.img - b.img;
``````

}
void test:: mul(complex a, complex b, complex *c) //复数乘运算

{

``````c->real = a.real*b.real - a.img*b.img;

c->img = a.real*b.img + a.img*b.real;
``````

}
void test::divi(complex a, complex b, complex *c) // 复数除运算

{

``````c->real = (a.real*b.real + a.img*b.img) / (b.real*b.real + b.img*b.img);

c->img = (a.img*b.real - a.real*b.img) / (b.real*b.real + b.img*b.img);
``````

}
/***欧拉公式运算****/
void test:: initW(int size)
{

``````int i;
W = (complex*)malloc(sizeof(complex)* size);    //分配内存空间

for
(i = 0; i<size; i++)

{

W[i].real = cos(2 * PI / size * i);

W[i].img = -1 * sin(2 * PI / size * i);

}
``````

}
/**变址运算**/
void test:: changex(int size)

{

``````complex temp;

unsigned int i = 0, j = 0, k = 0;

double t;

for(i = 0; i<size; i++)
{

k = i; j = 0;

t = (log(size) / log(2));

while((t--)>0)
{
j = j << 1;
j |= (k & 1);
k = k >> 1;
}

if(j>i)
{

temp = x[i];
x[i] = x[j];
x[j] = temp;
}

}
``````

}
void test:: fftx() //快速傅里叶函数

{

``````long int  i = 0, j = 0, k = 0, l = 0;
complex up, down, product;
changex(N);

for(i = 0; i<log(N) / log(2); i++) /*一级蝶形运算*/
{

l = 1 << i;
for (j = 0; j < N; j += 2 * l) /*一组蝶形运算*/
{
for (k = 0; k < l; k++) /*一个蝶形运算*/
{

mul(x[j + k + l], W[N*k / 2 / l], &product);
add(x[j + k], product, &up);
sub(x[j + k], product, &down);
x[j + k] = up;
x[j + k + l] = down;
}
}
}
``````

}
void test::output() /*输出x结果*/

{
int i;
cout << "\nx傅里叶变换结果\n" << endl;
for(i = 0; i {
if(i % 4 == 0 && i != 0)
cout cout if(x[i].img >= 0.0001)
cout<<x[i].img<<endl;
else
if (fabs(x[i].img)<0.0001)
cout<<"+0.0000j "<<endl;
else

``````            cout<< x[i].img<<endl;
}
cout<<"\n"<<endl;
``````

}

int main()
{
test si;
clock_t
start = clock();
double duration;
/*对x进行傅里叶变换*/
int i, j = 0, t = 0;
double data[N * 2] = { 0 };
double result[N * 2] = { 0 };
float tx = 0;
for(t = 0; t < N; t++)
{
data[t] = 5 + 7 * cos(30 * PI / 128 * t - 30 * PI / 180) + 3 * cos(80 * PI / 128 * t - 90 * PI / 180);
}
for(i = 0; i<N; i++) //求出x的256个采样点的值 下一步傅里叶变化
{
x[i].real = data[i];
x[i].img = 0;
}
si.initW(N);
si.fftx();
cout << "输出信号的模";
cout << endl;
for(i = 0; i < N; i++)
{
result[i] = sqrt(x[i].real*x[i].real + x[i].img*x[i].img);
if(i % 4 == 0)
cout << endl;
cout << setprecision(2) << result[i] / N * 2 << " ";
}
clock_t
end = clock();
cout << "所用的时间： ";
duration = (double)(end - start) / CLOCKS_PER_SEC;
cout << duration << "ms";
cout << endl;
return 0;
}

1个回答

#include <stdio.h> #include <math.h> #include <stdlib.h> #include <iostream> #include <fstream> #include <vector> #include <ctime> #include <iomanip> using namespace std; /* 利用傅里叶变换的算法计算复数问题 */ #define PI 3.14159265 #define N 4095 //采样256次 /***定义结构体****/ typedef struct { double real;/*实部*/ double img;/*虚部*/ }complex; /*输出序列的值*/ complex x[N * 2], *W; /****建立运算类测试类***/ class test { public: void add(complex a, complex b, complex *c); void sub(complex a, complex b, complex *c); void mul(complex a, complex b, complex *c); void divi(complex a, complex b, complex *c); void initW(int size); void changex(int size); void fftx(); void output(); }; void test:: add(complex a, complex b, complex *c) // 复数加运算 { c->real = a.real + b.real; c->img = a.img + b.img; } void test:: sub(complex a, complex b, complex *c) // 复数减运算 { c->real = a.real - b.real; c->img = a.img - b.img; } void test:: mul(complex a, complex b, complex *c) //复数乘运算 { c->real = a.real*b.real - a.img*b.img; c->img = a.real*b.img + a.img*b.real; } void test::divi(complex a, complex b, complex *c) // 复数除运算 { c->real = (a.real*b.real + a.img*b.img) / (b.real*b.real + b.img*b.img); c->img = (a.img*b.real - a.real*b.img) / (b.real*b.real + b.img*b.img); } /***欧拉公式运算****/ void test:: initW(int size) { int i; W = (complex*)malloc(sizeof(complex)* size); //分配内存空间 for (i = 0; i<size; i++) { W[i].real = cos(2 * PI / size * i); W[i].img = -1 * sin(2 * PI / size * i); } } /**变址运算**/ void test:: changex(int size) { complex temp; unsigned int i = 0, j = 0, k = 0; double t; for(i = 0; i<size; i++) { k = i; j = 0; t = (log(size) / log(2)); while((t--)>0) { j = j << 1; j |= (k & 1); k = k >> 1; } if(j>i) { temp = x[i]; x[i] = x[j]; x[j] = temp; } } } void test:: fftx() //快速傅里叶函数 { long int i = 0, j = 0, k = 0, l = 0; complex up, down, product; changex(N); for(i = 0; i<log(N) / log(2); i++) /*一级蝶形运算*/ { l = 1 << i; for (j = 0; j < N; j += 2 * l) /*一组蝶形运算*/ { for (k = 0; k < l; k++) /*一个蝶形运算*/ { mul(x[j + k + l], W[N*k / 2 / l], &product); add(x[j + k], product, &up); sub(x[j + k], product, &down); x[j + k] = up; x[j + k + l] = down; } } } } void test::output() /*输出x结果*/ { int i; cout << "\nx傅里叶变换结果\n" << endl; for(i = 0; i<N; i++) { if(i % 4 == 0 && i != 0) cout<<"\n"<<endl; cout<<x[i].real<<endl; if(x[i].img >= 0.0001) cout<<x[i].img<<endl; else if (fabs(x[i].img)<0.0001) cout<<"+0.0000j "<<endl; else cout<< x[i].img<<endl; } cout<<"\n"<<endl; } int main() { test si; clock_t start = clock(); double duration; /*对x进行傅里叶变换*/ int i, j = 0, t = 0; double data[N * 2] = { 0 }; double result[N * 2] = { 0 }; float tx = 0; for(t = 0; t < N; t++) { data[t] = 5 + 7 * cos(30 * PI / 128 * t - 30 * PI / 180) + 3 * cos(80 * PI / 128 * t - 90 * PI / 180); } for(i = 0; i<N; i++) //求出x的256个采样点的值 下一步傅里叶变化 { x[i].real = data[i]; x[i].img = 0; } si.initW(N); si.fftx(); cout << "输出信号的模"; cout << endl; for(i = 0; i < N; i++) { result[i] = sqrt(x[i].real*x[i].real + x[i].img*x[i].img); if(i % 4 == 0) cout << endl; cout << setprecision(2) << result[i] / N * 2 << " "; } clock_t end = clock(); cout << "所用的时间： "; duration = (double)(end - start) / CLOCKS_PER_SEC; cout << duration << "ms"; cout << endl; return 0; }
《MySQL 性能优化》之理解 MySQL 体系结构

python爬取百部电影数据，我分析出了一个残酷的真相
2019年就这么匆匆过去了，就在前几天国家电影局发布了2019年中国电影市场数据，数据显示去年总票房为642.66亿元，同比增长5.4%；国产电影总票房411.75亿元，同比增长8.65%，市场占比 64.07%；城市院线观影人次17.27亿，同比增长0.64%。 看上去似乎是一片大好对不对？不过作为一名严谨求实的数据分析师，我从官方数据中看出了一点端倪：国产票房增幅都已经高达8.65%了，为什...

Windows可谓是大多数人的生产力工具，集娱乐办公于一体，虽然在程序员这个群体中都说苹果是信仰，但是大部分不都是从Windows过来的，而且现在依然有很多的程序员用Windows。 所以，今天我就把我私藏的Windows必装的软件分享给大家，如果有一个你没有用过甚至没有听过，那你就赚了????，这可都是提升你幸福感的高效率生产力工具哦！ 走起！???? NO、1 ScreenToGif 屏幕，摄像头和白板...

C语言荣获2019年度最佳编程语言

Idea 中最常用的10款插件（提高开发效率），一定要学会使用！

AI 没让人类失业，搞 AI 的人先失业了

2020年，冯唐49岁：我给20、30岁IT职场年轻人的建议

B站是个宝，谁用谁知道???? 作为一名大学生，你必须掌握的一项能力就是自学能力，很多看起来很牛X的人，你可以了解下，人家私底下一定是花大量的时间自学的，你可能会说，我也想学习啊，可是嘞，该学习啥嘞，不怕告诉你，互联网时代，最不缺的就是学习资源，最宝贵的是啥？ 你可能会说是时间，不，不是时间，而是你的注意力，懂了吧！ 那么，你说学习资源多，我咋不知道，那今天我就告诉你一个你必须知道的学习的地方，人称...

【蘑菇街技术部年会】程序员与女神共舞，鼻血再次没止住。（文末内推）

Java校招入职华为，半年后我跑路了

Python全栈 Linux基础之3.Linux常用命令
Linux对文件（包括目录）有很多常用命令，可以加快开发效率：ls是列出当前目录下的文件列表，选项有-a、-l、-h，还可以使用通配符；c功能是跳转目录，可以使用相对路径和绝对路径；mkdir命令创建一个新的目录，有-p选项，rm删除文件或目录，有-f、-r选项；cp用于复制文件，有-i、-r选项，tree命令可以将目录结构显示出来（树状显示），有-d选项，mv用来移动文件/目录，有-i选项；cat查看文件内容，more分屏显示文件内容，grep搜索内容；>、>>将执行结果重定向到一个文件；|用于管道输出。
​两年前不知如何编写代码的我，现在是一名人工智能工程师

loonggg读完需要5分钟速读仅需 2 分钟大家好，我是你们的校长。我知道大家在家里都憋坏了，大家可能相对于封闭在家里“坐月子”，更希望能够早日上班。今天我带着大家换个思路来聊一个问题...

Spring框架|JdbcTemplate介绍

B 站上有哪些很好的学习资源?

24岁的程序员，还在未来迷茫，不知道能不能买得起房子

2万字Java并发编程面试题合集（含答案，建议收藏）
Java 并发编程 1、在 java 中守护线程和本地线程区别？ 2、线程与进程的区别？ 3、什么是多线程中的上下文切换？ 4、死锁与活锁的区别，死锁与饥饿的区别？ 5、Java 中用到的线程调度算法是什么？ 6、什么是线程组，为什么在 Java 中不推荐使用？ 7、为什么使用 Executor 框架？ 8、在 Java 中 Executor 和 Executors 的区别？ 9...
2020年，最适合AI的5种编程语言