音频应用

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
查看: 594|回复: 0

[技术] 混响算法以及原理

[复制链接]

9

帖子

0

听众

366

积分

音频应用新手发布

Rank: 1

积分
366
发表于 2019-10-5 10:40:45 | 显示全部楼层 |阅读模式
1.引言
2 d8 u" h0 Q3 e& z0 k- Y/ Z- Q
  q6 a0 ]" M. u0 a  b8 ja、什么是混响
, G2 X1 C- j. w$ O6 R
/ }. I+ i+ U- {/ p2 R混响主要用于唱卡拉OK,增加话筒声音的延时,产生适量的回声,使唱歌的声音更圆润更优美,歌声不那么“干”。  H6 R6 ~* x: G, v' Zwww.audioapp.cn  audio app

9 L1 L& O/ J' Lwww.audioapp.cn  audio app

t013cbae91e8c9387b8.jpg
( n- [2 V' ]5 B. e! ]5 S) @  y. o4 s什么是回声?
6 q/ e- k4 h- L  P) q: _2 x/ e, Q) ?0 B: v9 cwww.audioapp.cn  audio app

回声:在一个方向的延迟反射5 y3 T  n) R6 N( Bwww.audioapp.cn  audio app

8 D2 @5 @: m( F" v! ]7 ]$ a* e" }9 Iwww.audioapp.cn  audio app

混响:在多个方向的多次延迟反射6 c% n0 u( V% Dwww.audioapp.cn  audio app


3 |& E9 x2 C+ Z% k3 K7 ~b、混响算法的发展史
9 y( X/ \+ P% r" o6 `1 {
" \1 N5 e# Q% T. \' Q! \l 硬件混响设备) [+ k  i9 Y. c4 v8 Dwww.audioapp.cn  audio app

1 b/ h/ }5 I/ Q5 \" twww.audioapp.cn  audio app

一般原理就是现场采集ir(impulse response) 如练声房,录音棚,音乐厅等
7 e/ |! t9 `6 c' \7 _4 _3 \5 z1 {6 p2 a/ Awww.audioapp.cn  audio app

t016ad8becacb8cf829.jpg
4 P! H% ?3 N7 {$ e4 O+ Y
3 \0 o7 z( Y2 t( j. yl 软件混响
- F* A5 t7 A1 u$ n
: g+ L0 \  l1 ?* i发展到后期,因为数字信号处理的发展,和可编程门阵列芯片产生,就习惯将提前采集好的ir通过算法做卷积运算。
: B& U( I0 ?; w5 t+ b4 {0 T
. j" ^% f( m3 S( a* {算法混响就此产生,后期又通过很多人员的努力产生了房间声学的模拟算法。
" v( ~1 {! M; S! {7 ~( j, a& e5 f! ?6 q3 P# i6 jwww.audioapp.cn  audio app

所以在软件混响里面,基本有两种一种是ir,另一种房间声学的模拟算法。* b2 T7 Y1 S* x7 Vwww.audioapp.cn  audio app

0 P; c7 f9 E& U6 h# a- R) Cwww.audioapp.cn  audio app

我们能看到的像freeverb3这两种都有,而sox等其他一般只看到后面一种。目前能看到的如下:) ^( {; S. |& d5 l' ]7 b. pwww.audioapp.cn  audio app

3 Y( l- L- A; d5 Wwww.audioapp.cn  audio app

回声类:echo ,echos! ]0 y! D1 a" r2 T1 o* I' j: C5 Swww.audioapp.cn  audio app

) t, A5 t2 L8 W, V; G* Swww.audioapp.cn  audio app

ir类:model1 model2 model38 y# g% P& Y, ]www.audioapp.cn  audio app

  Q6 ?+ ?/ a5 Y! \5 m4 @1 owww.audioapp.cn  audio app

schroeder类: 简易schroeder,复杂schroeder,schroeder优化版moorer+ c3 Y3 M" H# L$ Ewww.audioapp.cn  audio app

8 e& ~$ f8 ~5 i# B* y6 K7 g: Vwww.audioapp.cn  audio app

2、混响算法及推导" \! ^# W' v* S1 ]7 k: a$ Gwww.audioapp.cn  audio app


7 h' ]- y3 }0 T5 C0 `/ na、观察房间声音的模型+ p) n: a8 x, R  t& g; l% jwww.audioapp.cn  audio app

t0181ac65628ddccfed.jpg : Q3 h+ h! o( s# Q+ n! ^, l+ }" awww.audioapp.cn  audio app


" f* L( y' b* Q7 L6 I" e% s我们看下上面的图,假设我们在一个房间里,说话者和听者所在的空间声音应该是这个样子的如图。听者听到的包括直达的信号外还有很多反射声音。这里我们关注两点一个是房间的大小,另外一个是反射强度。
, u) S! F) W2 J: \
8 `& f0 R/ ~- J7 t当如果这个房间非常大,那么基本上听不到反射。
9 |7 w$ K. |' I+ E; o/ }
0 B, h. d7 _" o# o; C同样的道理,一个房子的材质会影响反射强度,如金属和木质两种不同材质做的房子,反射效果显然是不一样的。
" |' K* i% Y; m# X" E- y% o3 d0 R/ B" I' v6 ~) rwww.audioapp.cn  audio app

b、建立初步数学模型。0 c2 b, R6 O( t/ J0 f) W3 Z! t6 X( rwww.audioapp.cn  audio app

+ V0 _0 P. |7 ^. _( o# R' Awww.audioapp.cn  audio app

假设说话者说出的信号是x[n]
' h  ^4 a$ n; f1 D3 Q  O5 [  _1 U9 Q! D2 D# X! Owww.audioapp.cn  audio app

听者某时刻接收到的信号是y[n],那么y[n]包含那些内容呢?. Z- K+ c* R0 N/ ]( L9 G! x3 q% lwww.audioapp.cn  audio app


+ B& Y  Q! U, a& H1 t, Ty[n] 应该是 x[n] + 反射1 + 反射2 .......
, M+ D) r( h" j4 F7 d' O+ x* X4 ~4 d) I$ Owww.audioapp.cn  audio app

反射怎么表示,它应该是x[n] 的延时我们假设延时m ,难么反射1 应该是 x[n -m] ,但是我们还应该考虑反射时的衰减,就是上面所说的房子的反射效果,假设是a,则反射1 应该表示成 x[n -m]*a;) |! X, w. C1 e& E) pwww.audioapp.cn  audio app

& T% `; y8 \% G( I$ Fwww.audioapp.cn  audio app

所以,y[n] = x[n] + a*x[n -m] + a^2*x[n - 2m] + a^3*x[n - 3m]......
; c; C  e& g# c4 x( F. d1 w5 F# d+ S# _3 @* Kwww.audioapp.cn  audio app

求和我们简化下,利用差分或者z变化得到差分方程:
) f9 z, o. L4 h8 g2 k, Z! B
: I6 u2 i$ K4 ]3 xy[n] = ay[n - m] + x[n];
/ ?3 k, C! G3 Y4 A) p) Y7 \8 O& m) R4 M' D: Awww.audioapp.cn  audio app

这是个梳妆滤波器
8 n, t- E, Y4 a, U2 o' \% h) A
  Q1 e" A) ^, N4 U% \, J3 T它的频谱特性. U+ Z* _2 Q8 Zwww.audioapp.cn  audio app

0 ]! ^( W6 w- G4 Wwww.audioapp.cn  audio app

* ^, F* H( y% J3 z( J" twww.audioapp.cn  audio app

t01570e7b2c851c90ae.jpg
* n# h" D' @$ H( E! r! e& L% V) a, t' o3 S0 R0 uwww.audioapp.cn  audio app

由此我们就可以根据这个公式写出自己的算法。按道理这样应该就可以了,
% c( ~8 U- }9 t$ }8 S# o% D
$ S/ Y+ h' L' V9 R) @- o. P) P但是这个算法存在,回声密度比较低的问题会出现金属质感,听起来不舒服,不自然。
: w' c6 P: X, l5 D! d/ U- r; n+ L8 h& E: h! fwww.audioapp.cn  audio app

c、对初步数学模型的优化-----全通
3 Z4 m; t# @  S6 }! j& J7 ~5 F* Z1 gwww.audioapp.cn  audio app

怎么办呢?怎么去解决这种梳状滤波器带来的频谱不平坦,和回声密度不够,一些做信号处理的专家立马想到了,使用全通系统去改善它。
& w( o! f& x, I, P8 f4 l
6 h6 G: R) ]. B4 \6 `5 n9 S; h: B因为我们知道全通系统,有很好的群延时,所以可以增加回声的密度。全通表达式如下:4 a! x8 u! \2 B. M% a3 p  lwww.audioapp.cn  audio app


7 W* F1 o: a7 f% g: {9 Oy[n] = -gx[n] + x[n-m] +gy[n-m];
2 `" s0 F- V7 w- ?3 V
' I6 {& R& o" n9 v: k/ Y( r它的频谱特性6 m  I  j& I+ a, hwww.audioapp.cn  audio app


( [( W# I+ d9 F5 W8 i- T它的幅度谱 和 相位谱. w+ K  [6 {7 i8 v/ U  Z! cwww.audioapp.cn  audio app

t01b7071f3021e11e52.jpg
8 r4 F* N% ~  {5 C8 K
. y; c. `5 u) U- a; n6 N4 a他的零极点都是单位元对称的。7 k; v9 y1 Y* E$ o( Q2 iwww.audioapp.cn  audio app


! a- L5 |. i$ q7 \1 x; d7 V6 v, N频谱平坦6 b0 M* w* d) Owww.audioapp.cn  audio app


1 e  q( C  M4 i! b. S" N0 S* v# `相位延迟" g9 ^9 ]; f: f2 Dwww.audioapp.cn  audio app

9 v/ k! {1 l* E" S' V3 U( |www.audioapp.cn  audio app

d、对初步数学模型的优化-----Schroeder混合模型的提出
( U4 d4 ~1 \! {3 r
. k. l6 M( Q6 R; P这样增加了全通以后好多,但是还是不够。这个时候有个叫Schroeder的人提出了一个很吊的方案。称之为Schroeder混响模型。
% F& A' Q3 I' h" |. \9 X, H% x9 i( c. H, n8 [1 e3 Lwww.audioapp.cn  audio app

t01f5775eb4671c5a3e.jpg % z" N2 o& E- d/ K* @; h. G6 Owww.audioapp.cn  audio app

这种模型得到很好的工业生产。
0 q3 S$ B; V1 S* m/ a6 L! s! x' V% [" z) I9 gwww.audioapp.cn  audio app

e、对初步数学模型的再优化-----Moorer对Schroeder的优化
8 E; x' r' A/ J1 U- |, J; k5 [6 O5 Fwww.audioapp.cn  audio app

但是总有更吊的人在后面。
3 h" R  a8 {# i  y
2 w  ^$ J0 e# L) j& c, C/ ]8 T4 |Moorer对Schroeder的混响提出三点点改善意见,/ [" |+ L, j0 h, {6 O1 Y4 }www.audioapp.cn  audio app

* `$ e# u  K/ x) M, xwww.audioapp.cn  audio app

第一:需要考虑信号在空间传播高频衰减因素,加入低通滤波器使高频衰减。6 g: n2 V/ W0 zwww.audioapp.cn  audio app


$ \0 H. h) `" _  U/ E4 u) s第二:后面的全通应该嵌套使用,这样会有更好的群延时,: V5 d* w$ W( y  ^www.audioapp.cn  audio app

0 _. f. f3 U9 r8 \- u) Uwww.audioapp.cn  audio app

第三:可以增加前级反馈,形成早反射,增加混响效果。) Y  x) o1 H4 P2 l2 j* y8 hwww.audioapp.cn  audio app


5 s# ^5 F, h8 G# N下面是框图。下一章我们将会对这个原理一步步对应分析算法的实现。
; k1 G. Q2 c3 @5 i
  Z. R1 N, @# i8 f+ j: @. c5 N: b6 C. a) H  {8 M# B. fwww.audioapp.cn  audio app

t01be38825baa744671.jpg 8 [, B( S" g- u3 [www.audioapp.cn  audio app


8 B3 M" e' h) ]从梳状滤波器一直到最终的模型,进过很多人的努力。还是很不容易。
! W) l' _  @) ~# D$ c% ~) |4 d8 V! ~2 jwww.audioapp.cn  audio app

现在各个手机或者其他混响设备上用基本都是这种模型,当然有些软件它自己还会增加一些自己的eq,
6 W  Y3 C  [# T- @/ I
- H) L, H; b2 T5 ^我们最终看下界面结构,
6 T1 t6 D0 Q5 l8 X3 Z
) L" J# Z$ _0 x3 l如下:
. p; y- l" i3 S8 K t01b91d629573965cb8.jpg
4 C& e) w- n, ]3 w7 U% c  z# [0 U3 ?- y' V7 D' v9 C* cwww.audioapp.cn  audio app

app软件:! N8 q& u6 ]; \4 U% E2 M) D6 kwww.audioapp.cn  audio app

t013250291b7de90c19.jpg
; L7 m, z. u  J' O+ [
0 i" b4 _+ N1 `( Q' M; h8 u# ]各大软件如唱吧一般,不会直接给那么多参数给你调。考虑用户的体验,一般会给出一些选项。什么大厅,礼堂,演唱会等等。6 M( }; i" }$ X/ Qwww.audioapp.cn  audio app

! C0 t8 R9 `; O! @& Qwww.audioapp.cn  audio app

声音或者Audiacity展示。3 C5 T' B3 z) j/ Awww.audioapp.cn  audio app

- o5 p( c* ^8 F) D  Twww.audioapp.cn  audio app

t01934cdfe04c6586a9.jpg
4 e1 P  ]/ t+ R) D% C# E2 J3、算法的实现' W+ V2 T4 m* g5 V! Uwww.audioapp.cn  audio app

* _, c- N5 ~: i1 C2 qwww.audioapp.cn  audio app

了解了上面的原理后,算法的实现就变得简单易懂了。
' k+ v4 Q* {, V5 p- y5 O9 }* ~' B% `5 {) }2 y, k3 hwww.audioapp.cn  audio app

当然我们崇尚拿来主义sox; h. `1 E; _* y, {www.audioapp.cn  audio app

" Y* W/ z% h, g( T4 Qwww.audioapp.cn  audio app

混响算法,在诸多开源中都有实现,例如sox,freeverb,Tonic等等开源框架,都有。我们今天拿sox的进行分析。
; i2 r" i# `, v! M0 E+ Q, w. L$ l8 D7 Iwww.audioapp.cn  audio app

下载sox后直接在/src/reverb.c就可以看到完整的混响算法。我们根据上面讲的一部部分析。
: Q4 [2 t1 D5 m, ~) _& M5 U3 Q3 g8 R3 w& qwww.audioapp.cn  audio app

这个c文件和h文件很长,我们抽出需要的来看。
% K) ?6 u( i  U0 D* C4 Q4 S
3 Z' X8 ]3 s2 X! k梳状滤波
% @( I. I2 W' L) u
- @, I2 ~4 c% R& Q8 o. rstatic float comb_process(filter_t * p, /* gcc -O2 will inline this */ float const * input, float const * feedback, float const * hf_damping){ float output = *p->ptr; p->store = output + (p->store - output) * *hf_damping; *p->ptr = *input + p->store * *feedback; filter_advance(p); return output;}
* n4 ]" O/ u2 F$ k  }comb_process 函数就是梳状滤波器的结构,其实6 h" {/ P7 F" l; j; g$ j+ W7 Rwww.audioapp.cn  audio app

) @, W8 b1 g! `+ m* W0 \, Hwww.audioapp.cn  audio app

*p->ptr = *input + p->store * *feedback;
- h' C& c  a2 R: M! B- w! h( X! U3 K% U3 ]www.audioapp.cn  audio app

这个表达是就是:y[n] = ay[n - m] + x[n]; 而上面的一局话是一个标准的低通滤波器。& ]5 T; Y# d9 Q. ~, h  a1 Cwww.audioapp.cn  audio app

- t: s' U  I- F, G. o7 I8 M2 u5 V  Vwww.audioapp.cn  audio app

这个低通滤波器就moorer提出的需要对高频部分进行衰减。% U9 o" O1 R4 V- H( X+ i( gwww.audioapp.cn  audio app

+ E& ^, r5 v' J/ \+ Zwww.audioapp.cn  audio app

p->store = output + (p->store - output) * *hf_damping;
" |# O2 L$ \3 v3 |1 d" E" l
, ~1 U( s, F5 x& V' Yy[n] -gy[n] = (1-g)x[n]
3 Z0 ?; c% s1 X# o. r2 u; Z" q# f7 x; Hwww.audioapp.cn  audio app

并且如下在主函数中进行了 7 次的do while 并联。
% i8 H8 p' i/ o& \" w: Q9 C: E: K" E* I) Fwww.audioapp.cn  audio app

size_t i = array_length(comb_lengths) - 1; do out += comb_process(p->comb + i, &in, feedback, hf_damping); while (i--);9 q+ t5 Z1 \( |( pwww.audioapp.cn  audio app

全通滤波9 N) ~* [8 J: V6 h4 W* T2 zwww.audioapp.cn  audio app


( @* K! c# ^' s" ~% h4 ?4 S4 \8 Wstatic float allpass_process(filter_t * p, /* gcc -O2 will inline this */+ m! A. l7 j- q4 R( v4 n* swww.audioapp.cn  audio app

2 p: E. E# ~- P3 Z4 s. Mwww.audioapp.cn  audio app

float const * input)
/ m7 g( b; d  N7 K$ N/ d+ _' F8 t- f; g6 P9 s% uwww.audioapp.cn  audio app

{/ `0 h% ^# T7 Z# k  `www.audioapp.cn  audio app


/ |  I. j& i- u8 m1 J4 `5 ffloat output = *p->ptr;
8 K; A1 U+ F5 x3 l
$ m0 W, l& N- c( g# u*p->ptr = *input + output * .5;4 [3 @( m/ Q- d/ gwww.audioapp.cn  audio app

. e; m, S% ]0 V. Bwww.audioapp.cn  audio app

filter_advance(p);+ A* ]6 L2 D- Q% k& kwww.audioapp.cn  audio app


! z) ?( r" V  l0 r( {$ oreturn output - *input;( B3 F9 W1 [$ S2 ewww.audioapp.cn  audio app


) ?( o* a: n7 z  J3 d: f6 O}" j0 r& N, I2 X2 z7 f5 o1 A3 a+ h- ]www.audioapp.cn  audio app


0 C5 g* P* ]* Q  L  X8 S* F; J  Y' }- `allpass_process 就是上章描述的全通,而*p->ptr = *input + output * .5 和 output - *input;这句话并非标准的全通模型,其H(z)如下
+ ?2 X) w; B) v  _- R+ S2 m- J' T, A) C; I- iwww.audioapp.cn  audio app

差分方程如下
0 d) Q; A; |- e1 [5 Z0 ~
! U6 I" w. s7 A. \. W: Yy[n] = -x[n] + (1+g)x[n-m] + gy[n - m]
" p8 u" t' d% g8 p
6 Y, A3 ^1 w+ ^刚好对应这两句代码,另外allpass_process的input是指针形式它传进来的是后面自己return的内容,这样就形成了一个的输出给到下一个输入,形成moorer提出的嵌套。
$ @# W$ G$ d5 d( [! W, o! e! t- m  i
: s9 q% x5 A& s& w/ `代码如下
, X4 T4 m' v! S& k9 Y; M# ^
+ H: i0 P4 q% ^i = array_length(allpass_lengths) - 1; do out = allpass_process(p->allpass + i, &out); while (i--);+ y+ o+ v! t8 Z  i: Owww.audioapp.cn  audio app

早反射* r- G! d: U1 J% Q9 n/ U$ r3 Ywww.audioapp.cn  audio app


' b: v" L, p, {+ x) \根据moorer的说法,早反射对声音效果是很重要的,在sox中它使用fifo队列来组织数据流,当没有满足早反射时间时fifo填充的是0.代码如下
9 J1 m' ?4 w. q; y& t( Q
. q/ {$ K" V1 a% ^static void reverb_create(reverb_t * p, double sample_rate_Hz,
  ]" m  D1 {6 i5 t/ W/ C
) U1 }8 R- _5 ]9 s, R, v- \double pre_delay_ms,
4 f# N/ S' ^+ T3 M- {, ]5 k" O1 E7 F( i4 W' Z% Swww.audioapp.cn  audio app

float * * out)
' N) t/ A0 j# i2 J; }' s
" s. S' e6 a, }{
7 n2 X$ |, k# K# j  y) F7 ?1 ]2 n- W0 M! u+ _5 z& [1 |+ p- z7 Y5 Hwww.audioapp.cn  audio app

size_t i, delay = pre_delay_ms / 1000 * sample_rate_Hz + .5;$ [- c/ T- D! e5 t" Dwww.audioapp.cn  audio app

  p, ?; b2 H/ ]% c: ]' rwww.audioapp.cn  audio app

fifo_create(&p->input_fifo, sizeof(float));
. b  Q/ q1 d4 B3 q& O
' e7 U/ p* Y# `) A6 d$ rmemset(fifo_write(&p->input_fifo, delay, 0), 0, delay * sizeof(float));
: \7 e9 D' `3 }# c, w$ j
8 m* u/ q5 D7 n! _9 C8 }如上代码,将需要延迟的参数pre_delay_ms (单位ms),转换成采样个数,在给到fifo_write进行写0操作。
音频应用 Audio app
高级模式 自动排版
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

QQ|小黑屋|手机版|Archiver|音频应用 ( 鄂ICP备16002437号-6)

Powered by Audio app

快速回复 返回顶部 返回列表