Как преобразовать частотную область во временную область
Я создал три разных частотных сигнала и отфильтровал сигнал, который мне не нужен. Но когда я использую ifft в matlab, он показывает неправильный график. Как преобразовать мой спектр частотной области обратно в мой 3-секундный график временной области? Ниже мой код, как показано ниже:
clc
clear all
Fs = 8192;
T = 1/Fs;
%create tones with different frequency
t=0:T:1;
t2=1:T:2;
t3=2:T:3;
y1 = sin(2*pi*220*t);
y2 = sin(2*pi*300*t2);
y3 = sin(2*pi*440*t3);
at=y1+y2+y3;
figure;
plot(t,y1,t2,y2,t3,y3),title('Tones with noise');
[b,a]=butter(2,[2*290/Fs,2*350/Fs],'stop');
e=filter(b,a,at);
et=(ifft(abs(e)));
figure,
plot(et)
1 ответ
Как сейчас, et
находится в частотной области, из-за БПФ. Вам не нужно искать. просто plot(e)
и вы получите отфильтрованный во временной области сигнал. Вы можете проверить производительность фильтра в частоте. домен по FFT хотя, просто
plot(abs(fftshift(fft(fftshift(e)))));
xlim([4000 5000])
Редактировать:
Ваш код, как написано в вопросе, содержит следующую ошибку: at
содержит ровно 1 секунду информации (или 8192 элементов). если ты plot(at)
Вы увидите сумму частот в порядке, но все они happen
в то же время. Вот как это исправить:
clear all
Fs = 8192; % or multiply by 3 if needed
T = 1/Fs;
%create tones with different frequency
t=0:T:3;
y1 = sin(2*pi*220*t).*(t<1);
y2 = sin(2*pi*300*t).*(t<2 & t>=1);
y3 = sin(2*pi*440*t).*(t>=2);
at=y1+y2+y3;
[b,a]=butter(2,[2*290/Fs,2*350/Fs],'stop');
e=filter(b,a,at);
figure,
plot(t,e)
dt=t(2)-t(1);
N=length(at);
df=1/(N*dt); % the frequency resolution (df=1/max_T)
if mod(N,2)==0
f_vector= df*((1:N)-1-N/2); % frequency vector for EVEN length vectors: f =[-f_max,-f_max+df,...,0,...,f_max-df]
else
f_vector= df*((1:N)-0.5-N/2); % frequency vector for ODD length vectors f =[-f_max,-f_max+fw,...,0,...,f_max]
end
freq_vec=f_vector;
fft_vec=fftshift(fft(e));
plot(freq_vec,abs(fft_vec))
xlim([0 1000])