フーリエ変換、窓関数
さて、いきなり周波数分析と言われても、信号処理を知らない人には
何の事かわからないでしょう。
普通、一般的にSIN波やCOS波などの波形を書く時の横軸は「時間」です。
これが、一般的ですよね。
そこで、フーリエ変換をする事により、横軸が「周波数」となるわけです。
一般的にフーリエ変換して求めた波形をスペクトルと言います。
縦軸に振幅を示した場合は振幅スペクトル、位相の場合は位相スペクトルと言います。
こういった、横軸を周波数として分析して行く事を周波数分析と言います。
さて、フーリエ変換をする場合は、原則として窓関数というものをかけます。
窓関数というのは、代表的な物に、以下のような関数があります。
・方形窓=図紫色
・ハミング窓=図青色
・ハニング窓=図緑色
・ブラックマン窓=図赤色
とあります。具体的には、下のような波形になります。
窓関数というのは、取り出されたデータに対して、重みをつける関数です。
方形窓は全てに対して一様な重みですが、他のものは中央部に重みがかかります。
さて、なぜ窓関数が必要なのか?という問いに答える前に、
以下のプログラムを実行してみて下さい。
function ffttest % % 高速フーリエ変換テスト % 3Hz、3.1HzのSIN波をフーリエ変換する % 窓関数は方形波を使用 % % fs=256; % サンプリング周波数 fftpt=fs*16; % フーリエ変換の精度 f1=3; % 青線波形の周波数 f2=3.1; % 緑線波形の周波数 t=(0:1/fs:1-1/fs); % x軸のデータ長 x1=sin(2*pi*f1*t); % 青線サイン波の生成 x2=sin(2*pi*f2*t); % 緑線サイン波の生成 subplot(2,1,1); plot(t,x1,'b'); hold on; plot(t,x2,'g'); xlabel('time'); y1=fft(x1,fftpt); % 青線サイン波のフーリエ変換 y2=fft(x2,fftpt); % 緑線サイン波のフーリエ変換 fq=((0:fftpt-1)/fftpt)*fs; % 周波数x軸のデータ長 subplot(2,1,2); plot(fq,20*log10(abs(y1)),'b'); % 縦軸をdB表示 hold on; plot(fq,20*log10(abs(y2)),'g'); % 縦軸をdB表示 axis([0 30 -50 50]); xlabel('frequency'); ylabel('amplitude(dB)'); |
function ffttest % % 高速フーリエ変換テスト % 3Hz、3.1HzのSIN波をフーリエ変換する % 窓関数は方形波を使用 % % fs=256; % サンプリング周波数 fftpt=fs*16; % フーリエ変換の精度 f1=3; % 青線波形の周波数 f2=3.1; % 緑線波形の周波数 t=(0:1/fs:1-1/fs); % x軸のデータ長 x1=sin(2*pi*f1*t); % 青線サイン波の生成 x2=sin(2*pi*f2*t); % 緑線サイン波の生成 w=hanning(fs); % 窓かけ準備 w=w'; % ハニングは列データなので、行データへ転置 x1=x1.*w; % 窓かけ操作 x2=x2.*w; subplot(2,1,1); plot(t,x1,'b'); hold on; plot(t,x2,'g'); xlabel('time'); y1=fft(x1,fftpt); % 青線サイン波のフーリエ変換 y2=fft(x2,fftpt); % 緑線サイン波のフーリエ変換 fq=((0:fftpt-1)/fftpt)*fs; % 周波数x軸のデータ長 subplot(2,1,2); plot(fq,20*log10(abs(y1)),'b'); % 縦軸をdB表示 hold on; plot(fq,20*log10(abs(y2)),'g'); % 縦軸をdB表示 axis([0 30 -50 50]); xlabel('frequency'); ylabel('amplitude(dB)'); |