python3的fft_科学网—用Python、Matlab、C实现傅立叶变换FFT() - 康建的博文
一、Python,使用numpy.fft.fft或scipy的fftpack.fft:
import numpy as np
t=np.array([0.300, 0.550, 1.119, 0.538, 0.857, 1.069, 0.369, 0.206, 1.000,
0.550, 1.119, 1.538, 1.557, 1.069, 1.369, 0.606])
ff=np.fft.fft(t)
print(ff)
from scipy import fftpack
f=fftpack.fft(t)
for i in f:
print("{0.real:.4f}{0.imag:+.4f}j".format(i))
输出结果:
[ 1.38160000e+01+0.j -6.02483817e-03+2.48405969j
-2.74175981e+00-0.65980613j -3.30153876e-01-0.00602484j
-2.62000000e-01-0.35j -2.48405969e+00-0.0202384j
5.13759810e-01+0.34019387j 2.02384005e-02-0.33015388j
1.56400000e+00+0.j 2.02384005e-02+0.33015388j
5.13759810e-01-0.34019387j -2.48405969e+00+0.0202384j
-2.62000000e-01+0.35j -3.30153876e-01+0.00602484j
-2.74175981e+00+0.65980613j -6.02483817e-03-2.48405969j]
13.8160+0.0000j
-0.0060+2.4841j
-2.7418-0.6598j
-0.3302-0.0060j
-0.2620-0.3500j
-2.4841-0.0202j
0.5138+0.3402j
0.0202-0.3302j
1.5640+0.0000j
0.0202+0.3302j
0.5138-0.3402j
-2.4841+0.0202j
-0.2620+0.3500j
-0.3302+0.0060j
-2.7418+0.6598j
-0.0060-2.4841j
二、用Matlab:
A=[0.300; 0.550; 1.119; 0.538; 0.857; 1.069; 0.369; 0.206; 1.000;0.550; 1.119; 1.538; 1.557; 1.069; 1.369; 0.606]
B=fft(A)
输出:
B =
13.8160
-0.0060 + 2.4841i
-2.7418 - 0.6598i
-0.3302 - 0.0060i
-0.2620 - 0.3500i
-2.4841 - 0.0202i
0.5138 + 0.3402i
0.0202 - 0.3302i
1.5640
0.0202 + 0.3302i
0.5138 - 0.3402i
-2.4841 + 0.0202i
-0.2620 + 0.3500i
-0.3302 + 0.0060i
-2.7418 + 0.6598i
-0.0060 - 2.4841i
三、用C语言
// fft20200202.cpp : kangjian, console application.
#include "stdafx.h"
#include
#include
#define PI 3.1415926535
typedef struct{ double R; double I;
}COMPLEX;
COMPLEX add(COMPLEX a,COMPLEX b)
{ COMPLEX c;
c.R=a.R+b.R; c.I=a.I+b.I; return c;
}
COMPLEX sub(COMPLEX a,COMPLEX b)
{ COMPLEX c;
c.R=a.R-b.R; c.I=a.I-b.I; return c;
}
COMPLEX mul(COMPLEX a,COMPLEX b)
{ COMPLEX c;
c.R=a.R*b.R-a.I*b.I; c.I=a.R*b.I+b.R*a.I;
return c;
}
int nx(int k,int p)
{ int q,t=0;
for(q=0;q
if((1<
t+=1<
return t;
}
void kj_FFT(COMPLEX *T,COMPLEX *F,int p)
{ int N,q,k,r,j,i,t;
COMPLEX *A1,*A2, *W;
double a;
N=1<
A1=(COMPLEX *)malloc(sizeof(COMPLEX)*N);
A2=(COMPLEX *)malloc(sizeof(COMPLEX)*N);
W =(COMPLEX *)malloc(sizeof(COMPLEX)*N/2);
for(i=0;i
A1[i]=T[i];
for(i=0;i
{ a=-i*2*PI/N;
W[i].R=cos(a);
W[i].I=sin(a);
}
for(q=0;q
{for(k=0;k<1<
{ r=1<
for(j=0;j
{ t=k*( 1<
A2[j+t] =add(A1[j+t], mul(A1[j+t+r],W[ nx((j+t)>>(p-q-1),p)]) );//
A2[j+t+r]=sub(A1[j+t], mul(A1[j+t+r],W[ nx((j+t)>>(p-q-1),p)]) );
}
}
for(i=0;i
A1[i]=A2[i];
}
for(i=0;i
{
F[i].R=A2[nx(i,p)].R/N;
F[i].I=A2[nx(i,p)].I/N;
}
}
int testfft()
{ int n=16,i,p=4;
double y[16]={0.300, 0.550, 1.119, 0.538, 0.857, 1.069, 0.369, 0.206, 1.000,
0.550, 1.119, 1.538, 1.557, 1.069, 1.369, 0.606};
COMPLEX *pT,*pF;
pT=(COMPLEX *)malloc(sizeof(COMPLEX)*n);//no free
pF=(COMPLEX *)malloc(sizeof(COMPLEX)*n);
for(i=0;i
{ pT[i].R=y[i];
pT[i].I=0.;
}
kj_FFT(pT,pF,p);
for(i=0;i
{ pF[i].R=pF[i].R*n; // python,no /N,
pF[i].I=pF[i].I*n;
printf("%.4lf,%+.4lfj\n" ,pF[i].R, pF[i].I );
}
return 0;
}
int main(int argc, char* argv[])
{ testfft();
return 0;
}
输出结果:
13.8160,+0.0000j
-0.0060,+2.4841j
-2.7418,-0.6598j
-0.3302,-0.0060j
-0.2620,-0.3500j
-2.4841,-0.0202j
0.5138,+0.3402j
0.0202,-0.3302j
1.5640,+0.0000j
0.0202,+0.3302j
0.5138,-0.3402j
-2.4841,+0.0202j
-0.2620,+0.3500j
-0.3302,+0.0060j
-2.7418,+0.6598j
-0.0060,-2.4841j
C语言不容易调试,一但编写成功,速度和可用性还是有优势的。
转载本文请联系原作者获取授权,同时请注明本文来自康建科学网博客。
链接地址:http://blog.sciencenet.cn/blog-797552-1216569.html
上一篇:让EXCEL帮你念成绩单,录入校对
下一篇:准备上网课时用到的小程序段
python3的fft_科学网—用Python、Matlab、C实现傅立叶变换FFT() - 康建的博文相关推荐
- c语言 奥数题目及答案,科学网—C语言做一道小学奥数题 - 康建的博文
见过一道小学奥数题,记得题目是:从5月1日到7月1日数字0-9无重复的时间有多少个?(如0512142804是05月12日14:28:04,其中0.1.4有重复, 0526174839无重复). 大概 ...
- c语言 奥数题目及答案,科学网-C语言做一道小学奥数题-康建的博文
见过一道小学奥数题,记得题目是:从5月1日到7月1日数字0-9无重复的时间有多少个?(如0512142804是05月12日14:28:04,其中0.1.4有重复, 0526174839无重复). 大概 ...
- python的安装包下载_科学网—[转载]python常用的安装包下载 - 林清莹的博文
Python常用的安装包下载 1.首先应该下载dlib安装包(例如:dlib-19.8.1-cp36-cp36m-win_amd64.whl) 可以通过此网址进行下载对应的dlib包 https: ...
- 如何用python爬视频_科学网—利用python爬取一个小视频 - 李鸿斌的博文
工具 : requests 库 解析: beautifulsoup 任务: 视频抓取 1,分析目标网站 寻找一个虚拟的头文件 User-Agent: Mozilla/5.0 (Windows NT 6 ...
- matlab回归分析结果输出,科学网—回归分析的MATLAB和R程序实现 - 王福昌的博文...
前面博客中已经讲过MATLAB中常用的命令拟合polyfit() , lsqcurvefit() ,nlinfit() 和 cftool等,这里简单介绍简单的回归分析的MATLAB和R语言实现. 例 ...
- 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换?
https://www.douban.com/note/164400821/ 写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!! ...
- 【转】为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换?...
写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...
- 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换
[纯技术帖]为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换来源: 陈诚--WECN的日志 写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,内容 ...
- 傅立叶变换的原理、意义以及如何用Matlab实现快速傅立叶变换
本帖最后由 xiaoliu 于 2011-7-28 21:00 编辑 一.傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象 ...
最新文章
- 广东科技学院专插本c语言考卷_广东科技学院第二届红色文化节之红色影视经典配音大赛决赛...
- 自定义notebook扩展插件_Jupyter notebook安装扩展插件
- Metasploit advanced命令使用技巧
- linux c 常用函数
- DB2 导入导出总结
- HDU 1506 Largest Rectangle in a Histogram(dp、单调栈)
- matlab循环遍历数组_Matlab - 访问for循环中最大值的索引,并使用它从数组中删除值...
- webview 防止js注入_天台县js聚合物水泥防水涂料的作用
- matlab 散点图 线性回归图_吴恩达机器学习编程作业ex1-Matlab版
- android权限检查
- matlab编写LDA,lda算法matlab实现
- 公路护栏设计技术简析
- android studio 官方虚拟机,Android Studio 移动虚拟机
- 点, 直线, 平面的位置关系剩余部分快速学习笔记
- 1th matlab与遗传算法工具箱
- spi通信问题-有波形但无法获取正确数据:MOSI和SCK
- mscbsc移动通信论坛_中国移动5G资费被确认,流量低至1毛/G, 联通电信又被动,网友:良心价...
- 损坏的映像 错误0xc0000020
- Error handling response: TypeError: Cannot read property ‘1‘ of null
- 区间再现公式的理解与应用