program1 波形が一致する場所を探す
--> program1
波形が完全に一致する場所を探索する
2400サンプル(1msに相当する)おきに波形を比較し、一致する位置を探す
abs, sumを使っている
abs = 絶対値を計算する。複素数にも使える。
例1 abs(-1) -> 1
例2 abs(1 + %i) -> 2^(0.5)
sum = 合計を計算する
例1: sum([1,2,3]) -> 1+2+3 = 6
program1の問題点=誤差に弱い
少しでも誤差があれば波形は一致しない。
program2 誤差が最小の位置を探す
--> program2
2400サンプル(10ms)おきに波形を比較していく。
誤差が最小の位置を探す。
program2の問題点=高い周波数成分に弱い
100Hzのsin信号では10msの誤差はわずかな差にしかならない。
10ms間隔で探索しているから、正解とは5m程度はずれる可能性がある。
たとえば1kHzのsin波形が入っていた場合、program2がどのようになるかを確認してみよう。」
yとして0.1秒の1000Hzのsin信号を作る
xとして、1秒間の無音信号を作る
yの0.5秒の位置にxを挿入する。
program2と同じ方法で分析し、誤差をグラフにして表示する。
// サンプリング周波数 24000 // 1秒の無音の中の0.1秒のsin関数を探す t1=(1:2400)/24000; y=sin(2*%pi*1000*t1); // 0.1秒のsin関数 plot(t1,y); t2=(1:24000)/24000; x=t2*0; // 1秒の無音信号 x(12001:(12000+2400))=y; // 0.5秒後に0.1秒のsin関数 figure(); plot(t2,x); r=0; // r を 0 で初期化 for i=1:200 p=i*100 err=sum(abs(x(p+1:p+2400)-y)) r(i)=err // r(i)にi*100サンプルのでの波形差 end figure(); // 各位置での波形差をプロットする plot((1:200)*100/22000,r); |
sin関数と波形の誤差は無音部分では1500くらいだ。
sin波がある0.5秒で小さくなるが。
しかし、その前後で誤差が0~3000の間で上下に何度も振れている。これはsin関数とsin関数の差が位相差によっては互いに反対方向の振れになる。そのような場合は同じ1kHzの信号でも波形の差は大きくなってします。