この記事に
ちょっとだけデジタル信号処理
[ リスト | 詳細 ]
|
前々回は物体に対して照射する電波の周波数を変化させて、戻ってきた電波との周波数差がビート信号という形で現れることを利用して、物体の距離を検出する方法を解説しました。前回では仮に物体が 2 つあっても距離が違えば FFT による分析でいずれも検出できることを説明しました。
では、検出したい物体が動いていたらどうなるのでしょうか。 ドップラー効果というのを思い出して見ましょう。 wiki ではこちら。 ドップラー効果 https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%83%E3%83%97%E3%83%A9%E3%83%BC%E5%8A%B9%E6%9E%9C この理論というか効果は FMCW レーダにも現れることが容易に想像できるかと思います。つまり距離に応じた周波数差が送受信信号に現れているのに加えて、さらに受信信号には物体とレーダとの間に相対速度を持っていた場合ドップラー効果による周波数差が加算されるということです。 どういうことかというと、前回までの例では距離の遠いところにある物体は戻ってくる時間差の関係で周波数差も大きく見えて距離が検出されました。ところがその物体がレーダに近付きながら移動している場合は、戻ってくる周波数が高くなるのでその時に発信している周波数に近付くことになり、物体との距離が近くにあるように検出されてしまいます。 これでは検出精度に欠くというか、場合に因っては事故につながってしまうので、物体が動いていることも検出しなくてはいけないです。 で、現実にどのくらいの周波数差が出るか数値を抑えておくことにします。 前に計算したように、ミリ波としては 77GHz ± 0.5 GHz の範囲とし 10ms ぐらいを照射するものとします。周波数変調係数は 100 GHz / 1 s になります。10 m 先の対象物にミリ波が当たって戻ってくる時間は往復で 20 / (3 x 10^8) = 66.7 ns ということになります。これが遅れ時間として受信波になるわけですから、その瞬間の送信周波数の差は 100 GHz x 66.7 ns = 6.67 KHz となります。 さてここでその対象物が時速 36 Km でレーダに向かって移動してきているものとします。光速との差は結構ありそうですが、先ほどの Wiki の記事を引用すると、 観測者(ここでは対象物)も音源(ここでは発信源)も同一直線上を動き、音源 S(source)から観測者 O(observer) に向かう向きを正とすると、 となる。ここで、f':音源の出す音波の振動数、V:音速(ここでは光速)、vo:観測者の動く速度、vs:音源の動く速度 である。 話がややこしくなるのでレーダ自体は止まっていることにして、行きは vs = 0、戻りは vo = 0 と考えるとすると、対象物にミリ波レーダがあたる周波数は、f' = f x (V - vo)/ V となるわけですが、数値を入れて見ると、f' = 77 GHz x (3 x 10^8 + (36(Km/s)/3600)) / x 10^8 (符号に気をつけて下さい。Wiki の説明は vo も vs も同じ方向であって、向かい合う方向とは定義していません)ということで、256 Hz ぐらいの周波数上昇になります。これが復路でもほぼ同じぐらいの周波数上昇が発生して合わせて 500Hz 以上の周波数上昇になり先ほど 10m 先の対象物は 6.67 KHz と見込に対して、ちょっと無視できない量になってしまいます。逆に言えばこれだけの周波数差を分離できれば、速度が検出できることになります。 今までの説明では照射周波数は時間と共に上昇していました。もしこれを時間と共に周波数が下降するようにしたらどうでしょうか。距離に関しては、送信周波数と受信周波数の差分なので周波数変調が上昇だろうと下降だろうと同じ値になりますが、速度に関してはドップラー効果による周波数の増分(近付いている場合)は、周波数変調が上昇ならばその差分を減らす方向に、周波数変調が下降ならばさの差分を増やす方向に現れます。このことを利用して対象物がいくらの距離にあって、相対速度がどのくらいあるかを知ることが出来ます。 周波数の変化だけについて描くとこんな感じになります。 青色の線が送信周波数の推移を表していますが、これが対象物に当たって戻ってきたときは赤い一点鎖線のように遅れて来ます。この瞬間の受信信号周波数と送信信号周波数(周波数は瞬間には測定できませんが、ここではミリ波レーダの周波数が十分高いので「瞬間」という言葉を使っています)の差分を検出します。ところが対象物が動いているときはドップラー効果によりオレンジの線のように周波数がせり上がってしまい、実際には緑点線のような受信信号が返ってきます。これと送信信号の周波数比較を行うと、送信信号周波数の上昇時と下降時で差分周波数が異なってしまいます。 直感的に少なくとも距離に関しては、上昇時下降時に検出された差分周波数の平均値が真の距離を表すだろうということは分かると思います。速度に関しては変調周波数の上昇 / 下降の傾きと合わせて考えれば解けそうな予感がします。で、実際可能です。 今回はここの計算式は詳しくは触れません。何しろ周波数差が大きすぎて視覚的理解と数値的理解を同時に満たすような表現が出来なかったからです。 以下、だいぶ実態とは異なりますが確認のためのスクリプトと実行結果を載せておきますので、興味がある方は実行してみて下さい。何となく感じは分かると思います。 // FMCW single reflection clear; // initialize i1=0; i2=0; df1=0; phase=0; ave_number=64; size_t=10000; // データサイズ - 1 t=[0:1/size_t:1]; // レーダ照射期間 1 msec 間と仮定すると、1 step:0.1us f=100; // 最小レーダ周波数 f / 0.1us = 10MHz Kv=0.0005; // FM 変調量 modu_wave=zeros(1,size_t+1); send_wave=zeros(1,size_t+1); receive_wave=zeros(1,size_t+1); receive_sig=zeros(1,size_t+1); receive_wave1=zeros(1,size_t+1); receive_sig1=zeros(1,size_t+1); ave_out=zeros(1,size_t+1); ave_out1=zeros(1,size_t+1); // 周波数変調信号の作成 for i=0:size_t/2; modu_wave(i+2)=modu_wave(i+1)+2/size_t; end for i=size_t/2+1:size_t; modu_wave(i+1)=modu_wave(i)-2/size_t; end // Objest parameter delay_d1=128;// 対象物1の距離による遅れ時間 0.1us x delay_d1 a1=0.1; // 対象物1から返ってくる受信信号振幅 df=1/size_t*0.025;// 対象物1の速度によるドップラー効果周波数偏差比 f1=f*(1+df); // 対象物1から返ってくる受信信号周期 for i=0:size_t; i1=i1+i; df1=df1+df*2; // ドップラー効果が往復で発生している phase=phase+modu_wave(i+1)*Kv; send_wave(i+1)=sin(2*%pi*f*(t(i+1)+phase));// 送信信号の VCO の数式化 receive_sig(i+1)=a1*sin(2*%pi*f*(t(i+1)+phase));// 受信信号の VCO の数式化 receive_sig1(i+1)=a1*sin(2*%pi*f*(t(i+1)+phase+df1));// 速度を持つ物体の受信信号の VCO の数式化 end receive_wave(1,delay_d1+1:size_t)=receive_sig(1,1:size_t-delay_d1); receive_wave1(1,delay_d1+1:size_t)=receive_sig1(1,1:size_t-delay_d1); out_wave=abs(send_wave+receive_wave); out_wave1=abs(send_wave+receive_wave1); for j=1:size_t-ave_number+1 for k=j+1:j+ave_number ave_out(j)=ave_out(j)+out_wave(k); end for k=j+1:j+ave_number ave_out1(j)=ave_out1(j)+out_wave1(k); end end ave_out=ave_out/ave_number ave_out1=ave_out1/ave_number scf(1000);clf(1000) subplot(6,1,2); plot(t,send_wave) mtlb_axis([0, 1, -1.0 ,1.0]) subplot(6,1,1); plot(t,modu_wave) mtlb_axis([0, 1, 0 ,2.0]) subplot(6,1,3); plot(t,receive_wave,t,receive_wave1) mtlb_axis([0, 1, -0.5 ,0.5]) subplot(6,1,4); plot(t,send_wave+receive_wave,t,send_wave+receive_wave1); mtlb_axis([0, 1, -1.0 ,1.0]) subplot(6,1,5); plot(t,out_wave); mtlb_axis([0, 1, -1.5 ,1.5]) subplot(6,1,6); plot(t,ave_out) mtlb_axis([0, 1, -0.1 ,1]) out_wave=out_wave-mean(out_wave) // DC cut out_wave1=out_wave1-mean(out_wave1) // DC cut scf(1004);clf(1004) plot([0:2047],20*log10(abs(fft(out_wave(2800:4847)))),'r',[0:2047],20*log10(abs(fft(out_wave1(2800:4847)))),'g') mtlb_axis([0,20,-10,60]) scf(1005);clf(1005) plot([0:2047],20*log10(abs(fft(out_wave(5500:7547)))),'r',[0:2047],20*log10(abs(fft(out_wave1(5500:7547)))),'g') mtlb_axis([0,20,-10,60]) ↑ クリックをお願いします。 |
この記事に
この記事に
この記事に
|
前回、ミリ波レーダの前振りをして今回は FMCW という現実的な方法を説明しようと思っていましたが、前回の最後にちょっと触れた短い時間電波を照射してそれが反射して戻ってくるまでの時間を測定するという方法を「もしこれでやろうとするとどうなるか」を少し深掘りしてみようと思います。こういう妄想は頭のトレーニングになると信じていて、要は課題達成、問題解決のための引き出しを増やすことになるのではないかと思っています。
前回軽く計算したとおり、電波を何かに照射して戻ってくる時間を測定した場合、戻ってきたときには発信電波は終わっていないといけないので(受信アンテナ=送信アンテナの場合。違っても回り込まれたら同じ)、たとえば 10m を測定しようとしたら 67ns となってエネルギー的に短そう、かといって長い距離だけを測定しようとすると反射電力が小さいので(後で触れます)これも難しそうということでした。 その辺りの事情は置いておき、対象物の反射率が高くて、またアンテナの指向性も強いとしてそれなりの S / N で電波が戻ってくると云う前提とします。 そうならば、アナログ的には送信波、受信波を BPF などの強い共振回路を通して信号波の存在を確認して、それらの時間差を測定すればいいわけです。ただ、強い共振回路だとノイズに対しても勝手な共振信号を作ってしまうので、さじ加減が難しそうです。 デジタルでやる場合はどうでしょうか。デジタルフィルタで BPF を作ったらアナログ共振回路と同じことが起きて、ちょっとしたノイズをきっかけに共振周波数が続いてしまいそうです。そこで DFT というか、当該周波数の正弦波と余弦波を重畳してそのベクトル和を積分することで信号の存在が確認する方法が考えられます。 scilab スクリプトで確認してみます。 clear rand('seed',0) // 乱数のもと N=10000; // ポイント数 randomdata=((rand(1,N,'uniform'))-0.5) // 乱数発生 noise_m=0.1 // ノイズレベル attenation=0.2 // 受信信号レベル n=[1:N] t(n)=(n-1)/N t=t' frequency=200 // 発振周波数 frequency1=200 // 評価周波数 sig_size=1000 // 発振周波数の長さ t_delay=1600 // 戻ってくるまでの時間 sig_start=1001 // 送信信号のスタート時刻 sig_end=sig_start+sig_size-1 // 送信信号の終了時刻 rec_start=sig_start+t_delay // 受信信号のスタート時刻 rec_end=rec_start+sig_size-1 // 受信信号の終了時刻 s_sin=sin(2*%pi*frequency1*t) // 重畳正弦波 s_cos=cos(2*%pi*frequency1*t) // 重畳余弦波 sig(n)=0 sig(sig_start:sig_end)=sin(2*%pi*frequency .*t(1:sig_size)) // 送信信号生成 rec(n)=0 rec(rec_start:rec_end)=sin(2*%pi*frequency .*t(1:sig_size)) // 受信信号生成 rec_act=sig+attenation*rec+noise_m*randomdata' // トータル信号 mix1=s_sin.*rec_act // 正弦波重畳 mix2=s_cos.*rec_act // 余弦波重畳 s_power=abs(rec_act) // 受信信号レベル // clf(1);scf(1);plot(t,mix1,t,mix2,t,s_power) s_filter(1:N)=0 for i=1:N-sig_size s_filter(i)=(sum(mix1(i:i+sig_size-1))^2+sum(mix2(i:i+sig_size-1))^2)^0.5 // 信号照射時間単位での総レベル if s_power(i+1) < s_power(i) // レベル信号のピーク検出 s_power(i+1)=s_power(i)*0.99 end end delay=200 d_filter(1:N)=0 d_filter(delay+1:N)=s_filter(1:N-delay) // 距離検出のための遅延信号 pulse(1:N)=0 p_window(1:N)=0 for j=1:N if d_filter(j)>s_filter(j) // コンパレータ pulse(j)=1 end if s_power(j)>0.1 // ウィンド生成コンパレータ p_window(j)=1 end end s_filter(N-sig_size:N)=0 s_power(N-sig_size:N)=0 sig_axis0=[0,1,0,1.5] sig_axis1=[0,1,-1.5,1.5] sig_axis2=[0,1,0,0.5] clf(100);scf(100); subplot(4,1,1);plot(t,rec_act) mtlb_axis(sig_axis1) title('Received signal','fontsize',4) xlabel('Time','fontsize',2) ylabel('Level','fontsize',3) subplot(4,1,2);plot(t,s_power,t,p_window) mtlb_axis(sig_axis0) title('Burst signal','fontsize',4) xlabel('Time','fontsize',2) ylabel('Level','fontsize',3) legend('Burst signal','Signal window') subplot(4,1,3);plot(t,s_filter/sig_size,t,d_filter/sig_size) mtlb_axis(sig_axis2) title('Filtered signal','fontsize',4) xlabel('Time','fontsize',2) ylabel('Level','fontsize',3) legend('Filtered signal','Deleyed signal') subplot(4,1,4);plot(t,pulse,t,pulse.*p_window) mtlb_axis(sig_axis0) title('Position pulse','fontsize',4) xlabel('Time','fontsize',2) ylabel('Level','fontsize',3) legend('Peak position','Position pulse') そこかしこにコメントを入れておきましたが、照射時間単位で受信信号と正弦波余弦波それぞれを重畳してからその総和を取って、三角波のようなものを作り、そのピーク位置を検出するためそれを遅延したものとを比較して、ピーク位置が立ち上がりになるようなパルスを作ります。 で、その立ち上がり時間差が照射〜反射〜受信の時間を表す、というものです。 遅延と比較することでピーク検出できるからくりは、こちらをご覧下さい。 ピーク検出をしたいけど、微分器は難しい。 http://blogs.yahoo.co.jp/susanoo2001_hero/7543384.html この方式は同じレベルが続くとノイズで余分なパルスが出まくるので、受信信号の絶対値を取ってピーク検出を行い、送信波、受信波が存在している領域をウィンドとして取得しておき、ノイスを除去します。 結果はこんな風になりました。 一番下の緑の線の立ち上がり時間差を観測すれば距離を算出することが出来ます。 いかがでしょうか。上手くいきそうでしょうか。出来ないとすれば何が障害となるのでしょうか。 やはり S / N が気になりますね。それと周波数をどうするかが難しいです。ミリ波を使ったらどうなるかというと、その周波数をサンプリングする A / D コンバータが必要ですが、ちょっと技術的にどうか。かといって周波数を下げていくとアンテナは大きくなるし、指向性が悪くなります。一般にミリ波帯域だと光に周波数が近づいているので、直進性を良くすることが容易と云われています。 ただサンプリング周波数の話は解決手段があって、受信信号全体に一旦周波数の違う信号を足してビートを起こさせて、そのビートから送信タイミング、受信タイミングを検出する方法があります。いわゆるヘテロダインという方法です。 仮にそれでサンプリングの問題は解決したとしても大変そうですかね。 ところで今述べたヘテロダインという方法は FMCW 方式で出てきますので、今回はその前振りも兼ねています。(後付け) |
この記事に