【matlab版】如何利用代码计算声音信号的响度

响度(Loudness)

声音信号的响度是指人耳对声音强度的主观感受,它与声音的声压级(Sound Pressure Level, SPL)有关,但并不是直接等同于物理上的声压级。响度反映了人耳感知到的声音大小,通常用"响度单位"(Phon或Sone)来表示。

影响响度的因素

声压级:声音的物理强度越大,响度通常也越大。声压级以分贝(dB SPL)为单位,代表声波的物理强度。

频率:人耳对不同频率的声音感知敏感度不同。中频(约1kHz至5kHz)的声音在相同的声压级下听起来更响,而低频和高频的声音则相对不那么响。

持续时间:在一定范围内,声音持续的时间越长,人耳感受到的响度也会增加。

声源的环境和距离:声音在传播过程中会衰减,距离越远,听到的响度越低。此外,环境的吸声和反射特性也会影响响度的感知。

响度与声压级的关系

为了量化响度与声压级的关系,研究人员提出了"等响度曲线"(Equal-Loudness Contours),这组曲线展示了在不同频率下达到相同响度所需的声压级。例如,在1kHz频率下,40分贝的声压级和在100Hz频率下约60分贝的声压级听起来一样响。

上图为"等响度曲线",展示了在不同频率下达到相同响度所需的声压级。图中曲线对应了不同的响度等级(Phon),例如40 Phon、60 Phon、80 Phon和100 Phon。可以看到,在低频和高频区域,为了达到相同的响度,需要更高的声压级,而在中频区域(特别是1kHz附近),较低的声压级就能达到相同的响度。这反映了人耳对中频声音更敏感的特性。

①根据自己所定义的声音信号及其采样频率绘制波形图及其响度图
Matlab 复制代码
% 定义参数
fs = 44100;  % 采样频率 (Hz)
t = 0:1/fs:5;  % 时间轴 (5秒)

% 生成随机声音信号 (白噪声)
signal = randn(size(t));

% 绘制声音波形图
figure;
subplot(2, 1, 1);
plot(t, signal);
title('声音波形图');
xlabel('时间 (秒)');
ylabel('幅度');
grid on;

% 设计A计权滤波器
A_weighting = weightingFilter('A-weighting', fs);

% 应用A计权滤波器到信号
weighted_signal = A_weighting(signal);

% 计算响度(近似): 通过对A计权信号的平方值取均值,再取对数
% 这里的响度不是严格的感知响度,而是一个基于A计权后的能量值
loudness = sqrt(mean(weighted_signal.^2));

% 绘制响度图 (使用滑动窗口来模拟响度随时间变化)
window_size = fs;  % 1秒的窗口
num_windows = floor(length(weighted_signal) / window_size);
loudness_values = zeros(1, num_windows);

for i = 1:num_windows
    window = weighted_signal((i-1)*window_size + 1:i*window_size);
    loudness_values(i) = sqrt(mean(window.^2));
end

time_values = (0:num_windows-1) * (window_size / fs);

subplot(2, 1, 2);
plot(time_values, loudness_values);
title('响度图(基于A计权)');
xlabel('时间 (秒)');
ylabel('响度 (A计权)');
grid on;
②根据示波器中导出的波形图(csv文件即为excel表格)绘制波形图及其响度图
Matlab 复制代码
% 使用 uigetfile 函数让用户交互式选择文件
[file, path] = uigetfile('*.CSV', 'Select the CSV file');
if isequal(file, 0)
    disp('User selected Cancel');
else
    fullFilePath = fullfile(path, file);

    % 读取CSV文件
    data = readtable(fullFilePath);

    % 提取时间和振幅数据
    t = data{:,1}; % 如果表格的列顺序是固定的,可以使用索引
    x = data{:,2}; % 如果表格的列顺序是固定的,可以使用索引

    % 绘制波形图
    figure;
    subplot(2,1,1); % 在一个图中绘制两个子图
    plot(t, x);
    xlabel('时间(s)');
    ylabel('幅度');
    title('波形');
    grid on;

    % 计算响度(简单地使用振幅的绝对值作为响度)
    % 实际上可以使用更复杂的响度计算方法,例如使用短时傅里叶变换(STFT)
    % 或者音频信号处理工具箱中的函数
    loudness = abs(x);

    % 绘制响度图
    subplot(2,1,2);
    plot(t, loudness);
    xlabel('时间 (s)');
    ylabel('响度');
    title('响度');
    grid on;
end
相关推荐
SeaTunnel1 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影2 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Marst Code2 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao121313 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
CRMEB系统商城4 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience5 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
我的xiaodoujiao5 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具
j7~5 小时前
【Linux】二十二.《Linux 信号机制完全指南:表示、捕捉与处理》
linux·信号处理·volatile·可入重函数·保存信号
爱喝水的鱼丶5 小时前
SAP-ABAP:ALV通用封装实践——搭建可复用的ALV开发工具类,减少80%重复代码
开发语言·性能优化·sap·abap·erp·alv
脱胎换骨-军哥6 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust