基于IMAGE法的房间回响模型创建、C++代码实现、matlab仿真

基于IMAGE法的房间回响模型创建、C++代码实现、matlab仿真

1.模型简介

\qquad在处理声音信号时,我们要对信号先进行采集。那么我们就必须要有,一个发出声音的声源,一个进行声音采集的传感器。并且这两者一般都位于房间之中,处于房间内,就不可避免的会有声音的回响,那么声源发出的信号和传感器实际接受的信号就会有一定差别。我们就利用计算机建立这么一个房间模型,来模拟传感器在一个会有声音回响的房间中接收声源信号的情景。
\qquad基于IMAGE法的房间回响模型的建立,有两个假设条件,一是我们假设房间是具有规则的几何特征;二是声音在墙面的反射符合镜面反射原理。
\qquad这里我们不对IMAGE法的原理做介绍,有需要的小伙伴可以参考梁瑞宇老师的《语音信号处理 C++版》的273面。

2.C++代码实现

运行环境:windows10+Visual Studio 2019
函数功能:返回房间回响模型的单位脉冲信号响应
参数说明:fs为采样率;mic为传感器位置;n为虚拟声源个数;r为反射系数;rm为房间大小;src为声源位置

\qquad下面代码是源文件内容,我们设计一个长6米,宽3米,高3米的房间,房间长为x轴,宽为y轴,高为z轴,整个房间处于三维坐标系的第一卦限,则房间大小rm={6,3,3};声源位置src={ 4,1,1.5 };传感器位置mic = { 1,1.5,1 };墙壁的发射系数为r=0.4;传感器的采样频率fs=44100;虚拟源个数为n=5。以上的数据都是可在源文件的主函数中改动。主函数如下:

#include<iostream>
#include<vector>
#include <stdio.h>
#include<fstream>
#include"f1.h"
using namespace std;int main()
{int i;//fs为采样率;mic为传感器位置;n为虚拟声源个数;r为反射系数;rm为房间大小;src为声源位置int fs = 44100;vector<double>mic = { 1,1.5,1 };int n = 5;double r = 0.4;vector<double>rm = { 6,3,3 };vector<double>src = { 4,1,1.5 };//函数返回回响模型的模拟传感器的脉冲信号vector<double>h;h = rir(fs, mic, n, r, rm, src);ofstream file;file.open("demo.csv");for (i = 0; i < h.size(); i++){file << h[i] << endl;}file.close();return 0;
}

头文件中"f1.h"的代码如下:

#include<iostream>
#include<vector>
using namespace std;//函数返回回响模型的模拟传感器的脉冲信号
//fs为采样率;mic为传感器位置;n为虚拟声源个数;r为反射系数;rm为房间大小;src为声源位置
vector<double>rir(int fs, vector<double>mic, int n, double r,vector<double>rm, vector<double>src);

头文件中“f1.cpp”的代码如下:

#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
#include<string>
using namespace std;vector<double>rir(int fs, vector<double>mic, int n, double r, vector<double>rm, vector<double>src)
{vector<int>nn;int i;for (i = -n; i <= n; i++){nn.push_back(i);}vector<double>rms, srcs, xi, yj, zk;for (i = 0; i < nn.size(); i++){rms.push_back(nn[i] + 0.5 - 0.5 * pow(-1, nn[i]));srcs.push_back(pow(-1, nn[i]));}for (i = 0; i < nn.size(); i++){xi.push_back(srcs[i] * src[0] + rms[i] * rm[0] - mic[0]);yj.push_back(srcs[i] * src[1] + rms[i] * rm[1] - mic[1]);zk.push_back(srcs[i] * src[2] + rms[i] * rm[2] - mic[2]);}typedef vector<vector<vector<double>>> vector3;vector3 d(nn.size(), vector<vector<double>>(nn.size(), vector<double>(nn.size(), 0)));vector3 li(nn.size(), vector<vector<double>>(nn.size(), vector<double>(nn.size(), 0)));vector3 lj(nn.size(), vector<vector<double>>(nn.size(), vector<double>(nn.size(), 0)));vector3 lk(nn.size(), vector<vector<double>>(nn.size(), vector<double>(nn.size(), 0)));vector3 time(nn.size(), vector<vector<double>>(nn.size(), vector<double>(nn.size(), 0)));vector3 c(nn.size(), vector<vector<double>>(nn.size(), vector<double>(nn.size(), 0)));vector3 e(nn.size(), vector<vector<double>>(nn.size(), vector<double>(nn.size(), 0)));int j, k;for(i=0;i<nn.size();i++)for (j = 0; j < nn.size(); j++)for (k = 0; k < nn.size(); k++){li[i][j][k] = xi[i];lj[i][j][k] = yj[j];lk[i][j][k] = zk[k];}for (i = 0; i < nn.size(); i++)for (j = 0; j < nn.size(); j++)for (k = 0; k < nn.size(); k++){d[i][j][k] = sqrt(li[i][j][k]* li[i][j][k]+ lj[i][j][k]* lj[i][j][k]+ lk[i][j][k]* lk[i][j][k]);double tem = fs * d[i][j][k] / 343;int temi;if (tem - int(tem) >= 0.5)temi = int(tem) + 1;else temi = int(tem);time[i][j][k] = temi + 1;c[i][j][k] = pow(r, abs(i) + abs(j) + abs(k));e[i][j][k] = c[i][j][k] / d[i][j][k];}vector<int> tempT;for (i = 0; i < nn.size(); i++)for (j = 0; j < nn.size(); j++)for (k = 0; k < nn.size(); k++){tempT.push_back(time[i][j][k]);}int maxLength = *max_element(tempT.begin(), tempT.end());vector<double>h(maxLength, 0);for (i = 0; i < nn.size(); i++)for (j = 0; j < nn.size(); j++)for (k = 0; k < nn.size(); k++){h[time[i][j][k] - 1] += e[i][j][k];}return h;
}

\qquad在设定好参数,运行之后,我们会得到一个“demo.csv”的文件,这就是传感器在混响的房间中接收到的信号,也就是房间回响模型的单位脉冲响应。全部的代码和运行得到的文件可以参考我的GitHub,链接:Room-Impulse-Response

3.matlab仿真

\qquad在得到房间的脉冲响应之后,假设声源出播放的是另外的声音,那么我们仅仅是对上一步的脉冲响应和这段声音信号进行卷积,注意它们两者的采样率要相同,我们利用matlab进行实现。
运行环境:windows10+matlab2020a

[y,fs] = audioread("song.wav");%脉冲响应波形图
subplot(321);
x1 = ((0:1:length(h)-1)/fs)';
y1 = h;
plot(x1,y1);
xlabel("时间/s");
ylabel("幅值");
title("脉冲响应波形图");
grid on;%脉冲响应幅频图
subplot(322);
x2 = ((0:1:length(h)-1)*fs/length(h))';
y2 = fft(h);
y2_m = abs(y2);
plot(x2,y2_m);
xlabel("频率/HZ");
ylabel("幅值");
title("脉冲响应幅频图");
grid on;%原始信号波形图
subplot(323);
x3 = ((0:1:length(y)-1)/fs)';
y3 = y;
plot(x3,y3);
xlabel("时间/s");
ylabel("幅值");
title("原始信号波形图");
grid on;%原始信号幅频图
subplot(324);
x4 = ((0:1:length(y)-1)*fs/length(y))';
y4 = fft(y);
y4_m = abs(y4);
plot(x4,y4_m);
xlabel("频率/HZ");
ylabel("幅值");
title("原始信号幅频图");
grid on;%卷积信号波形图
subplot(325);
y5 = conv(y,h);
x5 = ((0:1:length(y5)-1)/fs)';
plot(x5,y5);
xlabel("时间/s");
ylabel("幅值");
title("卷积信号波形图");
grid on;%卷积信号幅频图
subplot(326);
x6 = ((0:1:length(y5)-1)*fs/length(y5))';
y6 = fft(y5);
y6_m = abs(y6);
plot(x6,y6_m);
xlabel("频率/HZ");
ylabel("幅值");
title("卷积信号幅频图");
grid on;%播放原始信号声音
sound(y,fs);pause(10);%播放在房间中采集到的信号
sound(y5,fs);

运行程序,我们可以得到:
在这里插入图片描述
全部的matlab仿真文件,可以查看我的GitHub,链接:Room-Impulse-Response-matlab

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

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

相关文章

花落有机化学!诺贝尔化学奖不再是“理综奖”

来源&#xff1a;学术头条北京时间 2021 年 10 月 6 日下午 5 点 50 分&#xff0c;2021 年诺贝尔化学奖重磅公布&#xff0c;德国马普煤炭研究所所长 Benjamin List、普林斯顿大学化学教授 David W.C. MacMillan 获奖&#xff0c;以表彰他们对“不对称有机催化做出的贡献”。关…

牛客 16499 解方程 (数学、Python)

同个人网站 https://www.serendipper-x.cn/&#xff0c;欢迎访问 &#xff01; 链接&#xff1a;https://ac.nowcoder.com/acm/problem/16499 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语…

美军认知技术发展态势

来源&#xff1a;人机与认知实验室摘要&#xff1a;美军正在大力发展人工智能中的认知技术&#xff0c;认知技术的进步将极大的促进人机融合智能的发展。首先&#xff0c;综述了美军认知技术的发展历史&#xff0c;从自然语言处理、环境感知、机器人自主控制、自主编组协调、人…

正则表达式写验证器

package com.office.utility;import java.util.regex.Pattern;/*** 校验器&#xff1a;利用正则表达式校验用户名、密码、邮箱、手机号等* author liujiduo*/ public class Validator {/*** 正则表达式&#xff1a;验证用户名*/public static final String REGEX_USERNAME &qu…

【操作系统复习】中断和异常

同个人网站 https://www.serendipper-x.cn/&#xff0c;欢迎访问 &#xff01; 中断和异常一、中断机制的诞生二、中断的概念和作用三、中断的分类四、外中断的处理过程一、中断机制的诞生 &#x1f481; 早期的计算机&#xff1a;各程序只能串行执行&#xff0c;系统资源利用…

东南亚的招聘骗局,程序员请注意!

阅读本文大概需要 5.2 分钟。 总有些我认为是常识的事情&#xff0c;在别人看来都是第一次接触。很多骗局都是如此&#xff0c;圈内人不上当&#xff0c;圈外人不警惕。毕竟骗子吃的就是信息不对称的生意。关于东南亚的招聘骗局&#xff0c;便是如此。 他们当前主力针对的是程序…

2021年深度学习哪些方向比较有研究潜力?

来源&#xff1a;知乎问答作者&#xff1a;陀飞轮、Zhifeng、谢凌曦转自&#xff1a;极市平台深度学习成为近些年来较为热门的领域&#xff0c;算法工程师这一岗位也变得越发的抢手&#xff0c;尽管已经踏入了这一领域但对整体的大环境其实是还不能够准确的把握。从研究方向去看…

视觉感知与认知

2. 视觉感知与认知 2. 视觉感知与认知2.1 感知与认知2.1.1 视觉感知处理过程2.1.2 格式塔理论2.1.2.1 贴近法则 (proximity)2.1.2.2 相似法则 (similarity)2.1.2.3 连续原则 (continuity)2.1.2.4 闭合原则 (closure)2.1.2.5 共势原则 (common fate)2.1.2.6 好图原则 (good figu…

高文:拥抱人工智能

转自&#xff1a;《中国信息化周报》2020年40期本文根据中国工程院院士高文公开演讲整理而成&#xff0c;未经本人确认高文&#xff0c;中国工程院院士什么叫人工智能呢&#xff1f;人工智能是人类智能的一个计算机的实现&#xff0c;从对决的角度&#xff0c;它永远不可能超过…

3.6数对 (Python)

链接&#xff1a;https://ac.nowcoder.com/acm/contest/12478/C 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 在3月6日&#xff0c;作为队内数…

互联网大脑的发育与元宇宙的兴起

2021年10月2日&#xff0c;《互联网大脑的发育与元宇宙的兴起》是远望智库数字大脑研究院院长刘锋博士受奇点O论坛的邀请所做的一个发言&#xff0c;从互联网大脑模型的发育角度&#xff0c;探讨了元宇宙兴起的原因和规律&#xff0c;同时对元宇宙面临的问题和对产业的影响进行…

小凡做蛋糕(Python)

链接&#xff1a;https://ac.nowcoder.com/acm/contest/12478/G 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 65536K&#xff0c;其他语言131072K 64bit IO Format: %lld 一开始把整个二维数组填好了&#xff0c;然后…

对于使用progisp软件进行ISP编程时进入不了编程模式的解决方法

目录 对于使用progisp软件进行ISP编程时无法进入编程模式的解决方法前提说明Win10 解决方法Win10 "禁用强制驱动程序签名"Win10 手动安装驱动。Win7解决方法Win7 "禁用强制驱动程序签名"Win7 手动安装驱动说明标题: 对于使用progisp软件进行ISP编程时无法进…

陈杰院士:多无人系统协同中的人工智能安全探索

来源&#xff1a;中国工程院院刊作者&#xff1a;施文、王楷文、俞成浦、孙健、陈杰&#xff0c;控制理论与控制工程专家、中国工程院院士。多无人系统协同作为一项人工智能的颠覆性技术&#xff0c;将在空间上分布的无人系统有机连接起来&#xff0c;在给社会创造价值的过程中…

圆的交点 (Python)

链接&#xff1a;https://ac.nowcoder.com/acm/contest/12478/D 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 2&#xff0c;1的样例 一层一层找规律…

linux的常用操作——基于ftp的windows10和腾讯云centos操作系统之间的文件上传和下载

\qquad在腾讯云服务器的centos操作系统上&#xff0c;安装vsftpd并进行配置&#xff0c;然后基于ftp实现windows10操作系统和腾讯云centos系统之间的文件上传和下载。 文章目录1.基于腾讯云服务器centos的操作系统的vsftpd的安装和配置2.基于ftp实现windows10和linux之间的文件…

这些超级高效的人工神经元不使用电子?

Nanofluidic slits in this artificial neuron prototype mimic the ion channels in the brain. PAUL ROBIN/LABORATOIRE DE PHYSIQUE DE LENS来源&#xff1a;IEEE电气电子工程师在能源使用和信息传输能力方面&#xff0c;设计模仿人脑的电子系统是科学研究的圣杯。尽管人工…

工具资源系列之给虚拟机装个windows

前面我们介绍了如何在 mac 宿主机安装 VMware 虚拟机软件,本节我们将继续介绍如何给虚拟机安装镜像,切换不同的操作系统. VMware 软件是容器,镜像是内核,这里的镜像指的是操作系统. 下载镜像 windows 操作系统下载: https://msdn.itellyou.cn/ 按照实际需要选择适合自己的操作系…

单位的换算 (Python)

链接&#xff1a;https://ac.nowcoder.com/acm/contest/12482/C 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 今天小松鼠正在做他的物理作业&…

从科学简历看研究方法——爱因斯坦探索性的演绎法

来源&#xff1a;贾贵儒科学网博客链接地址&#xff1a;http://blog.sciencenet.cn/blog-3444430-1307033.html历史中最重要的是思想方法&#xff0c;不注重思想方法的历史则很容易成为大事记 演绎。爱因斯坦在100年前就明确地指出&#xff1a;“适用于科学幼年时代的以归纳法…