新手求助:sinc函数采样后做FFT出来的诡异结果
本来只是验证一下自己的FFT程序的,用的是Mahtematica6.0,结果发现了一个怎么也想不明白的问题。输入数据:
也就是下边列出的数据,右边的图中红色就是采样点:
然后做傅里叶变换:
****这里设置的变换参数是{a,b}={1,-1},它的含义是定义DFT为DFT[{Ur}]=,{a,b}={1,-1}就是一般的信号处理里的DFT定义。
注意看,DFT的结果居然如表中所列
看。。。按理说,sinc函数的FT结果是一个矩形函数,可是这里却出现了正负交替的现象,结果中第一点是2.5,第二点本也该是2.5的却变成了-2.5。我这里的采样周期是0.2,不会造成混叠,这点从图中也可以看出————但是,为什么结果会是正负交替的呢???我尝试过增加采样频率和采样时间,结果还是这样。。。连我自己编的程序都输出这样的结果。
希望大家不吝赐教。谢谢。
[ 本帖最后由 xiazhuliang 于 2008-10-25 18:27 编辑 ] 我对于Mahtematica完全不熟悉,只能根据楼主提供的数据中猜测。楼主用sinc函数取得的数据全是实数,它不是矩形函数的DFT结果(应为复数),而是矩形函数DFT结果的模值,所以用它作傅里叶变换是得不到矩形函数的。
回复 沙发 songzy41 的帖子
首先,sinc函数是偶函数,它的傅里叶变换结果是纯实函数,这点可以看帖子中的转换结果,所有结果的虚部都是零。由于傅里叶变换的对称性,假如我对一个关于y轴对称的矩形函数做FT的话,将会得到一个sinc函数。其次,我想要验证的是我的FFT程序,所以是做DFT变换,我的输入数据是以0.2为采样周期,在[-3.2,3.0]对sinc(2πt)采样得到的。您好像误以为是矩形函数做DFT或者IDFT产生。
不过还是谢谢你。 我再把问题说得明白点吧,我对如下数据做基2FFT
0.04730167054004105
-3.8981718325193755*^-17
-0.054059052045761224
-0.035980357068793774
0.03897872015785989
0.06880242987642339
-3.8981718325193755e-17
-0.0840918587378508
-0.05846808023678991
0.06682066312775996
0.12613778810677617
-3.8981718325193755e-17
-0.18920668216016426
-0.15591488063143988
0.23387232094715982
0.756826728640657
1.
0.756826728640657
0.23387232094715982
-0.15591488063143988
-0.18920668216016426
-3.8981718325193755e-17
0.12613778810677617
0.06682066312775996
-0.05846808023678991
-0.0840918587378508
-3.8981718325193755e-17
0.06880242987642339
0.03897872015785989
-0.035980357068793774
-0.054059052045761224
-3.8981718325193755e-17
这些数据是从-3.2到3.0以0.2为间隔抽样产生的。按照理论,sinc函数的傅里叶变换应该如下
也就是一个矩形函数。其中sign是符号函数。
但是,软件的DFT变换却得到了如下数据:
2.4747371504917135+0.*I
-2.5261241146184594+0.*I
2.470963524194133+0.*I
-2.5353309049546384+0.*I
2.4507904172659774-1.1102230246251565e-16*I
-2.5884141396765865+0.*I
2.1625046178799137+5.551115123125783e-17*I
-0.019549374076036168-2.862293735361732e-17*I
0.018007472045503126+0.*I
0.016697472462237278-2.862293735361732e-17*I
0.014153858334025077+5.551115123125783e-17*I
0.012213480946957928+0.*I
0.010852450876162267-1.1102230246251565e-16*I
0.009926683069587883+0.*I
0.00932932364641259+0.*I
0.008994261167265538+0.*I
0.008886249664689982+0.*I
0.008994261167265538+0.*I
0.00932932364641259+0.*I
0.009926683069587883+0.*I
0.010852450876162267+1.1102230246251565e-16*I
0.012213480946957928+0.*I
0.014153858334025077-5.551115123125783e-17*I
0.016697472462237278+2.862293735361732e-17*I
0.018007472045503126+0.*I
-0.019549374076036168+2.862293735361732e-17*I
2.1625046178799137-5.551115123125783e-17*I
-2.5884141396765865+0.*I
2.4507904172659774+1.1102230246251565e-16*I
-2.5353309049546384+0.*I
2.470963524194133+0.*I
-2.5261241146184594+0.*I
按理说结果应该是矩形函数的抽样,要么是2.5,要么是零,现在却出现了-2.5,而且和2.5交替出现。
我想软件(Mathematica6.0)应该是不会错的,毕竟是全球知名的软件,而且是这么平常的一个算法。何况我自己编写的程序都给出了这样的结果。。。但给出的结果就是这样啊。。 本帖最后由 wdhd 于 2016-9-13 13:28 编辑
原帖由 xiazhuliang 于 2008-10-25 18:23 发表
首先,sinc函数是偶函数,它的傅里叶变换结果是纯实函数,这点可以看帖子中的转换结果,所有结果的虚部都是零。由于傅里叶变换的对称性,假如我对一个关于y轴对称的矩形函数做FT的话,将会得到一个sinc函数。
其次,我想要验证的是我的FFT程序,所以是做DFT变换,我的输入数据是以0.2为采样周期,在[-3.2,3.0]对sinc(2πt)采样得到的。您好像误以为是矩形函数做DFT或者IDFT产生。
因为楼主画出的图的时间轴上是从0~32,不是-3.2~3.0,所以产生了误解。
如果想从sinc函数值,经傅里叶变换得到矩形函数,在傅里叶变换时不宜用DFT或FFT,因为DFT或FFT在时间轴上都是从0~N-1,而要用DTFT。
以下按楼主的思路给出MATLAB程序,把sinc函数经傅里叶变换的程序和图:
r=0.02;
t=-6:r:6;
f=sinc(t);
N=500;
w=5*pi;
k=-N:N;
omega=k*w/N;
W=exp(-j*t'*omega);
F=r*f*W;
subplot 211; plot(t,f);
subplot 212; plot(omega,F); 这个问题实质其实是DFT定义里如何看待时间序列的对应的时间的问题.
尽管你生成的sinc序列是从-3.2到3.0按关于时间0点对称来生成的,但是对了DFT的定义里,它其实是按0到N-1来看这个序列的,也就是说它总是把序列的第一个点看成是时间0点.这样一来的话这个sinc序列就不是关于时间0点对称了.它相当于是在对称sinc序列进行了一个T/2(T为总时间长度)的时移,时移对应频域的相移2pi*f*T/2=2*pi*k/T*T/2=k*pi,k代表的是第k(0:N-1)条谱线,这样一来,本应是一矩形窗的(不考虑截断引起的波纹和过渡带),就变成正负交替的了.
[ 本帖最后由 yangzj 于 2008-10-26 13:03 编辑 ] 像songzy41大师一样,在W=exp(-j*t'*omega)中
把时间相应改成对称的,就可以得到对称sinc序列所对应的矩形窗了
回复 6楼 yangzj 的帖子
原来如此啊。。。的确,实际上我做的操作是把采样的序列右移了N/2个采样点,结果相应的DFT结果就应该是
于是乎。。。震荡了。
谢谢大家
页:
[1]