Matlab中fft后的频谱幅度为什么要乘以2/N? 20
RT,在网上看了很多这方面的解释还是不明白,什么直流分量除以N,谐波分量除以N/2的什么采样点不同,幅值也不同,还有一些不是除以N/2而是除以fs(采样频率)等等这些问题...
RT,在网上看了很多这方面的解释还是不明白,什么直流分量除以N,谐波分量除以N/2的什么采样点不同,幅值也不同,还有一些不是除以N/2而是除以fs(采样频率)等等这些问题究竟是为什么,还有我自己也验证了直接fft后的频谱不用除以任何系数,它是满足帕塞瓦尔定理的,也就是说其频谱幅度根本不需要乘以2/N什么的,fft变化后取幅值abs(fft())就是其频谱的实际幅值!我是通过帕塞瓦尔定理来验证的,而如果乘以2/N后反而不满足帕塞瓦尔定理了,这个问题困惑我一两天了,其各位高手指点一下问题的真正原因,跪谢!
展开
4个回答
展开全部
不知你弄懂没有,这里我回答一下为什么要乘以2吧,至于为什么要除以N,我比较赞同上一个回答中用户dukinkin从积分角度来进行的理解。
以下是我对为什么要乘以2的理解,如果不对,请批评指正:
你所见到的乘以2的情景,大概是在MATLAB中fft函数的示例中,其中用到的信号是sin,比如我这里用A1=0.7, f1=50; A2=1, f2=200:X(t)=0.7sin(100*pi*t) + sin(400 * pi * t)。
不过,其实X(t)还可以表示为:
这个表示方法看起来比较绕,但是其实它在频域是比较直观的,由此可以理解:Y=fft(X); P2 = abs(Y/L);【这里的字母含义跟fft函数的说明文件中一样】得到的双侧振幅谱(如下图,我在运算中用到的基本参数为:采样频率1000,采样点数100)中,那几个尖脉冲就是0.35和0.5,即A1/2和A2/2
因此,在表示单侧振幅谱时,MATLAB示例想要弄成尖脉冲直接等于sin信号的幅值A1、A2的那种直观的形式,就乘2了
展开全部
其实除以N或除以N/2
来源于将连续的运算化为离散的运算
积分的时候一般积分符号后面的表达式是f(x)dx,
就是某个函数f(x)和自变量微分dx的乘积
而写成离散求和的时候通常只写f[n]的求和,略去了与dn相乘
可以遇见的是,某个函数f(x),如果我们用离散的办法去求其积分
随着采样点的则加,离散的和就会增大
实际上正确的办法是求和时要乘上采样的间隔,就是积分区间/N
对于很多离散的积分算法,例如卷积,最后结果都要除以采样点数N才能得到正确结果
而傅立叶变化也是一种积分变换,所以得到的结果就要除以N,才是正确的
而变换后的频谱通常将0频移到中间,分为对称的为正负频率(模对称,幅角反对称)
有时表示频谱的时候只需要用其一半正频率部分就够了
所以除以N之后还要乘以2,表示把正负频率的加在一起
而0频的直流分量,本身在对称点,已经是正负相加过的,所以只用除以N
来源于将连续的运算化为离散的运算
积分的时候一般积分符号后面的表达式是f(x)dx,
就是某个函数f(x)和自变量微分dx的乘积
而写成离散求和的时候通常只写f[n]的求和,略去了与dn相乘
可以遇见的是,某个函数f(x),如果我们用离散的办法去求其积分
随着采样点的则加,离散的和就会增大
实际上正确的办法是求和时要乘上采样的间隔,就是积分区间/N
对于很多离散的积分算法,例如卷积,最后结果都要除以采样点数N才能得到正确结果
而傅立叶变化也是一种积分变换,所以得到的结果就要除以N,才是正确的
而变换后的频谱通常将0频移到中间,分为对称的为正负频率(模对称,幅角反对称)
有时表示频谱的时候只需要用其一半正频率部分就够了
所以除以N之后还要乘以2,表示把正负频率的加在一起
而0频的直流分量,本身在对称点,已经是正负相加过的,所以只用除以N
追问
先谢谢你的回答,和网上的解释大致都差不多,但如果除以N或者N/2后就不满足帕塞瓦尔定理了,这又该如何解释呢?
追答
应该是哪里定义的问题
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实除以N或除以N/2
来源于将连续的运算化为离散的运算
积分的时候一般积分符号后面的表达式是f(x)dx,
就是某个函数f(x)和自变量微分dx的乘积
而写成离散求和的时候通常只写f[n]的求和,略去了与dn相乘
可以遇见的是,某个函数f(x),如果我们用离散的办法去求其积分
随着采样点的则加,离散的和就会增大
实际上正确的办法是求和时要乘上采样的间隔,就是积分区间/N
对于很多离散的积分算法,例如卷积,最后结果都要除以采样点数N才能得到正确结果
而傅立叶变化也是一种积分变换,所以得到的结果就要除以N,才是正确的
而变换后的频谱通常将0频移到中间,分为对称的为正负频率(模对称,幅角反对称)
有时表示频谱的时候只需要用其一半正频率部分就够了
所以除以N之后还要乘以2,表示把正负频率的加在一起
而0频的直流分量,本身在对称点,已经是正负相加过的,所以只用除以N.
来源于将连续的运算化为离散的运算
积分的时候一般积分符号后面的表达式是f(x)dx,
就是某个函数f(x)和自变量微分dx的乘积
而写成离散求和的时候通常只写f[n]的求和,略去了与dn相乘
可以遇见的是,某个函数f(x),如果我们用离散的办法去求其积分
随着采样点的则加,离散的和就会增大
实际上正确的办法是求和时要乘上采样的间隔,就是积分区间/N
对于很多离散的积分算法,例如卷积,最后结果都要除以采样点数N才能得到正确结果
而傅立叶变化也是一种积分变换,所以得到的结果就要除以N,才是正确的
而变换后的频谱通常将0频移到中间,分为对称的为正负频率(模对称,幅角反对称)
有时表示频谱的时候只需要用其一半正频率部分就够了
所以除以N之后还要乘以2,表示把正负频率的加在一起
而0频的直流分量,本身在对称点,已经是正负相加过的,所以只用除以N.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不知道你现在弄明白没。
MATLAB里面的FFT函数,用的是复数形式的fourier公式计算方法,返回的值是Cn。但是注意,这个Cn跟三角函数形式的fourier公式里的Cn意义不一样。前者中的Cn表示的直接就是振幅,即an与bn的平方和开平方,后者与模(an与bn的平方和开平方)相差2/N倍数。所以你如果用三角形式的fourier公式直接编程,返回Cn,能直接得到振幅,而用MATLAB自带函数FFT得到的要*2/N。。。可能几句话也讲不明白,就这样给你个思路,如果非要弄明白,你自己可以仔细看看高数里面两个Cn与an、bn的关系,自己试着推导一下。
如果有什么看法,可以再交流。
MATLAB里面的FFT函数,用的是复数形式的fourier公式计算方法,返回的值是Cn。但是注意,这个Cn跟三角函数形式的fourier公式里的Cn意义不一样。前者中的Cn表示的直接就是振幅,即an与bn的平方和开平方,后者与模(an与bn的平方和开平方)相差2/N倍数。所以你如果用三角形式的fourier公式直接编程,返回Cn,能直接得到振幅,而用MATLAB自带函数FFT得到的要*2/N。。。可能几句话也讲不明白,就这样给你个思路,如果非要弄明白,你自己可以仔细看看高数里面两个Cn与an、bn的关系,自己试着推导一下。
如果有什么看法,可以再交流。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询