首页 > 其他分享 >离散傅里叶变换-DFT(FFT基础)

离散傅里叶变换-DFT(FFT基础)

时间:2022-09-27 21:36:26浏览次数:54  
标签:变换 DFT FFT 正弦波 信号 傅里叶 sin

 FFT(快速傅里叶变换)其本质就是DFT,只不过可以快速的计算出DFT结果,要弄懂FFT,必须先弄懂DFT,DFT(DiscreteFourier Transform) 离散傅里叶变换的缩写,咱们先来详细讨论DFT,因为DFT懂了之后,FFT就容易的多了

DFT(FFT)的作用:可以将信号从时域变换到频域,而且时域和频域都是离散的,通俗的说,可以求出一个信号由哪些正弦波叠加而成,求出的结果就是这些正弦波的幅度和相位,我们音乐播放器上面显示的就是音乐fft之后不同频率正弦波的幅度,就像下面这张图片:

里面的柱状高度就是正弦波的幅度

 

     那么为什么可以求出正弦波的幅度呢,这里就要说一下信号的相关性了,我们也可以利用信号的相关性检测信号波中是否含有某个频率的信号波:把一个待检测信号波乘以另一个信号波,个新的信号波,再把这个新的信号波所有的点进行相加,从相加的结果就可以判断出这两个信号的相似程度,比如下图:

 

 


 

 

        上图中a,b图是待检测信号,c,d是3个周期的正弦信号,很显然a图含有正弦波,e=a*c,将e图的各点相加,很显然值是正的,这就说明a图含频率为3的正弦波,f=b*d,显然将f图中各点相加结果约等于0了,说明b图不含有周期为3的正弦波,这就是dft的原理,也就是离散傅里叶变换的原理,其实就是这么简单,只不过dft将待检测信号和很多不同频率的正弦波和余弦波相乘,也就是进行了信号相关性检测,从而可以计算出信号中含有的正弦波的幅度,若含有此频率的正弦波,那么幅值不为0,若不含有此正弦波,那么幅值为0,那么幅值是如何计算出来的呢,幅值就是上面e图和f图各点之和(若是连续信号的话就是两信号乘积求积分了,。。额,不说积分,抽象了)

下面来看个具体的例子:

 

 

 

 

上面图一即为待检测信号,也就是将进行DFT变换的信号,将它分成16个离散的点,图2是一个频率为1的正弦波,也分成16个点,将对应的点相乘,得到图3,再将图3的各个点的幅值相加,结果为10.06,也就是说图1中的图像含有图2的正弦波,此时用到的dft点数就为16,10/(N/2)=10/8=1.25,含有的频率为1的正弦波的幅度就是1.25,以此类推,若要求是否含有频率为2的正弦波,将图1和频率为2的正弦波相乘再求和,。。。。

至于为什么要除以N/2,数字信号处理里面有讲,我就不多说了

     接下来就是dft的实现了:                  

   

 

 

   其中X(k)表示DFT变换后的数据,x(n)为采样的模拟信号,公式中的x(n)可以为复信号,实际当中x(n)都是实信号,即虚部为0,此时公式可以展开为:

 

 

     从这个公式可以看出,变换后的数据就是原信号对cos和sin的相关操作,即进行相乘求和(连续信号即为积分),为什么我要将n\N写在2k*pi后面呢?因为我觉得在对cos和sin进行相关操作时,k代表和频率为多少的正弦相关,而n和N则是在一个正弦周期内采样N个点,采样间隔为2*pi\N,,n用来步进,一次步进2*pi\N,最后进行累加求和,就得出了X(k),《实用数字信号处理》这本书的DFT章节详细的解释了此公式,并且还进行了举例,看了以后明白了不少,另外,DFT之后的数据是对称的,具体原因还是在那本书上面有,在FFT的章节。比如做8点DFT,采样信号为x(n),DFT之后的数据为X(k),那么X(0)为直流信号,X(1), X(2), X(3), X(5), X(6), X(7),关于X(4)对称,即X(1)=X(7), X(2)=X(6),X(3)=X(5),如下图,是对1+sin(2*PI)进行DFT变换,具体的幅值先不关心,只要知道它是对称的就行了。

 

 

 

 

接下来就是对公式写程序了,先将公式展开:

在计算机中可以这样展开:

 

 

 

里面有个j,不用管它,我们用两个数组,一个保存sin相关,一个保存cos相关,由于cos为实部,sin为虚部,可以定义以下两个数组:

float real[N];//用来保存cos相关。

float imag[N];//用来保存sin相关。

可以得到如下程序:

 

for(k=0;k<N;k++){
    for(n=0;n<N;n++){
         real[k] = real[k] + x[n] * cos(2*PI*k*n/N);
         imag[k] = imag[k] – x[n] * sin(2*PI*k*n/N);
    }
    
}

 

 

标签:变换,DFT,FFT,正弦波,信号,傅里叶,sin
From: https://www.cnblogs.com/54programer/p/16736053.html

相关文章

  • Python cv2(Opencv) Canny边缘检测 和 傅里叶变换
    OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量级而且高效,由一系列C函数和少......
  • fft4g模块解析-rdft
    rdft(LEN,1,databuf,ip,wfft)参数:LEN:原始数据长度1:正向rdft2:反向rdftdatabuf:原始数组ip:存储位翻转中用到的反向值wfft:存储三角函数值(cos/sin)输出(输入则相......
  • 傅里叶变换学习笔记
    教材信号与系统.AlanV.Oppenheim.第二版.西安交通大学出版社.1998博文傅里叶分析之掐死教程@知乎.韩昊视频形象展示傅里叶变换@3Blue1Brown......
  • 跟我学Python图像处理丨带你掌握傅里叶变换原理及实现
    摘要:傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪、图像增强等处理。本文分享自华为云社区《[Python图像处理]二十二.Python图像傅里叶变换原......
  • 离散傅里叶变换手工实现
    离散傅里叶变换手工实现importnumpyasnpimportmatplotlib.pyplotaspltimportcv2f=[[4,6],[2,9]]F=np.complex64(f)defdft(img,N):W=np.zeros((N,......
  • 可能是废话最多的 FFT 教程
    这是某不知名博主颓废之余的作品,篇幅可能很长,主要是力争自己以后忘了还可以看懂,也能引导其他读者(虽然可能没人看)不费脑子地看完(?)引入多项式是初中数学就接触的概念了,比如......
  • DFT常识知识概要
    DFT常识知识概要DFT是什么可测性设计,指的是在芯片原始设计中阶段即插入各种用于提高芯片可测试性(包括可控制性和可观测性)的硬件逻辑,通过这部分逻辑,生成测试向量,达到测试......
  • np.fft
    目录1.FFT知识2.np.fft.fft()3.np.fft.fft2()4.np.fft.fftfreq5.np.fft.fftshift6.np.fft.ifftshift1.FFT知识傅里叶变换(\(Fourier\Transform,FT\))是一种......
  • [笔记] 二维FFT
    假设现在有2个矩阵a和b,分别是n行m列和x行y列,现在你要计算它们的二维卷积,也就是求出矩阵s满足:\(s_{i,j}=\sum_{i'\leqi,j'\leqj}a_{i',j'}b_{i-i',j-j'}\)先把两个矩阵......
  • 【数论】FFT 的原理及 NTT
    慢慢填坑1.前言说起FFT,本人曾于大概一年前写过一篇相关的文章,但限于本人语文水平、理解程度等问题后来便废弃掉了,于是现在重新写一篇理解较为透彻的文章作为补漏。具体......