<small id='VfBENZvb'></small> <noframes id='hmc9uyl'>

  • <tfoot id='1g20D'></tfoot>

      <legend id='rBvpI4UqN'><style id='YI4Q85in'><dir id='RAzGN'><q id='U0FV'></q></dir></style></legend>
      <i id='A9HQ'><tr id='m0w8zPU2gk'><dt id='y3hPsje'><q id='Bf4XrmEt'><span id='dqOFEi'><b id='OVx8IZ4fp'><form id='5u9TzYam'><ins id='h5iCa'></ins><ul id='TpLFv'></ul><sub id='cf54o'></sub></form><legend id='Zzuo'></legend><bdo id='UvQ4OGHeDu'><pre id='GHZfem'><center id='aLeVvdq0WZ'></center></pre></bdo></b><th id='ucXB'></th></span></q></dt></tr></i><div id='fABW'><tfoot id='plgzXWH8'></tfoot><dl id='V8U4vi0fJ'><fieldset id='hXwx'></fieldset></dl></div>

          <bdo id='AHTruLbX'></bdo><ul id='yjKJsCe'></ul>

          1. <li id='iWJtQGj1ba'></li>
            登陆

            一号站平台官网-混响算法以及原理

            admin 2019-06-21 201人围观 ,发现0个评论

            1.导言

            a、什么是混响

            混响首要用于唱卡拉OK,添加话筒声响的延时,发生适量的回声,使歌唱的声响更圆润更美丽,歌声不那么“干”。

            什么是回声?

            回声一号站平台官网-混响算法以及原理:在一个方向的推迟反射

            混响:在多个方向的屡次推迟反射

            b、混响算法的开展史

            l 硬件混响设备

            一般原理便是现场收集ir(impulse response) 如练声房,录音棚,音乐厅等

            l 软件混响

            开展到后期,由于数字信号处理的开展,和可编程门阵列芯片发生,就习气将提早收集好的ir经过算法做卷积运算。

            算法混响就此发生,后期又经过许多人员的尽力发生了房间声学的模仿算法。

            所以在软件混响里边,根本有两种一种是ir,另一种房间声学的模仿算法。

            咱们能看到的像freeverb3这两种都有,而sox等其他一般只看到后边一种。现在能看到的如下:

            回声类:echo ,echos

            ir类:model1 model2 model3

            schroeder类: 简易schroeder,杂乱schroeder,schroeder优化版moorer

            2、混响算法及推导

            a、调查房间声响的模型


            咱们看下上面的图,假定咱们在一个房间里,说话者和听者地点的空间声响应该是这个姿态的如图。听者听到的包括直达的信号外还有许多反射声响。这儿咱们重视两点一个是房间的巨细,别的一个是反射强度

            当假如这个房间非常大,那么根本上听不到反射。

            相同的道理,一个房子的原料会影响反射强度,如金属和木质两种不同原料做的房子,反射作用显然是不一样的。

            b、树立开始数学模型。

            假定说话者说出的信号是x[n]

            听者某时刻接收到的信号是y[n],那么y[n]包括那些内容呢?

            y[n] 应该是 x[n] + 反射1 + 反射2 .......


            反射怎样表明,它应该是x[n] 的延时咱们假定延时m ,难么反射1 应该是 x[n -m] ,可是咱们还应该考虑反射时的衰减,便是上面所说的房子的反射作用,假定是a,则反射1 应该表明成 x[n -m]*a;

            所以,y[n] = x[n] + a*x[n -m] + a^2*x[n - 2m] + a^3*x[n - 3m]......


            求和咱们简化下,运用差分或许z改变得到差分方程:

            y[n] = ay一号站平台官网-混响算法以及原理[n - m] + x[n];


            这是个梳妆滤波器

            它的频谱特性


            由此咱们就能够依据这个公式写出自己的算法。按道理这样应该就能够了,

            可是这个算法存在,回声密度比较低的问题会出现金属质感,听起来不舒服,不自然。

            c、对开始数学模型的优化-----全通

            怎样办呢?怎样去处理这种梳状滤波器带来的频谱不平整,和回声密度不行,一些做信号处理的专家立马想到了,运用全通体系去改进它。

            由于咱们知道全通体系,有很好的群延时,所以能够添加回声的密度。全通表达式如下:

            y[n] = -gx[n] + x[n-m] +gy[n-m];

            它的频谱特性


            它的起伏谱 和 相位谱

            他的零极点都是单位元对称的。

            频谱平整

            相位推迟

            d、对开始数学模型的优化-----Schroeder混合模型的提出

            这样添加了全通今后很多,可是仍是不行。这个时分有个叫Schroeder的人提出了一个很吊的计划。称之为Schroeder混响模型。

            这种模型得到很好的工业生产。

            e、对开始数学模型的再优化-----Moorer对Schroeder的优化

            可是总有更吊的人在后边。

            Moorer对Schroeder的混响提出三点点改进定见,

            榜首:需求考虑信号在空间传达高频衰减要素,参加低通滤波器使高频衰减

            第二:后边的全通应该嵌套运用,这样会有更好的群延时,

            第三:能够添加前级反应,构成早反射,添加混响作用。

            下面是框图。下一章咱们将会对这个原理一步步对应剖析算法的完成。


            从梳状滤波器一直到终究的模型,进过许多人的尽力。仍是很不简略。

            现在各个手机或许其他混响设备上用根本都是这种模一号站平台官网-混响算法以及原理型,当然有些软件它自己还会添加一些自己的eq,

            咱们终究看下界面结构,

            如下:


            app软件:

            各大软一号站平台官网-混响算法以及原理件如唱吧一般,不会直接给那么多参数给你调。考虑用户的体会,一般会给出一些选项。什么大厅,礼堂,演唱会等等。

            声响或许Audiacity展现。

            3、算法的完成

            了解了上面的原理后,算法的完成就变得简略易懂了。

            当然咱们崇尚拿来主义sox

            混响算法,在许多开源中都有完成,例如sox,freeverb,Tonic等等开源结构,都有。咱们今日拿sox的进行剖析。

            下载sox后直接在/src/reverb.c就能够看到完好的混响算法。咱们依据上面讲的一部部剖析。

            这个c文件和h文件很长,咱们抽出需求的来看。

            梳状滤波

            static float comb_process(filter_t * p, /* gcc -O2 will inline this */
            float const * input, float const * feedback, float const * hf_damping)
            {
            float out一号站平台官网-混响算法以及原理put = *p->ptr;
            p->store = output + (p->store - output) * *hf_damping;
            *p->ptr = *input + p->store * *feedback;
            filter_advance(p);
            return output;
            }

            comb_process 函数便是梳状滤波器的结构,其实

            *p->ptr = *input + p->store * *feedback;

            这个表达是便是y[n] = ay[n - m] + x[n]; 而上面的一局话是一个规范的低通滤波器。

            这个低通滤波器就moorer提出的需求对高频部分进行衰减。

            p->store = output + (p->store - output) * *hf_damping;

            y[n] -gy[n] = (1-g)x[n]

            而且如下在主函数中进行了 7 次的do while 并联。

             size_t i = array_length(comb_lengths) - 1;
            do out += comb_process(p->comb + i, &in, feedback, hf_damping);
            while (i--);

            全通滤波

            static float allpass_process(filter_t * p, /* gcc -O2 will inline this */

            float const * input)

            {

            float output = *p->ptr;

            *p->ptr = *input + output * .5;

            filter_advance(p);

            return output - *input;

            }

            allpass_process 便是上章描绘的全通,而*p->ptr = *input + output * .5 和 output - *input;这句话并非规范的全通模型,其H(z)如下


            差分方程如下

            y[n] = -x[n] + (1+g)x[n-m] + gy[n - m]一号站平台官网-混响算法以及原理

            刚好对应这两句代码,别的allpass_process的input是指针方式它传进来的是后边自己return的内容,这样就构成了一个的输出给到下一个输入,构成moorer提出的嵌套。

            代码如下

             i = array_length(allpass_lengths) - 1;
            do out = allpass_process(p->allpass + i, &out);
            while (i--);

            早反射

            依据moorer的说法,早反射对声响作用是很重要的,在sox中它运用fifo行列来安排数据流,当没有满意早反射时刻时fifo填充的是0.代码如下

            static void reverb_create(reverb_t * p, double sample_rate_Hz,

            .....

            double pre_delay_ms,

            .....

            float * * out)

            {

            size_t i, delay = pre_delay_ms / 1000 * sample_rate_Hz + .5;

            fifo_create(&p->input_fifo, sizeof(float));

            memset(fifo_write(&p->input_配音fifo, delay, 0), 0, delay * sizeof(float));

            如上代码,将需求推迟的参数pre_delay_ms (单位ms),转换成采样个数,在给到fifo_write进行写0操作。

            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP