【微实验】MATLAB 仿真实战:多普勒效应 —— 洒水车音乐的音调变化仿真

一、实验背景

多普勒效应是声学与物理学科中的经典知识点,描述了波源与观察者相对运动时,接收频率偏离固有频率的现象。日常中洒水车驶过身边时,喇叭音调 "先高后低" 就是典型的多普勒效应表现,但抽象的频率偏移规律难以仅凭公式理解。本文通过 MATLAB 搭建物理模型,模拟洒水车播放 "小星星" 乐曲、先靠近再远离观察者的场景,生成可播放的音频文件并可视化频率变化,让抽象规律转化为可听、可见的实验结果。

二、实验原理

2.1 多普勒效应核心公式

本次实验聚焦波源运动、观察者静止的场景(洒水车运动,人站定不动),声学多普勒效应公式为:f=f0​⋅v−vs​v​参数说明:

  • 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 编辑器的 "运行" 按钮(▶),代码将自动执行以下操作:

  1. 生成无多普勒效应的 "小星星" 基础音频;
  2. 分阶段计算洒水车靠近 / 远离时的频率偏移,生成带多普勒效应的音频;
  3. 实时播放音频,同时将音频保存为wav文件(保存在当前工作目录);
  4. 绘制 "频率偏移曲线" 和 "音频波形对比图";
  5. 在命令行窗口输出声学环境关键参数。

步骤 3:验证实验结果

  1. 听觉验证 :播放生成的Doppler_Effect_Star.wav文件,可清晰感知前半段(洒水车靠近)音调偏高,后段(洒水车远离)音调偏低;
  2. 视觉验证:查看生成的图表,若洒水车速度设为20m/s,频率曲线在靠近阶段稳定在 278Hz 左右,远离阶段稳定在 247Hz 左右,与理论计算一致;
  3. 参数验证:命令行输出的声学参数符合多普勒效应公式推导结果。

带多普勒效应的音频已保存: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 倍

六、实验拓展

  1. 调整运动速度 :修改代码中v_source参数(如改为 30m/s),速度越大频偏越明显,音调变化更突出;
  2. 加入声强衰减:添加距离衰减因子1/r2(r为实时距离),模拟 "靠近声音大、远离声音小" 的真实效果;
  3. 更换音频素材 :替换note_freq数组为 "生日快乐""两只老虎" 等简谱频率,验证多普勒效应的普适性;
  4. 模拟观察者运动:修改公式为观察者运动、波源静止的形式(f=f0⋅(v+vo)/v,vo为观察者速度),拓展实验场景。

七、实验总结

本次微实验通过 MATLAB 完成了多普勒效应的全流程仿真,核心收获如下:

  1. 直观验证了 "波源靠近时接收频率升高(音调高)、远离时频率降低(音调低)" 的物理规律,解决了公式抽象难懂的问题;
  2. 掌握了 MATLAB 生成音频、计算频率偏移、可视化声学特征的核心方法,可迁移至其他声学仿真场景;
  3. 理解了声学环境参数(声速、运动速度)对多普勒效应的量化影响,深化了对公式中各参数物理意义的认知。

本次实验的优势在于 "可听 + 可见 + 可量化",既符合物理教学的实验要求,也能通过简单的代码实现让初学者快速上手,是理解多普勒效应的高效实践方案。

相关推荐
寻星探路9 小时前
【Python 全栈测开之路】Python 基础语法精讲(一):常量、变量与运算符
java·开发语言·c++·python·http·ai·c#
朔北之忘 Clancy9 小时前
2020 年 6 月青少年软编等考 C 语言一级真题解析
c语言·开发语言·c++·学习·算法·青少年编程·题解
csbysj20209 小时前
组合实体模式
开发语言
万物皆字节9 小时前
Spring Cloud Gateway 启动流程源码分析
java·开发语言·spring boot
问水っ9 小时前
Qt Creator快速入门 第三版 第16-7章 其他内容
开发语言·qt
C_心欲无痕9 小时前
ts - 关于Object、object 和 {} 的解析与区别
开发语言·前端·javascript·typescript
Evand J9 小时前
【课题推荐】基于超分辨率技术的低功耗定位系统|低功耗物联网|信号处理。附MATLAB运行结果
物联网·matlab·信号处理
a程序小傲10 小时前
得物Java面试被问:方法句柄(MethodHandle)与反射的性能对比和底层区别
java·开发语言·spring boot·后端·python·面试·职场和发展
独自破碎E10 小时前
比较版本号
java·开发语言