2016-04-14 18 views
0

我有一個隨時間變化的信號(帶有一個基頻和一些諧波),我已經計算出fft(),然後用頻率相關靈敏度M(f)除。然後我想轉換回用ifft()得到隨時間變化的信號,但在時域ifft()似乎並沒有工作,即:MATLAB:使用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),這是正確的。

+0

V(T)./ M(F) - 應該這樣做 – GameOfThrows

+0

對不起,我已經這樣做。還有一些其他問題。我期望一個時間變化的信號,但得到這個:https://www.dropbox.com/s/18tqeyqey2pc5te/SOfigure.png?dl=0 – 2one

+0

如果我們不能重新創建問題真的很難知道你做了什麼,也許它是隻是你正在策劃它的方式? 'ifft(fft(vector))'應該給你正確的解決方案 – GameOfThrows

回答

1

你的錯誤從您的absreal理解莖他們是不一樣的。該錯誤是在這一行中發現:

P2 = abs(Y/L); 

這裏,Y是複雜fft結果,L是標量,你需要使用real而不是abs

P2 = real(Y/L); 

這個結果:

+0

啊是的。除了需要校準的時間/振幅軸之外,這看起來是正確的。我還需要用M(f)來分割單邊振幅譜。 – 2one

+0

從頻域轉換回時域總會有一些錯誤,但這個錯誤應該很小。如果您發現這個答案有用,請接受它作爲正確的答案。 – GameOfThrows

0

也許你應該使用./運算符。它將向量中的每個對應項分開:

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

它應該起作用。 某些時候計算複數信號的小虛部作爲輸出。也是這個嘗試:

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