等価サンプリングの一般化
高速ADCを使った等価サンプリング回路を作っています。
ADCのサンプリング周期がTだとすると、ある時刻にADCでサンプリングした後の2回目のサンプリングタイミングは2Tです。3回目は3T・・・となっていきます。
ここで、10000Tで1周するような周期的な波形を考えます。ただし、10000Tぴったりで一周するのではなく、信号源の周波数とADCの周波数が少しだけずれていて、10000.14Tで一周するとします。
すると、2周目の最初の時刻は10000.14Tになります。3周目は20000.28Tになります。
この信号が周期10000Tで一周する信号であれば、サンプリング周期よりも短い0.14Tという刻みで信号を測定することができるようになるはずです。
実際にこのようなプログラムを組む時に2週目はどれだけずれるから・・と考えてn番目のデータは時刻何nsに相当するのかというプログラムを組もうとすると非常にややこしかったのですが、C#のListとSortを使って並べ替えをすることで非常に楽にできました。
まず、時刻とデータの組となるクラスを作ります。
public class EqSamplingTime
{
public Int64 time;
public ushort data;
public EqSamplingTime(ushort data,Int64 time)
{
this.time = time;
this.data = data;
}
};
そして、このクラスのリストを作り、サンプリングしたデータを次々と登録していきます。
List<EqSamplingTime> est = new List<EqSamplingTime>();
for(int i=0;i< K * 10000; i++){
est.Add(new EqSamplingTime(buf[i], (Int64)((sampling_period * i) % 100000000)));
}
そして、最後に
est.Sort((a, b) => (a.time == b.time) ? 0 : ((a.time > b.time) ? 1 : -1));
で一発で時刻どおりに並べ替えてソートです。
実際にやってみましょう。
まずは1倍サンプリングです。
100MHzでサンプリングしているので、サンプリング間隔は10nsです。
次は2周分の波形を合成します。細かい部分が約1.5nsとなりました。
次は3周分
次は4周分を合成。
6周期
7周期でほぼ点がつながりました。
今回は送信側周波数と受信側周波数が14ppmずれていて、10000ポイントのサンプリングなので7周期ということになるのでしょう。このへんの計算は割り算したりあまりを取ったりということでややこしいです。
7回でほぼ一周するので、サンプリング周波数は等価的に700MHzになりました。
8周期目になると最初の点と8回目の点が非常に近くなるので、
等価的に時間差は200ps前後になります。
これでサンプリング周波数が5GHzになったかというと、そうではなくて、誤差の積み重なり(計算アルゴリズムの間違いかも)によって波形がガタガタになります。
今回は、信号を送信する波形のクロック周波数と受信するクロック周波数が14ppmずれていて、7倍の等価サンプリングが可能でした。
この周波数のずれ小さいほど高い倍率での等価サンプリングが可能になります。水晶の温度が変わったりすると倍率も変わってくるので、ある意味、運任せといえます。
| 固定リンク












コメント