あまり入門的な記事を見つけられなかったんで1から書いてみます。
同じ歌を録音した二つの音声ファイルがあり、中身が同じ歌だと示したいとします。
単に波形を比べるだけだと、ボリュームが違ったり録音開始時刻が違ったりするので同じかどうか分かりません。ボリュームについては最大値と最小値が同じ程度になるように一方を何倍かすればいいですが、時刻のずれはどうすればいいでしょうか。
一つの方法として、データをm個だけずらして比較してみて、あらゆるmについて手当たり次第に調べれば、どれか一つでよく一致するはずです。
似ている度合いを調べるには、データをずらして平均を0にするといいです。そうしてずらしたデータ列をA0,A1,A2,...とB0,B1,B2,...とします。似ている度合いは
S0=A0*B0+A1*B1+A2*B2+...で評価できます。Aが大きい値のときBも同じ符号で大きい値であればS0は大きくなり、無関係ならば0になります。m個ずらした場合は、
Sm=A0*Bm+A1*B(m+1)+...となります。
さて、いろんなmについてしらみつぶしに調べるのが面倒だ、という場合、簡単に計算する方法もあります。それはSmの二乗を全てのmについて合計したもの
を計算すると、どれかのmで「当たり」がある場合、この合計も大きくなることから判別できます。この合計XはSmより一見計算が大変そうに見えますが、FFTを使うと簡単に計算できます。AとBをFFTを使って変換したものをC(k), D(k)とおきます。するとX=と、一重ループで計算できます。
以上は音声データの場合ですが、画像の場合は同様に原点を左右と上下方向にズラして一致を探すことになります。基本的には同じ計算です。
あまり入門的な記事を見つけられなかったんで1から書いてみます。
同じ歌を録音した二つの音声ファイルがあり、中身が同じ歌だと示したいとします。
単に波形を比べるだけだと、ボリュームが違ったり録音開始時刻が違ったりするので同じかどうか分かりません。ボリュームについては最大値と最小値が同じ程度になるように一方を何倍かすればいいですが、時刻のずれはどうすればいいでしょうか。
一つの方法として、データをm個だけずらして比較してみて、あらゆるmについて手当たり次第に調べれば、どれか一つでよく一致するはずです。
似ている度合いを調べるには、データをずらして平均を0にするといいです。そうしてずらしたデータ列をA0,A1,A2,...とB0,B1,B2,...とします。似ている度合いは
S0=A0*B0+A1*B1+A2*B2+...で評価できます。Aが大きい値のときBも同じ符号で大きい値であればS0は大きくなり、無関係ならば0になります。m個ずらした場合は、
Sm=A0*Bm+A1*B(m+1)+...となります。
さて、いろんなmについてしらみつぶしに調べるのが面倒だ、という場合、簡単に計算する方法もあります。それはSmの二乗を全てのmについて合計したもの
を計算すると、どれかのmで「当たり」がある場合、この合計も大きくなることから判別できます。この合計XはSmより一見計算が大変そうに見えますが、FFTを使うと簡単に計算できます。AとBをFFTを使って変換したものをC(k), D(k)とおきます。するとX=と、一重ループで計算できます。
以上は音声データの場合ですが、画像の場合は同様に原点を左右と上下方向にズラして一致を探すことになります。基本的には同じ計算です。
ご回答ありがとうございます。1次元信号をわかりやすく説明していただいたため、2次元信号である画像においてもイメージできました。相関関数の計算にFFTを使用する場合はサンプルとするデータ数がやはり2の累乗である事が前提なのでしょうか?画像で言うと128*128や256*256の様に縦横同じ画素数(データ数)でかつ2の累乗で無いとFFTでは計算できないと言うことになりますか?
できれば回答中もコメント書き込み可にしていただけるといいんですが、、、
1への補足です。この解答にポイントはいりません。
と書きましたが間違いででした。
それと、FFTは二べきでなくても使えるはずです。二べきの方が速いですが。多くの数に素因数分解できるほうが速いです。なので256*3とかでも十分速いはずです。
また縦横のサイズは違ってもかまいません。横をLx,縦をLyとすると計算すべき量は
, |kx|<=Lx/2, |ky|<=Ly/2 となります。
ご回答ありがとうございます。1次元信号をわかりやすく説明していただいたため、2次元信号である画像においてもイメージできました。相関関数の計算にFFTを使用する場合はサンプルとするデータ数がやはり2の累乗である事が前提なのでしょうか?画像で言うと128*128や256*256の様に縦横同じ画素数(データ数)でかつ2の累乗で無いとFFTでは計算できないと言うことになりますか?