MATLAB: использование 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), но это не так? Второе БПФ (рис. 3) эквивалентно первому (рис. 2), что является правильным.


person 2one    schedule 14.04.2016    source источник
comment
V(t)./ M(f) - должен сделать это   -  person GameOfThrows    schedule 14.04.2016
comment
Извините, я уже делал это. Есть какая-то другая проблема. Я ожидаю изменяющийся во времени сигнал, но получаю следующее: dropbox.com/s/ 18tqeyqey2pc5te/SOfigure.png?dl=0   -  person 2one    schedule 14.04.2016
comment
Очень трудно понять, что вы сделали, если мы не можем воссоздать проблему, может быть, это просто то, как вы ее рисуете? ifft(fft(vector)) должен дать вам правильное решение   -  person GameOfThrows    schedule 14.04.2016
comment
См. правки выше.   -  person 2one    schedule 14.04.2016
comment
ага, а где твоя воображаемая часть от твоего fft ?   -  person GameOfThrows    schedule 14.04.2016


Ответы (2)



Возможно, вам следует использовать оператор ./. Он делит все соответствующие элементы на векторы:

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

Это должно работать. Иногда ifft вычисляет сложный сигнал с небольшой мнимой частью в качестве выхода. Попробуйте также это:

p(t) = real(ifft(fft(v(t)./M(f))))
person M45ked    schedule 14.04.2016