声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3295|回复: 8

[编程技巧] 求教一个关于FFT和IFFT的问题

[复制链接]
发表于 2008-7-16 09:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

使用道具 举报

发表于 2008-7-16 11:35 | 显示全部楼层
如果信号x的长度为N,则在myfft中计算出的X和f都只有N/2长,把负频率部分丢了,再做myifft当然不会正确。

评分

1

查看全部评分

 楼主| 发表于 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的问题。
发表于 2008-7-16 15:05 | 显示全部楼层
原帖由 xinbaby 于 2008-7-16 12:36 发表
还有一个问题,我要做的是:
  将信号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 [X,f]=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 [y,t]=myifft(X,fs,f,q) %IFFT程序:
       if nargin==3
           q='noplot';
       end
       fmax=fs/2;
       Y=X;
        %y=[];
       n=length(X);
       %t=[];
       Y=[Y conj(Y(n-1:-1:2))];
       n=length(Y);
       t=[0:n-1].*(1/fs);
       y=n*ifft(Y);

评分

1

查看全部评分

 楼主| 发表于 2008-7-16 18:31 | 显示全部楼层

回复 4楼 的帖子

刚看到贴子,先非常感谢songzy41的回复,我看看。
 楼主| 发表于 2008-7-16 22:28 | 显示全部楼层

回复 4楼 的帖子

非常感谢你!!我用你改过的程序试过了,问题解决了!没有直流量的问题。而且在频域中做关于w的加减乘除运算后,再经myifft,得到了正确的结果(稍有一点偏差,可能是另一个程序问题)
    再谢!
 楼主| 发表于 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算的一样.
  不知道为什么,请教各位了.
 楼主| 发表于 2008-7-17 12:57 | 显示全部楼层
原帖由 xinbaby 于 2008-7-17 12:19 发表
现在的问题是关于卷积的:
用两种方法求同一结果:
(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呢?
发表于 2010-8-25 15:58 | 显示全部楼层
回复 songzy41 的帖子
不知道 if nargin==2
           p='noplot';
       end

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

   
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-16 15:55 , Processed in 0.058071 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表