xinbaby 发表于 2008-7-16 09:36

求教一个关于FFT和IFFT的问题

在下面程序中取(fmax=fs/2时),将一非周期时域信号(一梯形波f(t))做FFT之后再经IFFT变换到时域里,(应该恢复f(t)梯形信号),但结果却得到了f(t)+C(C为一常数)的信号。而当取(fmax=fs)时,正常。根据采样定理,不是应该是采样频率大于等于2最大频率才对吗,这儿怎么反了?请教各位了!!
FFT程序:
   function =myfft(fs,x,fmax,p)
       if nargin==2
         fmax=fs/2;
         p='noplot';
       end
       if nargin==3
         p='noplot';
       end
       X=[];
       f=[];
       n=length(x);
       t=(0:n-1)/fs;
       X=fs*fft(x)/n/fmax;
       X=X(1:ceil(fmax*n/fs));
       f=linspace(0,fmax,ceil(fmax*n/fs)); IFFT程序:
       function =myifft(fs,f,X,q)
       if nargin==2
         fmax=fs/2;
         q='noplot';
       end
       if nargin==3
         q='noplot';
       end
         y=[];
       t=[];
       n=length(X);
       t=.*(1/fs);
       y=n*ifft(X);

songzy41 发表于 2008-7-16 11:35

如果信号x的长度为N,则在myfft中计算出的X和f都只有N/2长,把负频率部分丢了,再做myifft当然不会正确。

xinbaby 发表于 2008-7-16 12:36

回复 2楼 的帖子

谢谢!有道理.还有一个问题,我要做的是:
  将信号f(t)从时域经FFT变到频域F(jw),在频域内做变换(F(jw)和关于w的加减乘除运算,这里的w=f*2*pi,f取IFFT(x,f)得到的对吗?),再IFFT变到时域
  结果是:如果取fmax=fs/2时,最终结果减去一个直流量就正确,
      如果取fmax=fs时,最终结果根本不正确
  这是怎么回事儿呢?求教了,这个问题困扰我好几天了。是不是f的问题。

songzy41 发表于 2008-7-16 15:05

原帖由 xinbaby 于 2008-7-16 12:36 发表 http://www.chinavib.com/forum/images/common/back.gif
还有一个问题,我要做的是:
  将信号f(t)从时域经FFT变到频域F(jw),在频域内做变换(F(jw)和关于w的加减乘除运算,这里的w=f*2*pi,f取IFFT(x,f)得到的对吗?),再IFFT变到时域
  结果是:如果取fmax=fs/2时,最终结果减去一个直流量就正确,
      如果取fmax=fs时,最终结果根本不正确
  这是怎么回事儿呢?求教了,这个问题困扰我好几天了。是不是f的问题。
我想你问的是另一个程序,没有看到你的程序不知错在那里。但是从以上程序,你在求X和f中都有错误。当取fmax=fs/2时,
X=X(1:ceil(fmax*n/fs)+1);
f=linspace(0,fmax,ceil(fmax*n/fs)+1);
如果信号x长N,则X在fs/2对应的点是X(N/2+1)。而myifft中应作相应的修改,从myfft得到的X只是正频率部分,在myifft中应把正频率部分扩展到全频率(正频率部分+负频率部分),再IFFT。fmax=fs/2没有错,但错在不能只用正频率部分做IFFT,这样得到的y不仅数据只有原来的一半长,而且虚部数值很大,不可忽略。我把myfft和myifft都做了修改,没有把fmax作为参数。我想在myfft内对频域中的(F(jw)做关于w的谱线加减乘除运算后再经myifft,一样能得正确的结果。

function =myfft(fs,x,p)
       if nargin==2
         p='noplot';
       end
       fmax=fs/2;
       X=[];
       f=[];
       n=length(x);
       t=(0:n-1)/fs;
       X=fft(x)/n;
       X=X(1:ceil(fmax*n/fs)+1);
       f=linspace(0,fmax,ceil(fmax*n/fs)+1);

function =myifft(X,fs,f,q) %IFFT程序:
       if nargin==3
         q='noplot';
       end
       fmax=fs/2;
       Y=X;
      %y=[];
       n=length(X);
       %t=[];
       Y=;
       n=length(Y);
       t=.*(1/fs);
       y=n*ifft(Y);

xinbaby 发表于 2008-7-16 18:31

回复 4楼 的帖子

刚看到贴子,先非常感谢songzy41的回复,我看看。

xinbaby 发表于 2008-7-16 22:28

回复 4楼 的帖子

非常感谢你!!我用你改过的程序试过了,问题解决了!没有直流量的问题。而且在频域中做关于w的加减乘除运算后,再经myifft,得到了正确的结果(稍有一点偏差,可能是另一个程序问题)
    再谢!

xinbaby 发表于 2008-7-17 12:19

回复 4楼 的帖子

现在的问题是关于卷积的:
用两种方法求同一结果:
(1)在频域中:F(w)=F1(w)*F2(w),将F(w)经IFFT变为 F(t)
(2)将F1(w),F2(w)分别经IFFT变为F1(t),F2(t),再把F1(t)和F2(t)做卷积运算,结果为FF(t)
  理论上来说,F(t)和FF(t)画图出来应该是一样的,但结果却不一样.(F(t)起始值不为0,而FF(t)的起始值为0,分析得出F(t)的结果应该是正确的)
  卷积运算我用的是MATLAB自带的conv,自己也编了数值方法计算卷积的程序,和conv算的一样.
  不知道为什么,请教各位了.

xinbaby 发表于 2008-7-17 12:57

原帖由 xinbaby 于 2008-7-17 12:19 发表 http://www.chinavib.com/forum/images/common/back.gif
现在的问题是关于卷积的:
用两种方法求同一结果:
(1)在频域中:F(w)=F1(w)*F2(w),将F(w)经IFFT变为 F(t)
(2)将F1(w),F2(w)分别经IFFT变为F1(t),F2(t),再 ...

在(2)中卷积后,FF中数值个数为N1+N2-1(N1,N2分别为F1(t),F2(t)中数的个数,且N1=N2),怎么在卷积后FF的(N1+N2-1)个数中取N1个数,才能正确显示(0,t)时间段的FF呢?

juanli9880 发表于 2010-8-25 15:58

回复 songzy41 的帖子
不知道 if nargin==2
         p='noplot';
       end

if nargin==3
         q='noplot';
       end
的作用是什么啊,我最近也遇到差不多的问题呢

   
页: [1]
查看完整版本: 求教一个关于FFT和IFFT的问题