鋸波のFFT

鋸波(のこぎり波)のsin波以外の波形をフーリエ変換してみよう。

以下は、のこぎり波を作成する。


fs=22050;l=fs;n=0:(2*l-1);
saw=modulo(n*2950,fs)/fs - 0.5;
// そのままだと音が大きいので0.1倍して再生する
sound(saw*.1,fs);

では、この音をフーリエ変換してみよう。


sawfft=fft(saw,-1);
plot2d(fs*n/(2*fs),abs(sawfft*2/l));

以下のようなプロットが得られる。ただし、赤と緑の点線は後から書き加えたものだ。

ここで、注意してほしいのは、鋸波では基本周波数の2倍、3倍、4倍の周波数があるということだ。これらを高調波という。

グラフを良くみると、440Hzから始まる高調波が8000Hz近くまで続くように見える。また、それと対象的な成分は、8000-440Hzから始まって、0Hz近くまで続いている。

本来、8000Hzのサンプリングレートでは4000Hz以上の周波数はあらわすことができない。この波形では、4000Hz以上の周波数を含む波形をむりに8000Hzのサンプリングレートであらわしたために、このような本来存在しない成分が周波数にあらわれている。

このような成分のことを「折り返し歪み」または「エリアシング」と呼ぶ。

エリアシングの音を聞いてみる(ちょっと、聞きづらい音なので、音量を小さくして聞くこと)

 

fs=22050;
x2=loadwave("x2.wav");
l=length(x2);
ss=modulo(1:l,2);
a1=0.2 .* ss .* x2;
sound(a1,fs);


a1はエリアシングにより、ナイキスト周波数近い周波数成分が多く発生している。

以下のようにフィルターをかけることで、エリアシング成分が削除され、聞きやすい音になる。

 

lpf=ffilt("lp",128,0.25,0);
a2=convol(lpf,a1);
sound(a2,fs);