多普勒效应交互课件
这个互动程序要实现的是沪科技版选必一第三章 第五节 多普勒效应中的图 3–38、3–39、3–40,如下图所示。
做出的成品如下所示:
物理知识的总结
多普勒效应的核心规律可以概括为一句话:波源与观察者相对靠近时,接收频率升高;相对远离时,接收频率降低;相对速度越大,频率变化越明显。
设波源频率为 f,声速为 v,波源速度 vs,观察者速度 vo。则接收到的频率
\[f' = f{\rm{\cdot}}\frac{{v \pm {v_{\rm{o}}}}}{{v \mp {v_{\rm{s}}}}}\]
观察者靠近波源时:分子取 v + vo,远离时分子取 v − vo;波源靠近观察者时:分母取 v − vs,远离时分母取 v + vs。
通常我们研究 2 种典型情况:1.波源动、观察者静止,则 fʹ = \(\dfrac{v}{{v \mp {v_{\rm{s}}}}}\)f;2.观察者动、波源静止,则 fʹ = \(\dfrac{{v \pm {v_{\rm{o}}}}}{v}\)f。
而频率变化量近似与相对速度成正比:
\[\frac{{\Delta f}}{f} \approx \frac{{{v_{相对}}}}{v}\]
由上式可知相对速度越大,频移越大;原频率越高,同样的相对速度产生的绝对频移越大。
对人耳而言,约 1% 的变化(1000 Hz 下约 10 Hz):多数人会觉得音高有变化,但不算特别强烈。约 2% ~ 3% 的变化(约 20 ~ 30 Hz):通常可以明确听出“音调不一样了”,属于比较明显的区别。5% 以上(约 50 Hz以上):会感到音高明显改变。
若声速取 340 m/s,对 1000 Hz 声音,相对速度约 7 ~ 10 m/s 时频移约 2% ~ 3%,人耳已能明显察觉音调变化。若要求变化 50 Hz(5%),则速度约 17 m/s(约 61 km/h)。
这就导致了课堂上要做演示实验效果不太好。我在上这节课时播放了一段救护车从靠近到远离观察者时的视频,效果比较明显。接下来用手机播放 1000 Hz 的音频,然后转动手臂让学生听音调的变化,效果就一般了,学生往往还会将响度变化和频率变化混淆。
在上海空中课堂中使用了 DIS 声传感器,音响发出的声音频率为 3000 Hz,由前面的分析可知,频率越高频率变化也越大,效果会好一点,但即便如此,实验中测得的频率为 3014 Hz,人耳几乎是无法分辨频率的变化的。由公式可以推得放在滑轨小车上的音响的速度大小约为 1.58 m/s,在教室环境中很难获得足够大的速度。
这个课件将声源的频率设置为 1000 Hz、初始速度设置为声速的一半——170 m/s,根据公式,当声源靠近观察者时,接收到的声音频率为 fʹ = \(\dfrac{{340}}{{340 - 170}}\)f = 2f = 2000 Hz,当声源远离观察者时,fʹ = \(\dfrac{{340}}{{340 + 170}}\)f = \(\dfrac{2}{3}\)f = 667 Hz。
有一个违反直觉的结论:当声源以 170 m/s 靠近观察者时,接收到的声音频率为 fʹ = 2000 Hz,反之,当观察者以 170 m/s 靠近声源时,接收到的声音频率为 fʹ = \(\dfrac{{340 + 170}}{{340}}\)f = 1.5f = 1500 Hz。波源运动和观察者运动的效果并不对称,因为介质(空气)提供了参考系。
光不需要介质,规律由相对论给出:
\[f' = f\sqrt {\frac{{1 \mp \beta }}{{1 \pm \beta }}} ,\beta = \frac{v}{c}\]
与声波不同,光的多普勒效应只取决于相对速度。
天文学家观测一个遥远星系时,会拍到它的光谱。光谱中有许多特征谱线(比如氢的巴耳末线 Hα、Hβ,以及钙的 K 线、H 线等)。这些谱线在实验室里测得的静止波长是已知的,例如:氢的 Hα 线静止波长:λ = 656.3 nm(红光)。
假设观测某个遥远星系时,发现它的 Hα 线出现在:
λʹ =721.9 nm
也就是说,谱线向长波方向移动了:
Δλ = 721.9 − 656.3 = 65.6 nm
红移定义为:
\[z = \frac{{\Delta \lambda }}{\lambda } = \frac{{65.6}}{{656.3}} \approx 0.0995\]
对于光源与观察者相互远离的情形:
\[1 + z = \sqrt {\frac{{1 + \beta }}{{1 - \beta }}} \]
\[\beta = \frac{{{{(1 + z)}^2} - 1}}{{{{(1 + z)}^2} + 1}}\]
代入 z = 0.09995,解得 β ≈ 0.09498。
所以:
v = βc ≈ 0.09498×3.0×105 km/s ≈ 0.1c
编程要点
多普勒频率的计算
若声源、观察者的速度方向在两者的连线上,设它们的速度大小都为 100 m/s,相互靠近,声源的频率为 1000 Hz,则根据公式可知观察者接收到的声音频率为
\[f' = f{\rm{\cdot}}\frac{{v + {v_{\rm{o}}}}}{{v - {v_{\rm{s}}}}} = 1000{\rm{\cdot}}\frac{{340 + 100}}{{340 - 100}}{\rm{Hz}} \approx 1833\;{\rm{Hz}}\]
注意:算出的频率是不变的,初学者很容易根据火车鸣笛的声调变化误认为接近时频率是不断增加的。
若相对速度方向与两者连线不在一条直线上的情况中,频率才是不断变化的。如下图所示。
多普勒效应只关心声源与观察者连线方向上的相对运动。当两者不在一条直线上时,先要把速度投影到两者连线的单位向量上,得到“径向速度”(视向速度)。
具体计算方法是:
1.求连线方向单位向量(从声源指向观察者),上图中:
\[{\bf{\hat n}} = (0.8,0.6)\]
2.求各自的径向速度(沿连线方向的分量),用的是矢量点乘:
\[{v_{{\rm{s}}\parallel }} = {{\bf{v}}_{\rm{s}}}{\rm{\cdot}}{\bf{\hat n}} = 80,{v_{{\rm{o}}\parallel }} = {{\bf{v}}_{\rm{o}}}{\rm{\cdot}}{\bf{\hat n}} = 80\]
3.代入多普勒公式
\[f' = f{\rm{\cdot}}\frac{{v - {v_{{\rm{o}}\parallel }}}}{{v - {v_{{\rm{s}}\parallel }}}} = 1000{\rm{\cdot}}\frac{{340 - ( - 80)}}{{340 - 80}}{\rm{Hz}} \approx\; 1615{\rm{Hz}}\]
具体代码如下:
上述代码还考虑了声音传播的时间——频率变高/低不是即时起作用的,需要考虑延迟,音源超声速传播时产生的激波也要在波源离开你之后才会发生,但这些代码搞得我头晕脑胀,AI 也有点晕,我切换到 DeepSeek 4.1 Pro 勉强达到了想要的效果,只是积分消耗得有点多,所以就不写原理了。
Web Audio API
calculateObservedFrequency() 方法中得到的频率值会被 startSound() 方法调用,它使用 Web Audio API 播放声音。
Web Audio API 是一套用于在浏览器中创建、处理和合成音频的 JavaScript 接口。它于 2021 年成为 W3C 正式推荐标准,无需插件即可在网页上实现复杂的音频功能。
理解 Web Audio API,关键在于掌握三个概念:
1.音频上下文:所有操作的“容器”。你需要先创建一个 AudioContext 实例,它管理着内部的音频节点和音频处理线程。
2.音频节点:音频图的基本单元。每个节点负责一项具体任务,比如产生声音、调节音量或施加效果。
3.音频图:节点通过 connect() 方法连接而成的网络。一个典型的音频图从源节点开始,流经效果节点,最终连接到目的地节点(通常是你的扬声器)。
下面的代码可以产生一个持续输出的 1000 Hz 正弦波。
完整代码
发布时间:2026/11/11 21:52:34 阅读次数:11