• atwiki
  • ProMemo
  • ドップラー効果(Doppler Effect)の編集履歴ソース
「ドップラー効果(Doppler Effect)」の編集履歴(バックアップ)一覧に戻る

ドップラー効果(Doppler Effect) - (2009/09/26 (土) 19:39:15) のソース

*&this_page()
|&tags()|最終更新日 &date()|&link_pdf(text=PDFで表示)|View &counter(total)|
----

*説明
ドップラー効果(Doppler Effect)とは「波の発生源と観測者の相対的な速度によって波の周波数が異なって観測される現象」のこと、発生源が近付く場合には波の振動が詰められて周波数が高くなり、遠ざかる場合は振動が伸ばされて周波数低くなる。

#image(800px-Doppler_effect_diagrammatic.png,width=300,height=50,title=ドップラー効果)


音波の例でいうと、救急車が近付くときにはサイレンの音が高く、遠ざかる時には低く聞こえるのはこのドップラー効果による現象。

音源(Source)と観測者(Listener)が同一直線上を移動する場合。(ただし、音源→観測者方向が正とする)
|音速|$$V$$|
|音源が出す周波数|$$f_{Source}$$|
|音源の速度|$$V_{Source}$$|
|観測者の速度|$$V_{Listener}$$|
|観測者に届く周波数|$$f_{Listener}$$|

$$f_{Listener} = f_{Source}*\frac{V-V_{Listener}}{V-V_{Source}}$$


*ソースコード
ソースコードの全文と実行結果はこちらをどうぞ
[[ドップラー効果(Doppler Effect)-CPP]]

**必須環境
|OpenAL|ALUT|

**要点
ドップラー効果をOpenALで実装するには以下の二つの関数を用いてドップラー効果の設定を行う。
 alDopplerFactor(ALfloat DOPPLER_FACTOR)
 alDopplerVelocity(ALfloat DOPPLER_VELOCITY)

この設定を用いて、新しい観測周波数は
 shift = DOPPLER_FACTOR * frequency * (DOPPLER_VELOCITY - listener.velocity) / (DOPPLER_VELOCITY + source.velocity)
みたいな感じに計算されるらしい。


なので、ソースコードは以下のようになるっぽい。。。

単純にPosition += Velocityとすると移動が早すぎてまったく聞こえないので適当に補正値を掛けてみたり
 //Position += revise*Velocity
 const float revise = 0.000003;

音源と観測者が離れすぎると音が聞こえなくなるので、最大距離を決めとく。
 ALfloat SourceMaxDist = 80.0;//これ以上離れると初期位置に戻る

ドップラー効果に関する設定
 #define DOPPLER_FACTOR 0.5f
 #define DOPPLER_VELOCITY 10.0f

音源の再生を開始し、音源の初期位置を記憶、ドップラー効果の設定を行う。
 // 再生開始
 alSourcePlay(Source);
	
 //初期値を保存
 ALfloat SourceDefPos[] = { SourcePos[0], SourcePos[1], SourcePos[2] };
 
 //ドップラー効果の設定
 alDopplerFactor(DOPPLER_FACTOR);
 alDopplerVelocity(DOPPLER_VELOCITY);

移動開始、ドップラー効果に関係があるのは「*」の行。(他はループ再生用)
 while(!kbhit()){//キーボード入力があるまでループ
	far=AL_FALSE;
	
	for(i=0;i<3;i++){
		//座標を更新
		SourcePos[i] += revise*SourceVel[i];//*
		//音源と観測者の距離が遠い?
		if( sqrt(abs(pow(SourcePos[i],2)+pow(ListenerPos[i],2)) ) > SourceMaxDist) far = AL_TRUE;
	}
	//遠かったらはじめの位置に戻る
	if(far) for(i=0;i<3;i++) SourcePos[i]=SourceDefPos[i];

	alSourcefv(Source, AL_POSITION, SourcePos);//*
 }

*参考文献
[[ドップラー効果>http://ja.wikipedia.org/wiki/ドップラー効果]]
[[OpenAL Lesson 7: The Doppler Effec>http://www.devmaster.net/articles/openal-tutorials/lesson7.php]]

----
目安箱バナー