MATLAB:使用ifft提取原始信号
MATLAB: Using ifft to extract original signal
我有一个时变信号(具有基频和一些谐波),我计算了它的 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),这是正确的。
也许你应该使用 ./ 运算符。它将向量中的每个对应项划分:
p(t) = ifft(fft(v(t)./M(f)))
应该可以。
有时 ifft 计算具有小虚部的复信号作为输出。也试试这个:
p(t) = real(ifft(fft(v(t)./M(f))))
您的错误源于您对 abs
和 real
的理解不一样。在这一行发现错误:
P2 = abs(Y/L);
这里Y是复fft
结果,L是标量,需要用real
代替abs
。
P2 = real(Y/L);
结果如下:
我有一个时变信号(具有基频和一些谐波),我计算了它的 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),这是正确的。
也许你应该使用 ./ 运算符。它将向量中的每个对应项划分:
p(t) = ifft(fft(v(t)./M(f)))
应该可以。 有时 ifft 计算具有小虚部的复信号作为输出。也试试这个:
p(t) = real(ifft(fft(v(t)./M(f))))
您的错误源于您对 abs
和 real
的理解不一样。在这一行发现错误:
P2 = abs(Y/L);
这里Y是复fft
结果,L是标量,需要用real
代替abs
。
P2 = real(Y/L);
结果如下: