MATLAB:使用ifft提取原始信号

时间:2016-04-14 10:57:30

标签: matlab fft ifft

我有一个时变信号(有基频和多个谐波),我计算了fft(),然后将其除以频率相关灵敏度M(f)。然后,我想使用ifft()转换回时域,以获得时变信号,但ifft()似乎不起作用,即:

p(t) = ifft(fft(v(t)./M(f))

ifft()没有按照我的想法行事吗?

****关注***

我已经编写了以下代码来试图理解这一点:

% v(t)

t=0:0.1:10;
a=sin(t);

subplot(1,5,1); plot(t,a); 
title('1. time domain'); 
xlabel('t [s]')
ylabel('p.d. [v]')
hold on;

% fft(v(t))

T = t(2);                       % Sampling period
Fs=1/T;
L = length(t);                  % Length of signal
Y = fft(a);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(L/2))/L;

subplot(1,5,2); plot(f,P1);
title('2. frequency domain (fft(vt))')
xlabel('f [Hz]')
ylabel('magnitude')

%frequency responce (sensitivity), M(f)

resp=ones(1,length(f)); %1=1

subplot(1,5,3); plot(f,resp);
title('3. Simulated sensitivity (M(f))')
xlabel('f [Hz]')
ylabel('v / p')

% fft(v(t))./M(f)

fftResp=P1./resp;

subplot(1,5,4); plot(f,fftResp);
title('4. fft(v(t))./M(f)')
xlabel('f [Hz]')
ylabel('fft(v(t)) / M(f)')

%Inverse fft, p(t) = ifft(fft(v(t)./M(f)))

pt = real(ifft(fftResp));

subplot(1,5,5); plot(pt);
title('5. time domain (ifft)')
xlabel('t [s]')
ylabel('p.d. [p]')

结果:https://www.dropbox.com/s/18tqeyqey2pc5te/SOfigure.png?dl=0

在所有频率下M(f)= 1时,我希望最终的ifft()结果(图5)等于初始时域信号(图1),但它没有?第二个FFT(图3)相当于第一个(图2),这是正确的。

2 个答案:

答案 0 :(得分:1)

您的错误源于您对 <Id> <OrgId> <Othr> <Id>111111111 (or 222222222 based on ancestor)</Id> <SchmeNm> <Cd>CHID</Cd> </SchmeNm> </Othr> </OrgId> </Id> abs的理解,但它们并不相同。错误可在以下行中找到:

real

此处,Y是复杂的P2 = abs(Y/L); 结果,L是标量,您需要使用fft代替real

abs

,结果如下:

答案 1 :(得分:0)

也许您应该使用./运算符。它将向量中的每个相应项分开:

p(t) = ifft(fft(v(t)./M(f)))

它应该有效。 有时ifft计算具有小虚部的复杂信号作为输出。试试这个:

p(t) = real(ifft(fft(v(t)./M(f))))