傅立叶变换—DFT
背景:最近看到实验室其他同学在用傅立叶变换解决问题,我也想通过并行来解决这个问题,所以看了一下傅立叶变换的东西,感觉涵盖的东西还能多,我只是初步做了一下了解(一定很片面,但是我主要是为了应用它,主要了解它的实现原理),据我理解:傅立叶分析使用一系列sin函数和cos函数表示一个连续函数。傅立叶变化就是一个将时间域的函数序列f(k)映射到频率域上的函数序列F(j)。序列f(k)表示一组信号采样的时间函数,序列F(j)表示傅立叶系数的分布,这个分布是关于频率的函数。
傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。
离散傅立叶变换(DFT)是一个矩阵-向量的乘积FNx,其中fij=wnij,(i,j从0到n),wn是单位元的第n个本原根。
复数知识回顾:
(1)单位1的n次复根是复数w,即wn=1;
(2)单位1的n次复根共有n个,即e2∏*i*k/n,其中k=1,2,...,n。
(3)用wn来表示复数e2∏*i/n,它是单位1的主n次方根。
(4)消去原理:对于任意整数n>=0,k>=0和d>0,有wdndk=wnk。
(5)对于任意偶数n>0,有wnn/2 = w2= -1
(6)等分引理:如果n为正偶数,单位1的n个n次方根的平方与它的(n/2)个n/2次方根是相同的。
DFT代码:
#include "stdio.h"
#include "math.h" typedef struct DFT
{
float real; //实部
float img; //inscribrer
}DFT; #define PI 3.1415926
#define LENGTH 4
int main()
{
DFT W[LENGTH][LENGTH],w[LENGTH+];
float var = /(float)LENGTH; w[].real = ;
w[].img = ;
w[].real = cos(var * PI);
w[].img = sin(var * PI); int i,j;
//初始化w0到wn-1的值
for(i=;i<=LENGTH;i++)
{
w[i].real = cos(var*i*PI);
w[i].img = sin(var*i*PI);
} for(i=;i<LENGTH;i++)
{
for(j=;j<LENGTH;j++)
{
int m = i * j;
if((i*j)<=LENGTH)
{
W[i][j].real = w[m].real;
W[i][j].img = w[m].img;
}
else
{
int n = m % LENGTH; //w具有周期性
W[i][j].real = w[n].real;
W[i][j].img = w[n].img;
}
}
}
/*
for(i=0;i<WIDTH;i++)
{
for(j=0;j<WIDTH;j++)
{
printf("%f\t",W[i][j].real);
}
printf("\n");
}
*/
// float a[WIDTH] = {1,2,3,4};
float a[LENGTH] = {,,,};
DFT result[LENGTH]; DFT sum;
//w矩阵与初始一维矩阵a相乘
for(i=;i<LENGTH;i++)
{
sum.real = ;
sum.img = ;
for(j=;j<LENGTH;j++)
{
sum.real += W[i][j].real * a[j];
sum.img += W[i][j].img * a[j];
}
result[i].real = sum.real;
result[i].img = sum.img;
} for(i=;i<LENGTH;i++)
{
if(result[i].real != )
{
printf("%3.1f",result[i].real);
}
if(result[i].img != 0.0 )
{
printf("+%3.1fi",result[i].img);
}
printf("\n");
}
}
时间复杂度:O(n2)
傅立叶变换—DFT的更多相关文章
- $\mathcal{FFT}$·$\mathcal{Fast \ \ Fourier \ \ Transformation}$快速傅立叶变换
\(2019.2.18upd:\) \(LINK\) 之前写的比较适合未接触FFT的人阅读--但是有几个地方出了错,大家可以找一下233 啊-本来觉得这是个比较良心的算法没想到这么抽搐这个算法真是将一 ...
- 离散傅立叶变换与快速傅立叶变换(DFT与FFT)
自从去年下半年接触三维重构以来,听得最多的词就是傅立叶变换,后来了解到这个变换在图像处理里面也是重点中的重点. 本身自己基于高数知识的理解是傅立叶变换是将一个函数变为一堆正余弦函数的和的变换.而图像处 ...
- 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换
写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...
- Matlab图像处理系列4———傅立叶变换和反变换的图像
注意:这一系列实验的图像处理程序,使用Matlab实现最重要的图像处理算法 1.Fourier兑换 (1)频域增强 除了在空间域内能够加工处理图像以外,我们还能够将图像变换到其它空间后进行处理.这些方 ...
- 傅立叶变换系列(五)快速傅立叶变换(FFT)
说明: 傅里叶级数.傅里叶变换.离散傅里叶变换.短时傅里叶变换...这些理解和应用都非常难,网上的文章有两个极端:“Esay” Or “Boring”!如果单独看一两篇文章就弄懂傅里叶,那说明你真 ...
- Matlab图像处理系列4———图像傅立叶变换与反变换
注:本系列来自于图像处理课程实验.用Matlab实现最主要的图像处理算法 1.Fourier变换 (1)频域增强 除了在空间域内能够加工处理图像以外.我们还能够将图像变换到其它空间后进行处理.这些方法 ...
- Win8 Metro(C#)数字图像处理--2.53图像傅立叶变换
原文:Win8 Metro(C#)数字图像处理--2.53图像傅立叶变换 [函数名称] 1,一维FFT变换函数 Complex[] FFT(Complex[] sourceDat ...
- 快速傅立叶变换(FFT)
多项式 系数表示法 设\(f(x)\)为一个\(n-1\)次多项式,则 \(f(x)=\sum\limits_{i=0}^{n-1}a_i*x_i\) 其中\(a_i\)为\(f(x)\)的系数,用这 ...
- 傅立叶变换—FFT
FFT(快速傅立叶变换)使用“分而治之”的策略来计算一个n阶多项式的n阶DFT系数的值.定义n为2的整数幂数,为了计算一个n阶多项式f(x),算法定义了连个新的n/2阶多项式,函数f[0](x)包含了 ...
随机推荐
- poj 3528 Ultimate Weapon (3D Convex Hull)
3528 -- Ultimate Weapon 一道三维凸包的题目,题目要求求出三维凸包的表面积.看懂了网上的三维凸包的代码以后,自己写的代码,跟网上的模板有所不同.调了一个晚上,结果发现错的只是数组 ...
- ubuntu netstat 查看端口占用情况
netstat 用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships ...
- Python 3.7.0 For Mac版软件安装教程附下载地址
https://www.jianshu.com/p/f02d6f01eba7
- H3C PAP验证配置示例
- java DOM 操作xml
1 代码如下: package dom.pasing; import java.io.IOException; import java.io.StringWriter; import javax.xm ...
- TensorFlow指定使用GPU 多块gpu
持续监控GPU使用情况命令: $ watch -n 10 nvidia-smi1一.指定使用某个显卡如果机器中有多块GPU,tensorflow会默认吃掉所有能用的显存, 如果实验室多人公用一台服务器 ...
- PHP IF判断 简写
第一种:IF 条件语句 第二种:三元运算 第三种:&& .|| 组成的条件语句 第一种: IF 基础,相信绝大多数人都会: 第二种: c=a>b ? true:false / ...
- C# 单例类
单例类 有时候我们不要在一个程序中创建太多的实例.只想用一个全局的实例和一个可以访问点.那么我们需要一个单例类. 因为是单例类啦,所以构造函数肯定是私有的. 需要了解的术语 懒汉式 顾名思义.什么时候 ...
- angular 全局常用指令
1.全局支持 enter快捷键触发事件 // 全局指令 app.directive('ngEnter', ['$window',"$timeout", ($window,$time ...
- P1064 连续自然数和
题目描述 对一个给定的自然数 M ,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为 M . 例子:1998+1999+2000+2001+2002=10000 ,所以从 1998 到 2 ...