求教一个关于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); 如果信号x的长度为N,则在myfft中计算出的X和f都只有N/2长,把负频率部分丢了,再做myifft当然不会正确。
回复 2楼 的帖子
谢谢!有道理.还有一个问题,我要做的是:将信号f(t)从时域经FFT变到频域F(jw),在频域内做变换(F(jw)和关于w的加减乘除运算,这里的w=f*2*pi,f取IFFT(x,f)得到的对吗?),再IFFT变到时域
结果是:如果取fmax=fs/2时,最终结果减去一个直流量就正确,
如果取fmax=fs时,最终结果根本不正确
这是怎么回事儿呢?求教了,这个问题困扰我好几天了。是不是f的问题。 原帖由 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);
回复 4楼 的帖子
刚看到贴子,先非常感谢songzy41的回复,我看看。回复 4楼 的帖子
非常感谢你!!我用你改过的程序试过了,问题解决了!没有直流量的问题。而且在频域中做关于w的加减乘除运算后,再经myifft,得到了正确的结果(稍有一点偏差,可能是另一个程序问题)再谢!
回复 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: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呢? 回复 songzy41 的帖子
不知道 if nargin==2
p='noplot';
end
和
if nargin==3
q='noplot';
end
的作用是什么啊,我最近也遇到差不多的问题呢
页:
[1]