FFTフィルタ

 会社で振動の感覚補正のフィルターを作ってくれと言われ、FFTフィルタを使って周波数上で重み付けをして時間軸に直すことにした訳だが、その際にFFTフィルタの話になって、私は参考書の手法に従って窓長の半分の長さの0をデータの前後に付加して、半窓長づつシフトしながら加算していく手法のものならLabviewScilabでは作っていたが、そんな面倒なことしなくても単にデータ全部の長さを窓長にして一発でやってしまえば良いんじゃないの?という話になった。でもその手法だと漏れ誤差の影響は?と思ったが、再度逆フーリエする分には影響ないという。

 ということでScilabで軽く確認してみた
random=rand(1,100);
subplot(2,1,1)
plot(random)

re_random=fft(fft(random,-1),1);
subplot(2,1,2)
plot(re_random)

 おお・・確かに影響無い。まあ、半窓長づつシフトする手法は、窓長を2の階乗にして速度を上げたい場合やメモリ量で優位なのだろうが、それを気にする必要がなければこちらの方がプログラムもシンプルで間違えも少ない。
 それと、半窓長づつシフトする手法だと、窓の最初と最後を0にしてDCカットをすると上手く行かないが、この手法だと上手くいく。
random=rand(1,100);
subplot(2,1,1)
plot(random)

window=zeros(1,100);
for i=2:99
window(i)=1;
end

re_random_dccut=fft(fft(random,-1).*window,1);
subplot(2,1,2)
plot(re_random_dccut)

まあ、何もDCカットするのにFFTフィルタを使う必要はないのだけど。
Labviewで作った騒音振動感覚補正のインパルスを放り込んだ周波数応答が以下の感じ。A特性感覚補正はFFTフィルタは使用せずIIRフィルタで作成している。振動の感覚補正は1/3オクターブバンド中心周波数の補正値に窓長分のデータをスプライン補間して作成し、周波数軸上でかけて時間軸に戻している。半窓長づつシフトする手法と一気に行う手法は同じ結果になる。当然といえば当然。DCカットが例外なのだろう。

A特性感覚補正

振動鉛直感覚補正

振動水平感覚補正