1

3 つの異なる周波数信号を作成し、不要な信号を除外しました。しかし、matlab で ifft を使用すると、間違ったグラフが表示されます。周波数領域スペクトルを 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)
4

1 に答える 1

1

現在のようetに、fft のため、周波数領域にあります。フトする必要はありません。だけplot(e)で、時間領域でフィルタリングされた波形が得られます。フィルタの性能は freq で確認できます。ただし、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])

ここに画像の説明を入力

于 2012-12-26T04:01:47.647 に答える