傅里叶变换3

实数形式的离散傅里叶变换(real DFT)

上一章留了一个变换的实现形式的问题,其实这是一个双向过成,正变化和逆变换,在此我们先了解一些频率的知识

一、频域中关于频率的四种表示方法

1、序号表示法:根据时域中信号的样本数取0 ~N/2 ,用这种方法在程序中使用起来可以更直接地取得每种频率的幅度值,因为频率值跟数组的序号是一一对应的:X[K],取值范围是0~ N/2

2、分数表示法,根据时域中信号的样本数的比例值取0~0.5:X[?] ,?=k/n 取值范围是0-0.5

3、用弧度值来表示,把?乘以一个2π得到一个弧度值,这种表示方法叫做自然频率 X[W],w=2π?=2πk/N,取值范围是0~π

4、以赫兹的方式表示

二、DFT基本函数

ck[i] = cos(2πki/N)

sk[i] = sin (2πki/N)

其中k表示每个正余弦波的频率,如为2表示在0到N长度中存在的两个完整的周期,10即10和周期,如下图:

上图中每个波形的振幅是怎么计算出来的是是DFT比较重要的地方,比较难以理解。我们先把分解的正余弦波合成原始信号(反 DFT)

三、合成运算方法

DFT合成等式(合成原始时间信号,频率-->时间,逆向变换)

是不是对这个公式比较眼熟在第一节中的傅里叶级数很相似,看看下面这个公式:

不管第一个公式是怎么来的我们只要清楚傅里叶级数就可以了,把第一个公式作为一个工具拿来用就可以。 DFT合成等式中的Im X[k]和Re X[k]跟之前提到的Im X[k]和Re X[k]是不一样的,下面是转换方法(关于此公式的解释,见下文):

但k等于0和N/2时,实数部分的计算要用下面的等式:

上面四个式中的N是时域中点的总数,k是从0到N/2的序号。为什么要这样进行转换呢?这个可以从频谱密度(spectral density)得到理解,如下图就是个频谱图:、

这是一个频谱图,横坐标表示频率大小,纵坐标表示振幅大小,原始信号长度为N(这里是32),经DFT转换后得到的17个频率的频谱,频谱密度表示每单位带宽中为多大的振幅,那么带宽是怎么计算出来的呢?看上图,除了头尾两个,其余点的所占的宽度是2/N,这个宽度便是每个点的带宽,头尾两个点的带宽是1/N,而]Im X[k和Re X[k]表示的是频谱密度,即每一个单位带宽的振幅大小,但表示2/N(或1/N)带宽的振幅大小,所以 应当是Im X[k]和Re X[k]的2/N(或1/N)。频谱密度就象物理中物质密度,原始信号中的每一个点就象是一个混合物,这个混合物是由不同密度的物质组成的,混合物中含有的每种物质的质量是一样的,除了最大和最小两个密度的物质外,这样我们只要把每种物质的密度加起来就可以得到该混合物的密度了,又该混合物的质量是单位质量,所以得到的密度值跟该混合物的质量值是一样的。

如果已经得到了DFT结果,这时要进行逆转换,即合成原始信号,则可按如下步骤进行转换:

1、先根据上面四个式子计算得出的值:

2、再根据DFT合成等式得到原始信号数据

四、分解运算方法

有三种完全不同的方法进行DFT:一种方法是通过联立方程进行求解, 从代数的角度看,要从N个已知值求N个未知值,需要N个联立方程,且N个联立方程必须是线性独立的,但这是这种方法计算量非常的大且极其复杂,所以很少被采用;第二种方法是利用信号的相关性(correlation)进行计算,这个是我们后面将要介绍的方法;第三种方法是快速傅立叶变换(FFT),这是一个非常具有创造性和革命性的的方法,因为它大大提高了运算速度,使得傅立叶变换能够在计算机中被广泛应用,但这种算法是根据复数形式的傅立叶变换来实现的,它把N个点的信号分解成长度为N的频域,这个跟我们现在所进行的实域DFT变换不一样,而且这种方法也较难理解,这里我们先不去理解,等先理解了复数DFT后,再来看一下FFT。有一点很重要,那就是这三种方法所得的变换结果是一样的,经过实践证明,当频域长度为32时,利用相关性方法进行计算效率最好,否则FFT算法效率较高。现在就让我们来看一下相关性算法。

利用第一种方法、信号的相关性(correlation)可以从噪声背景中检测出已知的信号,我们也可以利用这个方法检测信号波中是否含有某个频率的信号波:把一个待检测信号波乘以另一个信号波,得到一个新的信号波,再把这个新的信号波所有的点进行相加,从相加的结果就可以判断出这两个信号的相似程度。如下图:

上面a和 b两个图是待检测信号波,图a很明显可以看出是个3个周期的正弦信号波,图b的信号波则看不出是否含有正弦或余弦信号,图c和d都是个3个周期的正弦信号波,图e和f分别是a、b两图跟c、d两图相乘后的结果,图e所有点的平均值是0.5,说明信号a含有振幅为1的正弦信号c,但图f所有点的平均值是0,则说明信号b不含有信号d。这个就是通过信号相关性来检测是否含有某个信号的方法。

第二种方法:相应地,我也可以通过把输入信号和每一种频率的正余弦信号进行相乘(关联操作),从而得到原始信号与每种频率的关联程度(即总和大小),这个结果便是我们所要的傅立叶变换结果,下面两个等式便是我们所要的计算方法:

第二个式子中加了个负号,是为了保持复数形式的一致,前面我们知道在计算Im X[k]时又加了个负号,所以这只是个形式的问题,并没有实际意义,你也可以把负号去掉,并在计算Im X[k]时也不加负号。

这里有一点必须明白一个正交的概念:两个函数相乘,如果结果中的每个点的总和为0,则可认为这两个函数为正交函数。要确保关联性算法是正确的,则必须使得跟原始信号相乘的信号的函数形式是正交的,我们知道所有的正弦或余弦函数是正交的,这一点我们可以通过简单的高数知识就可以证明它,所以我们可以通过关联的方法把原始信号分离出正余弦信号。当然,其它的正交函数也是存在的,如:方波、三角波等形式的脉冲信号,所以原始信号也可被分解成这些信号,但这只是说可以这样做,却是没有用的。

这只是在实域上的离散傅立叶变换,其中虽然也用到了复数的形式,但那只是个替代的形式,并无实际意义,现实中一般使用的是复数形式的离散傅立叶变换,且快速傅立叶变换是根据复数离散傅立叶变换来设计算法的,在后面我们先来复习一下有关复数的内容,然后再在理解实域离散傅立叶变换的基础上来理解复数形式的离散傅立叶变换

时间: 2024-10-09 00:09:42

傅里叶变换3的相关文章

补零与离散傅里叶变换的分辨率

离散傅里叶变换(DFT)的输入是一组离散的值,输出同样是一组离散的值.在输入信号而言,相邻两个采样点的间隔为采样时间Ts.在输出信号而言,相邻两个采样点的间隔为频率分辨率fs/N,其中fs为采样频率,其大小等于1/Ts,N为输入信号的采样点数.这也就是说,DFT的频域分辨率不仅与采样频率有关,也与信号的采样点数有关.那么,如果保持输入信号长度不变,但却对输入信号进行补零,增加DFT的点数,此时的分辨率是变还是不变? 答案是此时分辨率不变.从时域来看,假定要把频率相差很小的两个信号区分开来,直观上

傅里叶变换

http://blog.jobbole.com/70549/ 我保证这篇文章和你以前看过的所有文章都不同,这是 2012 年还在果壳的时候写的,但是当时没有来得及写完就出国了--于是拖了两年,嗯,我是拖延症患者-- 这篇文章的核心思想就是: 要让读者在不看任何数学公式的情况下理解傅里叶分析. 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式.但不幸的是,傅里叶分析的公式看起来太复杂了,所以很多大一新生上来就懵圈并从此对它深恶痛绝.老实说,这么有意思的东西居然成了大学

傅里叶变换--虚部的理解

傅里叶变换后,包含实部和虚部.当输入信号是纯实数,按照傅里叶变换的奇偶对称性质,有:输入信号中的偶对称分量变换为实部,奇对称分量变换为虚部.

傅里叶变换详解

1. 傅里叶变换的基本结论 (1)三角形式:任何函数都可以用三角形式(无穷多个累加,从1到无穷多个)来表达 (2)复数形式:三角函数和复数之间有一个关系:cosx=(e^ix+e^-ix)/2 sinx=(e^ix-e^-ix)/2 (欧拉公式) 所以 (3)傅里叶变换 >>相关阅读: 1. 傅里叶变换的由来及复数下的傅里叶变换公式证明 2. 傅立叶变换的推导(原文档排版有问题-此为经重新修正版本) 3. 傅里叶变换,如果看了此文你还不懂那就过来掐死我吧[完整版] 4. 傅里叶变换的目的:将值

[傅里叶变换及其应用学习笔记] 二十. 离散傅里叶变换的定义

DFT 离散傅里叶变换有定义如下 有离散信号$\underline{f}=\left( \underline{f}[0],\underline{f}[1],…,\underline{f}[N-1] \right)$,它的DFT是离散信号$\underline{\mathcal{F}f}\left( \underline{\mathcal{F}f}[0],\underline{\mathcal{F}f}[1],…,\underline{\mathcal{F}f}[N-1] \right)$ $\u

[傅里叶变换及其应用学习笔记] 十七. Ш函数

Ш函数的三个性质 上节课我们学习了$Ш_p$函数,其定义如下 $Ш_p = \displaystyle{ \sum_{k=-\infty}^{\infty}\delta(x-kp) }$     $Ш_p$函数有以下三个性质, 1) 采样性质,继承了$\delta$函数的采样性质 $f(x)Ш_p(x) = \displaystyle{ \sum_{k=-\infty}^{\infty}f(kp)\delta(x-kp) }$ 2) 周期性质,继承了$\delta$函数的移位性质 $(f*Ш_p

一维快速傅里叶变换代码

上一篇随笔,简要写了一下FFT中数组重新排序的算法.现在把完整的FFT代码分享给大家(有比较详细的注释). /*2015年11月10日于河北工业大学*/ #include <complex>#include <iostream.h>#include <math.h>#include <stdlib.h>const int N=8;      //数组的长度const double PI=3.141592653589793; //圆周率const double

codeforces #250E The Child and Binary Tree 快速傅里叶变换

题目大意:给定一个集合S,对于i=1...m求有多少二叉树满足每个节点的权值都在集合S中且权值和为i 构造答案多项式F(x)和集合S的生成函数C(x),那么 根节点的左子树是一棵二叉树,右子树是一棵二叉树,本身的权值必须在集合S中,此外还有空树的情况 故有F(x)=F2(x)C(x)+1 解得F(x)=1±1?4C(x)√2C(x)=21±1?4C(x)√ 若等式下方取减号则分母不可逆,舍去 得到F(x)=21+1?4C(x)√ 有关多项式求逆和多项式开根的内容参见Picks的博客 CF上每个点

傅里叶变换和频域滤波

傅里叶变换 #include "opencv2/opencv.hpp" using namespace cv; #define PI2 2*3.141592654 int main() { Mat image = imread("lena.png"); resize(image, image, Size(100,100)); cvtColor(image,image,CV_RGB2GRAY); imshow("src",image); image

实例:傅里叶变换

示例代码: #include <opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { // 1. 以灰度模式读取原始图并显示 Mat srcImage = imread("005.jpg", 0); if (!srcImage.data){ printf("input image error ! \n"); return fa