25-1010 从房间回声看懂离散卷积原理

news/2025/10/10 15:33:20/文章来源:https://www.cnblogs.com/scut4787749233/p/19133179

Figure 1:直达声在 t = 0 的冲激

在房间内,假设在 t = 0 时刻有一个强度为 1 的冲激信号(蓝色)。
由于房间存在反射,当声音传播一段时间(例如 延迟 10 个时刻)后,会在 t = 10 左右接收到第一个反射声(红色)。
随着时间推移,反射声的强度按指数衰减(这里用 exp(-at) 表示),这条红色曲线便是房间的冲激响应(Impulse Response),它描述了系统对单位冲激的全部响应。


 

Figure 2:直达声在 t = 5,强度为 0.8 的冲激

同理,当冲激信号(蓝色)延迟到 t = 5 时刻出现,强度为 0.8,
房间的反射声也相应延迟了 10 个时刻,在 t = 15 附近 才开始出现,且强度衰减到原来的 0.8 倍。
这说明系统是线性时不变的(LTI):延迟输入信号的时间,也只会让响应整体延迟相同的时间。


Figure 3:叠加两个冲激的响应

当两个冲激(t = 0 的蓝色脉冲和 t = 5 的蓝色脉冲)同时存在时,
系统的总响应就是这两个单独冲激响应的线性叠加(左图)

得到的房间反射声(下图红色)即输入信号(左上图)与房间脉冲响应(右上图)卷积的结果:


这正是卷积的核心思想:

系统的输出 = 输入信号的每个冲激 × 系统对冲激的响应,再全部叠加。


Figure 4:随机激励信号 u[n]

现在我们不再输入单一冲激,而是输入一段 t = 0 ~ 15 的复杂随机信号(蓝色)
可以把它看成由许多不同时刻、不同幅度的小冲激组成的序列。
每个小冲激都会激发出一个“缩放后、延迟后”的房间冲激响应,所有这些响应叠加起来,形成完整的输出信号。


Figure 5:手动叠加卷积 vs MATLAB conv函数

我们将随机信号拆分成若干个单位冲激,对每个冲激与 h[n] 卷积后叠加,得到手动卷积结果(第三个图蓝色)。
然后再用 MATLAB 内置的 conv 函数计算标准离散卷积(第三个图红色虚线)。
两者完全重合,验证了“逐个冲激叠加”的卷积定义确实与数学公式一致。
这就是卷积的本质:

输入信号中每个采样值,都会触发一个对应的冲激响应,输出信号就是这些响应的叠加。

最终得到的红色曲线就是系统对复杂激励的输出信号 y[n]
它等价于输入信号与房间冲激响应的卷积结果。
理解离散卷积后,再推广到连续时间,就能自然理解声学、信号处理中常见的卷积积分。

所有图的代码如下:

clear; clc;%% ================== 回声模拟 1:直达声在 t=0 ==================
n1 = 0:40;                  % 时间索引
u1 = zeros(size(n1));       % 原始信号
u1(1) = 1;                  % 直达声在 t=0% 回声参数
echo_delay1 = 10;           % 回声延迟
echo_start1 = echo_delay1 + 1;     % 回声开始时间索引
echo_amp1 = max(u1);        % 回声初始强度
a1 = 0.5;                   % 衰减系数% 添加回声
y1 = u1;                    % 初始化输出
for t = echo_start1:length(n1)-1y1(t+1) = y1(t+1) + echo_amp1 * exp(-a1 * (t - echo_start1));
end% 绘图
figure;
stem(n1, u1, 'filled'); hold on;         % 直达声
stem(n1, y1 - u1, 'filled'); hold off;   % 回声
xlabel('Time index n');
ylabel('Amplitude');
axis([-5 40 0 1.2]);
title('Impulse at t = 0 with echo delayed 10');
legend('Impulse', 'Echo');%% ================== 回声模拟 2:直达声在 t=5,强度为 0.8 ==================
n2 = 0:40;                  % 时间索引
u2 = zeros(size(n2));       % 原始信号
T = 5;                      % 直达声时间
u2(T+1) = 0.8;              % MATLAB 索引从 1 开始% 回声参数
echo_delay2 = 10;           % 回声延迟
echo_start2 = T + echo_delay2 + 1;    % 回声开始时间索引
echo_amp2 = 0.8;            % 回声初始强度
a2 = 0.5;                   % 衰减系数% 添加回声
y2 = u2;                    % 初始化输出
for t = echo_start2:length(n2)-1y2(t+1) = y2(t+1) + echo_amp2 * exp(-a2 * (t - echo_start2));
end% 绘图
figure;
stem(n2, u2, 'filled'); hold on;        % 直达声
stem(n2, y2 - u2, 'filled'); hold off;  % 回声
xlabel('Time index n');
ylabel('Amplitude');
axis([-5 40 0 1.2]);
title(['Impulse at t = ', num2str(T), ' with echo delayed 10']);
legend('Impulse', 'Echo');%% ================== 回声模拟 3:叠加信号(t=0 与 t=5) ==================
% 将两组激励与回声叠加
n_total = n1;               % 时间索引一致
u_total = u1 + u2;          % 叠加直达声
y_total = y1 + y2;          % 叠加回声响应% 绘图
figure;
stem(n_total, u_total, 'filled'); hold on;           % 总直达声
stem(n_total, y_total - u_total, 'filled'); hold off;% 总回声
xlabel('Time index n');
ylabel('Amplitude');
axis([-5 40 0 1.2]);
title('Combined impulses at t = 0 and t = 5 with echoes delayed 10');
legend('Combined Impulses', 'Combined Echoes');% 绘图
figure;
stem(n_total, y1 - u1, 'filled'); hold on;           % 总直达声
xlabel('Time index n');
ylabel('Amplitude');
axis([-5 40 0 1.2]);
title('Impulse response');%% ================== 回声模拟 4:随机信号卷积验证 ==================T = 15;                              % 信号长度为 T+1
n3 = 0:T;                           % 时间索引
u_rand = abs(randn(1, length(n3))); % 随机输入信号(非负)figure;
stem(n3, u_rand, 'filled'); hold on;           % 总直达声
xlabel('Time index n');
ylabel('Amplitude');
axis([-5 40 0 3]);
title('Stimulus');% ===== 假设系统的冲激响应 h[n](可替换为真实测得的 y1-u1) =====
% 这里举例假设冲激响应从第10个采样开始
h = y1 - u1;   % 延迟10采样,模拟“第一个回声在T+10时刻出现”
Lh = length(h);% ===== 手动卷积:逐个冲激叠加 =====
y_manual = zeros(1, length(u_rand) + Lh - 1);  % 预分配输出长度
for n = 1:length(u_rand)% 当前冲激输入信号(只有一个采样非零)delta = zeros(1, length(u_rand));delta(n) = u_rand(n);% 当前冲激响应的输出(延迟叠加)y_curr = conv(delta, h);% 累加所有冲激响应y_manual = y_manual + y_curr;
end% ===== 用 MATLAB 内置卷积函数验证 =====
y_conv = conv(u_rand, h);% ===== 绘图比较 =====
figure;
subplot(3,1,1);
stem(n3, u_rand, 'filled');
title('输入随机信号 u[n]');
xlabel('n'); ylabel('Amplitude');axis([-5 40 0 3.5]);subplot(3,1,2);
stem(0:length(h)-1, h, 'filled');
title('冲激响应 h[n] (第一个信号在 T+10 出现)');
xlabel('n'); ylabel('Amplitude');axis([-5 40 0 3.5]);subplot(3,1,3);
stem(0:length(y_manual)-1, y_manual, 'filled'); hold on;
stem(0:length(y_conv)-1, y_conv, 'r--');
legend('手动叠加结果','conv函数结果');
title('输出信号 y[n] 对比');
xlabel('n'); ylabel('Amplitude');
grid on;
axis([-5 40 0 3.5]);figure;
stem(0:length(y_manual)-1, y_manual, 'filled'); hold on;           % 总直达声
xlabel('Time index n');
ylabel('Amplitude');
axis([-5 40 0 3]);
title('Stimulus');

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(13)ASP.NET Core2.2 中的选项模式(Options) - 教程

(13)ASP.NET Core2.2 中的选项模式(Options) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

如何设计10亿用户级的微博Feed流系统并应对100W QPS的挑战?

随着社交平台用户量和内容数量的剧增,如何在技术架构上应对海量数据的实时处理,如何有效抵御极端流量带来的雪崩,成为每个互联网企业必须面对的核心问题。在这篇文章中,我们将详细解析微博Feed流的系统设计,如何利…

印度尼西亚股票实时数据API对接文档

概述 本文档详细说明如何对接StockTV全球股票API中的印度尼西亚股票数据。印尼股票市场是东南亚重要的金融市场之一,以雅加达综合指数为代表。 认证方式 所有API请求都需要在URL参数中包含API Key: key=您的API密钥基…

2025 年铝门窗厂家推荐榜,系统 / 智能 / 断桥 / 窄边 / 定制 / 全景 / 阳光房 / 隐框 / 隔声 / 防火铝门窗公司推荐

在当前铝门窗行业中,市场需求持续增长的同时,也面临着诸多亟待解决的问题。一方面,部分小型工厂缺乏完善的生产体系,生产的铝门窗产品在质量上难以保证,不仅材质不符合相关标准,在工艺细节上也存在诸多瑕疵,导致…

如何播放 M3U8 格式的视频

​ 要播放 M3U8 格式的视频,其核心在于使用正确的工具并获取有效的资源链接。您可以遵循以下详细步骤进行操作: 选择一款支持 M3U8 的播放器 这是成功播放的前提。请确保您安装的媒体播放器具备对 M3U8 格式或 HLS (…

20232304 2025-2026-1 《网络与系统攻防技术》实验一实验报告

20232304 2025-2026-1 《网络与系统攻防技术》实验一实验报告 1.实验内容 本次实验以 Linux 可执行文件pwn1为对象,核心目标是通过三种技术手段触发程序中默认不执行的getShell函数(获取交互式 Shell),同时掌握底层…

lsh 的源码注释(1)

lsh 的源码注释(1)我正在通过 git@github.com:brenns10/lsh 这个项目学习如何实现一个 Shell。今天为源码添加了第一遍注释。 还有很多问号hhh /*****************************************************************…

Codeforces Round 1056 (Div. 2) A~D

A - El fucho 模拟。 胜者组共有 \(n-1\) 队进入败者组,进入败者组的会淘汰 \(n-2\) 队,最后剩两组再进行一场,总场数 \(2n-2\)。 不会算也可以直接模拟。点击查看代码 #include <bits/stdc++.h>using i64 = …

现代软件工程阅读和提问作业-1

在学习本课程之前,一直会有一种疑惑,即什么是现代软件工程?软件的开发? 首先谈一谈我对软件的理解,我认为比如手机使用的APP,小程序以及任何通过鼠标或手指点击能够执行特定功能的“工具”都叫软件。

一种CDN动态加速回源白名单选路及降低源站探测量的方法

本文分享自天翼云开发者社区《一种CDN动态加速回源白名单选路及降低源站探测量的方法》.作者:蒋辉 本方案主要包括以下几个方面: 1)本发明提出了一种减少跨运营商探测源站及回源的方法,技术方案流程图见附图1,具体…

Windows系统-应用问题全面剖析Ⅰ:德承工控机DA-1200在Windows操作系统下[开机黑屏]的解决方法 - Johnny

Windows系统作为全球市场份额最高的操作系统,承载着企业办公、个人娱乐、工业应用等多元场景需求。然而,在使用过程中若出现应用崩溃、兼容性冲突、性能出现异常等系统应用问题时,将会直接影响到用户体验甚至是生产…

Java文件路径/服务器路径的获取

Java文件路径/服务器路径的获取Java文件路径/服务器路径的获取 大家好,又见面了,我是你们的朋友全栈君。Java文件路径获取几种获取方式 getResourceAsStream ()返回的是inputstreamgetResource()返回:URLClass.getRe…

某中心在旧金山设立AGI实验室专注长期AI研究

某中心在旧金山成立全新AGI实验室,专注于开发能够在数字和物理世界执行任务的人工智能代理。实验室将结合大语言模型与强化学习技术,致力于实现能够从人类反馈中学习、自我修正并推断目标的实用AI系统。某中心在旧金…

Appcrawler自动遍历工具-智能遍历测试与测试用例生成

效率与成本的抉择 在软件开发过程中,测试环节直接影响产品质量和用户体验。随着系统迭代频繁、功能复杂化,企业在测试方法的选择上面临困境:手工测试灵活却效率低,自动化测试高效却前期投入大。那么,我们到底应该…

[USACO20FEB] Clock Tree S

一开始读错题意了。 然后以为自己做法假了,实际并没有。 有 \(O(n)\) 做法但我写的是 \(O(n^2)\) 的。 换根dp就行了,每次判断一下能不能成功。 注意如果到最后根是 \(1\) 也是可以成功的。点击查看代码 #include<…

完整教程:【Spark+Hive+hadoop】人类健康生活方式数据分析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

mysql查看表大小,4种实用方法

MySQL数据库运维中,掌握表的大小信息对于性能优化、容量规划和维护工作至关重要。本文将详细介绍4种查看MySQL表大小的实用方法,帮助你精准掌握数据库存储状况。 方法1:查看单个表的完整大小信息 使用以下SQL可以查…

微算法科技(NASDAQ:MLGO)开发延迟和隐私感知卷积神经网络分布式推理,助力可靠人工智能系统技术

随着人工智能(AI)技术的不断发展,智能服务的广泛应用正在深刻改变着各行各业的面貌。在这个过程中,基于深度学习的系统往往面临计算资源的巨大需求,尤其是在边缘设备上运行复杂的卷积神经网络(CNN)时,计算负载…

不止节能,更能 “生钱”:MyEMS 辅助企业参与电力现货市场的实操案例

随着我国电力市场化改革的不断深化,电力现货市场从试点逐步走向常态化运行。对于用电大户企业而言,这既是机遇 —— 可通过灵活调整用电策略享受电价波动红利,也是挑战 —— 传统用电模式难以应对复杂的电价机制,往…

当能耗监控变 “游戏”:MyEMS 可视化看板如何让员工主动参与节能?

在企业节能管理中,“员工被动接受监控” 是长期存在的痛点 —— 传统能耗数据报表枯燥难懂,员工既不清楚自己的行为与能耗的关联,也缺乏主动节能的动力。而 MyEMS(My Energy Management System)可视化看板的出现,…