InterpolatorとDecimatorの制約

オーディオ用のInterpolatorとDecimatorはFIRフィルタの変形として実装することが多いですが、一般には係数長やブロックサイズ長に制約があることは知られていません。

何故知られていないかというと、あはは使われないからです。あはは。サンプル周波数を変える等というのは、なかなかアマチュアのフィールドには降りてきません。そんなものを使う場合にはエキスパートなわけで、エキスパートはエキスパートのコミュニティを持っているから一般には知る必要も無いと言うことでしょう。

実際にどんな制約があるか、CMSISのDSPライブラリを見てみましょう。たとえば、arm_fir_decimate_init_f32()の返り値に関する記述を読んでみると以下の記述があります。

The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_LENGTH_ERROR if blockSize is not a multiple of M.

多少記述が曖昧ですが、blockSizeはダウンサンプル比Mの整数倍でなければなりません。明示されてはいませんが、同じ制約がarm_fir_decimate_f32()にもあるはずです。

また、arm_fir_interpolate_init_f32()には以下の記述があります。

The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_LENGTH_ERROR if the filter length numTaps is not a multiple of the interpolation factor L.

係数長はアップサンプル比Lの整数倍でなければなりません。

自分で実装するとこれらの制約は自明なものとして頭に入るのですが、使うときにはちょっとした罠になるため注意が必要です。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください