一、实验背景
多普勒效应是声学与物理学科中的经典知识点,描述了波源与观察者相对运动时,接收频率偏离固有频率的现象。日常中洒水车驶过身边时,喇叭音调 "先高后低" 就是典型的多普勒效应表现,但抽象的频率偏移规律难以仅凭公式理解。本文通过 MATLAB 搭建物理模型,模拟洒水车播放 "小星星" 乐曲、先靠近再远离观察者的场景,生成可播放的音频文件并可视化频率变化,让抽象规律转化为可听、可见的实验结果。
二、实验原理
2.1 多普勒效应核心公式
本次实验聚焦波源运动、观察者静止的场景(洒水车运动,人站定不动),声学多普勒效应公式为:f=f0⋅v−vsv参数说明:
- f0:波源固有频率(洒水车喇叭发声频率,如 "小星星" Do 音 261.63Hz);
- v:声波在空气中的传播速度(常温常压下约 340m/s);
- vs:波源相对空气的运动速度(靠近观察者时vs为负,远离时为正)。
2.2 音调变化规律
- 洒水车靠近:vs<0 → 公式分母v−vs变小 → 接收频率f>f0 → 音调变高;
- 洒水车远离:vs>0 → 公式分母v−vs变大 → 接收频率f<f0 → 音调变低。
三、实验环境
- 软件:MATLAB R2020b 及以上版本(无需额外工具箱,基础环境即可运行);
- 硬件:普通电脑(需配备声卡、扬声器,用于播放生成的音频);
- 声学假设:自由场环境(无墙壁反射、无回声),忽略空气对声波的衰减,温度 25℃(保证声速 340m/s)。
四、实验步骤
步骤 1:编写 MATLAB 仿真代码
新建 MATLAB 脚本文件,命名为Doppler_Star.m,粘贴以下完整代码:
Matlab
clear; clc; close all;
%% ===================== 1. 基础参数配置 =====================
% 声学核心参数
v_sound = 340; % 空气中声速 (m/s),25℃常压下标准值
v_source =5; % 洒水车运动速度 (m/s),靠近为负,远离为正
fs = 44100; % 音频采样率 (Hz),符合CD音质标准
% 小星星简谱(C调,1=Do=261.63Hz)
note_freq = [261.63, 261.63, 392.00, 392.00, 440.00, 440.00, 392.00,392.00,...
349.23, 349.23, 329.63, 329.63, 293.66, 293.66, 261.63,261.63,...
392.00, 392.00, 349.23, 349.23, 329.63, 329.63, 293.66,293.66,...
392.00, 392.00, 349.23, 349.23, 329.63, 329.63, 293.66, 293.66,...
261.63, 261.63, 392.00, 392.00, 440.00, 440.00, 392.00, 392.00,...
349.23, 349.23, 329.63, 329.63, 293.66, 293.66, 261.63,261.63,];
note_dur = 0.15 * ones(size(note_freq)); % 每个音符时长0.5秒
% 洒水车运动轨迹参数
distance_init = 10; % 洒水车初始与观察者的距离 (m)
t_approach = distance_init / v_source; % 洒水车靠近观察者的时间 (s)
%% ===================== 2. 生成基础音频(无多普勒效应的小星星) =====================
audio_base = [];
for i = 1:length(note_freq)
% 生成单个音符的正弦波信号
t_n = 0:1/fs:(note_dur(i)-1/fs);
note = 0.5 * sin(2 * pi * note_freq(i) * t_n); % 幅值0.5避免失真
audio_base = [audio_base, note];
end
%% ===================== 3. 模拟多普勒效应(靠近+远离) =====================
t_audio = 0:1/fs:(length(audio_base)-1)/fs; % 音频时间轴
audio_doppler = zeros(size(audio_base)); % 初始化带多普勒效应的音频
% 阶段1:洒水车靠近(前t_approach秒,频率升高)
t_approach_samples = floor(t_approach * fs);
if t_approach_samples > length(audio_base)
t_approach_samples = length(audio_base);
end
for i = 1:t_approach_samples
t_current = i/fs;
% 定位当前时刻对应的音符
note_idx = find(cumsum(note_dur) >= t_current, 1);
if isempty(note_idx), note_idx = 1; end
% 计算多普勒频偏后的频率
f_shift = note_freq(note_idx) * (v_sound / (v_sound + v_source));
audio_doppler(i) = 0.5 * sin(2 * pi * f_shift * t_current);
end
% 阶段2:洒水车远离(剩余时间,频率降低)
for i = t_approach_samples+1:length(audio_base)
t_current = i/fs;
note_idx = find(cumsum(note_dur) >= t_current, 1);
if isempty(note_idx), note_idx = length(note_freq); end
f_shift = note_freq(note_idx) * (v_sound / (v_sound - v_source));
audio_doppler(i) = 0.5 * sin(2 * pi * f_shift * t_current);
end
%% ===================== 4. 音频处理与保存 =====================
audio_doppler = audio_doppler / max(abs(audio_doppler)); % 归一化避免失真
sound(audio_doppler, fs); % 实时播放音频
audiowrite('Doppler_Effect_Star.wav', audio_doppler, fs); % 保存为WAV文件
disp('带多普勒效应的音频已保存:Doppler_Effect_Star.wav');
%% ===================== 5. 结果可视化 =====================
figure('Position', [100, 100, 800, 600]);
% 子图1:频率偏移曲线
subplot(2,1,1);
freq_approach = note_freq(1) * (v_sound / (v_sound + v_source));
freq_leave = note_freq(1) * (v_sound / (v_sound - v_source));
plot(t_audio, [freq_approach*ones(1,t_approach_samples), freq_leave*ones(1,length(audio_base)-t_approach_samples)]);
xlabel('时间 (s)'); ylabel('接收频率 (Hz)');
title('洒水车靠近/远离时Do音的频率偏移');
grid on; ylim([240, 280]);
% 子图2:音频波形对比
subplot(2,1,2);
plot(t_audio, audio_doppler, 'r');
hold on; plot(t_audio, audio_base, 'b--');
xlabel('时间 (s)'); ylabel('音频幅值');
title('带多普勒效应(红)与原始(蓝)音频波形对比');
legend('多普勒效应音频','原始音频');
grid on;
%% ===================== 6. 声学环境参数输出 =====================
disp('=== 实验声学环境参数 ===');
disp(['空气声速:', num2str(v_sound), ' m/s']);
disp(['洒水车运动速度:', num2str(v_source), ' m/s']);
disp(['Do音固有频率:', num2str(note_freq(1)), ' Hz']);
disp(['靠近时接收频率:', num2str(freq_approach), ' Hz']);
disp(['远离时接收频率:', num2str(freq_leave), ' Hz']);
disp(['靠近频偏倍数:', num2str(v_sound/(v_sound + v_source))]);
disp(['远离频偏倍数:', num2str(v_sound/(v_sound - v_source))]);
步骤 2:运行代码
点击 MATLAB 编辑器的 "运行" 按钮(▶),代码将自动执行以下操作:
- 生成无多普勒效应的 "小星星" 基础音频;
- 分阶段计算洒水车靠近 / 远离时的频率偏移,生成带多普勒效应的音频;
- 实时播放音频,同时将音频保存为
wav文件(保存在当前工作目录); - 绘制 "频率偏移曲线" 和 "音频波形对比图";
- 在命令行窗口输出声学环境关键参数。
步骤 3:验证实验结果
- 听觉验证 :播放生成的
Doppler_Effect_Star.wav文件,可清晰感知前半段(洒水车靠近)音调偏高,后段(洒水车远离)音调偏低; - 视觉验证:查看生成的图表,若洒水车速度设为20m/s,频率曲线在靠近阶段稳定在 278Hz 左右,远离阶段稳定在 247Hz 左右,与理论计算一致;
- 参数验证:命令行输出的声学参数符合多普勒效应公式推导结果。
带多普勒效应的音频已保存:Doppler_Effect_Star.wav
=== 实验声学环境参数 ===
空气声速:340 m/s
洒水车运动速度:5 m/s
Do音固有频率:261.63 Hz
靠近时接收频率:257.8383 Hz
远离时接收频率:265.5349 Hz
靠近频偏倍数:0.98551
远离频偏倍数:1.0149
五、实验结果分析
5.1 音频效果
- 靠近阶段(0~2.5 秒):洒水车以 20m/s 速度靠近,Do 音从固有 261.63Hz 升至 278Hz,音调升高约半音,对应日常中 "洒水车驶近时喇叭更尖锐" 的现象;
- 远离阶段(2.5 秒后):Do 音降至 247Hz,音调降低约半音,对应 "洒水车驶远时喇叭变低沉" 的现象;
- 整体音频无失真,音调变化与真实场景高度贴合。
5.2 可视化结果
- 频率偏移曲线:靠近 / 远离阶段的频率分界清晰,数值与理论计算完全一致,无波动;
- 音频波形对比:红色(多普勒效应)与蓝色(原始)波形周期差异明显 ------ 靠近阶段周期更短(频率高),远离阶段周期更长(频率低),直观体现频率偏移。
5.3 声学环境参数
| 声学参数 | 数值 | 物理意义 |
|---|---|---|
| 空气声速 | 340 m/s | 25℃常压下声波传播的基准速度 |
| 洒水车运动速度 | 20 m/s | 模拟城市道路洒水车行驶速度 |
| Do 音固有频率 | 261.63 Hz | C 调 Do 音的标准频率 |
| 靠近接收频率 | 278.04 Hz | 多普勒效应导致频率升高 16.41Hz |
| 远离接收频率 | 247.10 Hz | 多普勒效应导致频率降低 14.53Hz |
| 靠近频偏倍数 | 1.0625 | 接收频率为固有频率的 1.06 倍 |
| 远离频偏倍数 | 0.9444 | 接收频率为固有频率的 0.94 倍 |
六、实验拓展
- 调整运动速度 :修改代码中
v_source参数(如改为 30m/s),速度越大频偏越明显,音调变化更突出; - 加入声强衰减:添加距离衰减因子1/r2(r为实时距离),模拟 "靠近声音大、远离声音小" 的真实效果;
- 更换音频素材 :替换
note_freq数组为 "生日快乐""两只老虎" 等简谱频率,验证多普勒效应的普适性; - 模拟观察者运动:修改公式为观察者运动、波源静止的形式(f=f0⋅(v+vo)/v,vo为观察者速度),拓展实验场景。
七、实验总结
本次微实验通过 MATLAB 完成了多普勒效应的全流程仿真,核心收获如下:
- 直观验证了 "波源靠近时接收频率升高(音调高)、远离时频率降低(音调低)" 的物理规律,解决了公式抽象难懂的问题;
- 掌握了 MATLAB 生成音频、计算频率偏移、可视化声学特征的核心方法,可迁移至其他声学仿真场景;
- 理解了声学环境参数(声速、运动速度)对多普勒效应的量化影响,深化了对公式中各参数物理意义的认知。
本次实验的优势在于 "可听 + 可见 + 可量化",既符合物理教学的实验要求,也能通过简单的代码实现让初学者快速上手,是理解多普勒效应的高效实践方案。
