luzihen 发表于 2015-11-1 02:40:58

IR箱模到底是什么?Impulse Response详解与实现(附代码和试听)

本帖最后由 luzihen 于 2015-11-1 02:49 编辑

   现在很火的IR箱体模拟技术相信大家都听说过,比如大名鼎鼎的two notes torpedo,再比如比较新的AMT Pangaea CP-100.这些硬件为跑场乐手,家庭录音提供了极大方便,让大家在没有真实箱体的情况下也能有丰满逼真的吉他声音.这里写一篇小文章通俗易懂的解释一下IR到底是什么,怎么运作的. 其实,IR这个东西并不是想象中那么复杂,真正理解之后我们甚至可以自己编程来实现自己IR.(下面会具体用简短matlab给大家实现一下,实用党可以把有关代码部分跳过.)

   IR全名叫做Impulse Response,中文意思为脉冲响应.首先要了解的是,我们实际上在做的是一个信号处理的工作.输入是没有箱体的吉他音频信号,输出信号是通过吉他箱体后被话筒拾取之后的音频信号.左边的图是真实的箱体拾音,右边是通过IR模拟这一个过程.

Fig.1 Real Cab vs. IR
    实际上,通过箱体和拾音,我们是把一个音频编成了另一个音频,就像下面这幅图.

Fig.2 Real Cab Input-Output
    我们现在希望做的是,通过一种方法,不经过箱体拾音,而是通过数学上的操作,来把上面的波形变成下面的.而且这个操作不仅要对这个波形有用,而且对其他波形也有用,也就是说要抓住这个箱体+拾音的特点.于是,聪明的科研民工们(在很早以前)发明了IR.
    我们仔细看一个(电子)音频文件,会发现,实际上它是由一个个小的脉冲构成的,就像下面这样.(红框子里的就是一个脉冲)

Fig.3 spikes in a wav file
    简而言之,我们可以把一段音频看做是很多个很短的脉冲(按时序)叠加而成的.也就是说,脉冲是构成音频的基本元素。现在,我们把一个单独的脉冲(上面红框子里的线)送到箱体里再用话筒拾取,我就得到了一个新的波形,就像下面的这样

Fig.4 IR
    注意这里我们得到了什么,这是问题的关键。这里我们得到的是最组成音频的最单位(脉冲)经过箱体+话筒处理后的结果。那么,既然每一段音频都是由很多脉冲构成的,那么我们对每一个脉冲都做这样的处理,那我们得到的音频是不是应该和真实的箱体+话筒一样呢?答案是,yes!(或者说很接近)这就是所谓的IR,上面的Fig.4就是IR文件。
    简而言之,我们先要得到箱体+话筒对单独一个脉冲的处理结果,然后做的就是对一个原始音频里的每一个组成单位,也就是每一个脉冲都这么做啦!就像下面的Fig.5

Fig.5 IR convolution
    其实说到这里,基本的原理应该说清楚了。下面讲一讲一些细节和matlab实现的方法,有兴趣的读一读,实际党可以忽略,直接听一下音频对比,体验一下结果。
    上面Fig.5里我们做了一件事情,就是对一段音频的每一个脉冲按照我们的IR进行处理(实际上就是把原来的脉冲换成脉冲响应IR,但是注意,原始音频里的脉冲是有高度的,我们的IR要做对应的拉伸或者收缩),然后我们把每一个处理完的脉冲叠加(也就是把响应叠加),这个过程就叫卷积convolution.鄙人不才,本科时候这个概念一直没懂,现在终于了解了。。。

Fig.6 convolution
    convolution实际上就是把信号的每一个小部分进行变换,然后再叠加起来,就像我们上面做的,对每一个脉冲进行处理,然后叠加。Fig.6中上面的式子是连续的积分形式,下面的就是实际操作的离散形式.红色框子里的是原始信号,绿色框子里的是脉冲响应.


    下面贴上matlab代码和分析. 非常简单,不要吐嘈我的matlab功底.
    第一部分,读取IR和原始音频,四行分别对应读取IR和三段失真节奏,失真主音和清音
= audioread('GuitarHack Original Centre.wav');
= audioread('dist_ryth.wma');
= audioread('dist_lead.wma');
= audioread('clean.wma');
    第二部分,进行卷积,就是对构成原始音频的每一个脉冲进行处理,让它变成脉冲响应,然后再叠加起来,这里matlab里面用conv命令就出来了,作两次是因为有两个声道,后面还有一个归一化是防止叠加以后信号太大。你可以把ryth_o换成clean_o或者lead_o来处理另外两个,这里只弄一下失真节奏做个示范。
y1= conv(ryth_o(:,1), IR(:,1)); %convolution
y2= conv(ryth_o(:,2), IR(:,2)); %convolution
y= ;
y= y/max(max(abs(y)));
    第三部分,播放,后面主食掉的两行是播放原始声音和把处理完的音频存储下来。
sound(y,fs);
%sound(ryth_o,fs1);
%wavwrite(y,fs,'save')

    下面贴上matlab用IR技术处理完原始音频的结果
http://www.tudou.com/v/KMqqwo8X_dk/&rpid=2656813&resourceId=2656813_04_05_99/v.swf
Audio.1 Raw vs IR
    这里对比的是吉他箱头的line out和IR处理以后的结果.一共四大段,第一段啪嗒啪嗒的就是各种IR,第二段是失真节奏,第三段是清音,第四段是solo.分别对比line out,IR和混合对比.

设备用的是
吉他Suhr Pro S1
箱头Marshall MG100晶体管
IR用的是免费的Red Wire Marshall+SM57
弄得很匆忙,也请不要吐嘈我的吉他技术...


题外话
    这里我们讨论了怎么样在有一个脉冲响应的时候来处理我们的声音。那么如果得到IR呢?上面我们看到,既然IR是箱体+话筒对一个脉冲的处理结果,那比较直观的办法是,我就直接对着箱体输出一个脉冲(啪的一声),然后用话筒拾取呗。想法很不错,看似也是对的,(我们不是
听了很多IR,感觉就是一些啪嗒声么?)实际上的IR并不是这么制作的,因为第一,脉冲在数学上是无穷短时间内发生的这不可能物力实现;第二,直接输出一个脉冲然后采样输出信号可能受到现在器材精度的限制,不能得到满意的结果(信号发生很快,振荡很大)。实际上,制作IR的时候是采用正弦波来做,然后进行一些数学变换,就能得道啪嗒啪嗒的脉冲响应,这样得到的结果更可靠。实际上很多大的插件厂商就在干这个事情,比如做IR的red wires,就成天拿各种话筒在各种摆放下对各种箱体进行采样。再比如做混响插件的,就成天世界各地到处跑,在大礼堂,大峡谷等地方进行采样。

    附件里面是matlab文件和运行所需的音频。

不知不觉写了这么多,先到这里了。写得比较多,留个名字,转载的话希望不要去掉。--翻滚的小卢比(GCID:luzihen)

luzihen 发表于 2015-11-1 02:48:23

出琴,哈哈
http://bbs.guitarschina.com/thread-1987430-1-1.html

tapies 发表于 2015-11-1 05:14:44

好厉害,虽然似懂非懂

Ecrofa 发表于 2015-11-1 08:46:43

有理论有实践啊,这个,才叫NB我大工科生万岁!

和谐小宝 发表于 2015-11-1 09:01:52

很好,这样解释就很通俗易懂了,除了方程式......,对楼主这样的技术贴表示感谢。

pa7anoid 发表于 2015-11-1 11:52:15

挺有意思的~~~

luzihen 发表于 2015-11-1 17:29:52

业火红莲 发表于 2015-11-2 08:43:39

给你点个赞

luzihen 发表于 2015-11-2 14:35:22

业火红莲 发表于 2015-11-2 08:43
给你点个赞

野火好久不见

指尖G星辰 发表于 2015-11-2 15:38:00

学电气的表示MATLAB居然还能干这个整天拿它仿真来着……

luzihen 发表于 2015-11-2 20:44:29

指尖G星辰 发表于 2015-11-2 15:38
学电气的表示MATLAB居然还能干这个整天拿它仿真来着……

...这不也是仿真么....物理模型不一样而以...

指尖G星辰 发表于 2015-11-3 12:06:24

luzihen 发表于 2015-11-2 20:44
...这不也是仿真么....物理模型不一样而以...

了解了解

mr.sun 发表于 2016-1-23 11:58:56

得到的点点滴滴

y900672524 发表于 2017-8-17 14:14:38

牛 逼

yuhao450000 发表于 2017-9-16 00:45:02

原理很简单,关键是在效果器中怎样做成实时性卷积,演奏时总不能弹完一首歌之后再做计算吧。

红桃杰克 发表于 2018-8-16 15:44:52

666,又学到了,感谢楼主赐教。

lrsngn 发表于 2020-2-3 22:14:25

牛逼啊楼主

嘉彬 发表于 2020-4-5 09:32:34

大牛人

simonhuo 发表于 2021-1-26 18:12:10

牛逼厉害建明以东

高草1 发表于 2021-9-2 14:26:52

我来挖个坟
页: [1]
查看完整版本: IR箱模到底是什么?Impulse Response详解与实现(附代码和试听)