サンプルレート変換

どうも、吉村です。

サンプルレート変換にチャレンジします。
サンプルレート変換というと、真っ先にオーディオのサンプリングレートを思い浮かべますが、
それに限定したものではありません。
より抽象化していうと、

「ある一定の間隔で実数値が並んだもの」

と言えます。
実際の値が何に使われるかは今回は興味の対象ではありません。

つまり今回のチャレンジは、”ある一定の間隔” という部分を変換しよう、という点に尽きます。

今回はC++で、サンプルレートを変換するモジュールを作ってみました。
こういうコア部分のアルゴリズムはC++はやはり強いですね。
resample.hpp

使用例
・1秒間に20回の周波数のデータ(20Hz)を1秒間に100回のデータ(100Hz)に変換
・1秒間に20回の周波数のデータ(20Hz)の0.4秒の時の値を取得

補間アルゴリズムは無数に考えられますが、今回は、
・再近傍 InterpolationNearest
・線形 InterpolationLerp
・ハーフコサイン InterpolationHarfCos
・Catmull-Rom InterpolationCatmulRom
をサポートします。
また、Tの型としてはfloat, double、その他四則演算が可能なものを想定しています。

デバッグにはデータのビジュアライズが必須です。
試しにこのアルゴリズムで補間を行ったものが以下のものになります。
赤が元のサンプルレートのデータで、
緑が変換後のサンプルレートのデータになります。

線形補間
resample-lerp

ハーフコサイン補間
resample-harfcos

Catmull-Rom補間
resample-catmull

このようなコアロジック実装は堅牢かつ柔軟に実装して、
アプリケーション開発もスムーズに進めたいですね。