本模块旨在帮助声学工程师了解编程的重要性,熟悉MATLAB环境,并掌握其核心语法,为后续的声学数据处理和分析打下坚实的基础。
MATLAB (Matrix Laboratory) 因其强大的数值计算能力、丰富的工具箱和友好的交互环境,成为声学工程师常用的编程语言之一。
A = [1, 2; 3, 4];
B = inv(A); % 矩阵求逆
help inv;
C = A * B; % 矩阵乘法
disp('A*inv(A) = '); disp(C);
% 示例:绘制一个简单的正弦波
t_plot = 0:0.001:0.1; % 0到0.1秒,步长0.001秒
f_plot = 50; % 50 Hz
y_plot = sin(2*pi*f_plot*t_plot);
plot(t_plot, y_plot);
xlabel('时间 (s)');
ylabel('幅值');
title('50 Hz 正弦波');
% doc plot % 打开 plot 函数的官方文档页面
help fft % 在命令行窗口显示 fft 函数的简要帮助
变量与数据类型
frequency = 1000; % 单位: Hz, 类型: double
SPL = 94.5; % 单位: dB, 类型: double
time_signal = [0.1, 0.2, 0.15, 0.22, 0.18]; % 行向量
mic_array_coordinates = [ 0 0 0; % 麦克风1 (x,y,z)
0.1 0 0; % 麦克风2
0 0.1 0]; % 麦克风3
filename = "mic_data_channel_1.wav";
is_clipping = (max(abs(time_signal)) > 0.95);
measurement_info = {'Mic_TypeA', 48000, [0.1, 0.2; 0.4, 0.5]};
acoustic_test.projectName = "Project Phoenix";
acoustic_test.samplingRate = 44100;
acoustic_test.microphone.type = "Condenser";
运算符
voltage = [1, 2, 3]; % V
resistance = [10, 20, 30]; % Ohm
current = voltage ./ resistance; % I = V/R (元素级除法)
在 MATLAB 中,* 和 .* 分别用于矩阵乘法和按元素乘法。理解其在维度要求和运算法则上的核心区别至关重要。核心对比
* (矩阵乘法) - 线性代数运算
* 用于标准的线性代数计算。例如,一个 2x3 矩阵乘以一个 3x2 矩阵,会得到一个 2x2 的结果矩阵。
% A (2x3) * B (3x2) -> C (2x2)
A = [1, 2, 3; 4, 5, 6];
B = [7, 8; 9, 10; 11, 12];
C = A * B
.*** (按元素乘法) - 逐点运算**
.* 用于将两个维度相同数组的对应元素相乘。
% X (2x3) .* Y (2x3) -> Z (2x3)
X = [1, 2, 3; 4, 5, 6];
Y = [10, 20, 30; 40, 50, 60];
Z = X .* Y
选择哪个运算符完全取决于你的数学模型:
-**使用 ***:当你处理线性代数问题时,如求解方程组、坐标变换、系统建模等。
-使用 .:当你需要对数据集的每个独立元素进行操作时,如对信号施加增益、计算逐点功率 (P = V . I)等。
控制流
signal_peak = 0.5;
if signal_peak > 0.9
disp('警告:信号可能已削峰!');
else
disp('信号电平适中。');
end
p_ref = 20e-6; % 参考声压
pressures = [0.02, 0.05, 0.1]; % Pa (RMS)
for p = pressures
spl = 20*log10(p/p_ref);
fprintf('声压 %.3f Pa -> SPL %.2f dB\n', p, spl);
end
acoustic_material = 'foam';
switch lower(acoustic_material)
case 'foam'
disp('吸声系数约为 0.7');
case '混凝土'
disp('吸声系数约为 0.05');
otherwise
disp('未知材料');
end
函数编写与调用
% function [outputArg1, outputArg2] = functionName(inputArg1, inputArg2)
% % 函数说明
% % 函数体
% outputArg1 = ...;
% outputArg2 = ...;
% end
% rms_pressure = 0.1; % Pa
% spl_value = calculateSPL(rms_pressure); % 调用自定义函数
% square_value = @(x) x.^2;
% result = square_value(5); % 结果为 25
到此,我们对声学工程师学习MATLAB的必要性、MATLAB的优势、开发环境以及核心语法有了初步的了解。这些基础知识是进行后续声学数据处理、可视化和算法实现的关键。建议多动手练习,熟悉MATLAB的各种操作。
附录:示例函数 (calculateSPL.m)
您可以将以下代码保存为 calculateSPL.m 文件,以便在您的脚本中调用。
ccc = calculateSPL(1)
function spl = calculateSPL(pressure_rms, p_ref_custom)
% calculateSPL 计算声压级 (SPL).
% SPL = calculateSPL(PRESSURE_RMS) 根据指定的均方根声压计算SPL,
% 参考声压默认为 20uPa.
% SPL = calculateSPL(PRESSURE_RMS, P_REF_CUSTOM) 使用自定义参考声压.
if nargin < 2 || isempty(p_ref_custom)
% nargin输入参数个数
help nargin;
% isempty() 是一个MATLAB函数,用于检查一个变量是否为"空"。用户有时会传入一个空数组 [] 来显式地告诉函数"请使用这个参数的默认值"。
p_ref_default = 20e-6; % 默认参考声压 20 micro Pascals
else
p_ref_default = p_ref_custom;
end
spl = 20*log10(pressure_rms ./ p_ref_default);
end