LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1863|回复: 6

Flanger音效处理

[复制链接]
发表于 2004-7-30 12:32:37 | 显示全部楼层 |阅读模式
介绍:
Flanger是一种能够将声音处理成带有风的呼啸感的处理效果。它是通过把原始的声音数据和延迟的声音数据混合之后实现的。同时这些延迟的声音数据的延迟时间是在一个特定的范围值之内按照特定的规律不断变化的。实际应用中,我们往往把输出端的数据再返回到输入端,进行反馈。这样可以让输出数据的效果更明显,更强烈。

信号流程图:
如图1

参数:
-------------------------------------------------------------------------------
参数说明    参数名称     单位  最小值  最大值 脚注
-------------------------------------------------------------------------------
最小延迟时间  MIN_DELAY_TIME 秒   0     ∞   ㈠
最大延迟时间  MAX_DELAY_TIME 秒   0     ∞   ㈠
延迟周期的时间 CYCLE_PERIOD  秒   >0    ∞   ㈡
声音的采样频率 SAMPLE_RATE  Hz   >0    ∞   ㈢
延迟衰减量   K           0      1   ㈣
反馈衰减量   F           0     <1    ㈤
原始输入衰减量 S           0     1    ㈥
-------------------------------------------------------------------------------
脚注:
㈠ 在Flanger处理过程中,延迟时间是一直变化着的。而且这种变化不是随机进行的。在一个延迟周期的时间(CYCLEPERIOD)内,延迟时间从最小值(MIN_DELAY_TIME)逐渐增加到最大值(MAX_DELAY_TIME)并且再次到返回最小值。
㈡ 这个值表示的是延迟时间改变的一个周期。在这段时间内,延迟时间从最小值增加到最大值,并且再次返回到最小值。
㈢ 在现实世界中,声音是一种模拟信号。但是如果我们想在数字世界中处理声音,我们就必须先把模拟信号转换成数字信号。采样频率就是,在一秒的时间内,我们从模拟数据中取得了多少次采样值。每采样一次,得到一个数据。所以,采样率越高,采样所得数据相对于被采样的模拟数据就越精确。对于CD音乐来说,采样率一般是44100Hz。
㈣ 延迟衰减量是用来对延迟的声音数据进行衰减的一个值。这个值一般不能大于1。从信号流程图可以看到,反馈数据的截取点在衰减单元之前,也就是说,反馈数据是没有进行过衰减的延迟数据。
㈤ 反馈衰减量式用来对反馈的声音数据进行衰减的一个值。反馈单元的功能就是把延迟的声音数据反馈回输入点并且和原始输入数据相加。用这种方法,输出数据可以变得更富有效果。但是请注意,此处的反馈属于负反馈,所以反馈衰减量必须小于1。否则输出数据将会越来越大,最终导致溢出。
㈥ 原始输入数据的衰减量。这个值一般不能大于1。

延迟时间变化示意图:
如图2

这个是延迟时间在一个延迟周期内变化的示意图。从图中我们可以发现,延迟时间在前半周期内从最小值变化到最大值,在后半周期内又从最大值变化回最小值。但是图中的变化是一种线性的变化。这个示意图表现的是模拟式Flanger的变化规律,对于数字式Flanger,我们也需要做相应的数字化调整。
这里先说明一下时间和采样数之间的关系。由于在数字式系统中,原本的模拟声音被采样成很多个采样点(SAMPLE)。所以时间的流逝可以用采样点的流逝来代替。这是数字式信号处理中比较基本的一点,希望好好理解。通过采样频率,我们可以换算出每个采样点代表的时间的长度,例如:采样频率为44100Hz,那么每一个采样点代表了1/44100≈0.000026757秒=0.026757毫秒。现在,回到Flanger上来,我们必须计算出对于每一个采样点,必须取得多少时间之前的延迟数据。做法就是,先把延迟周期(即时间)换算成采样数,然后把从最小延迟时间到最大延迟时间之间的差除以半个延迟周期的采样数。公式如下:

(MAX_DELAY_TIME - MIN_DELAY_TIME) / (CYCLE_PERIOD / 2 * 1 / SAMPLE_RATE) =>
2 * (MAX_DELAY_TIME - MIN_DELAY_TIME) / (CYCLE_PERIOD * SAMPLE_RATE)

得到的结果是每一个采样点应该增加或者减少多少采样时间。然后,我们还必须把这个时间变换成增加或者减少多少个采样点的延迟。这样才能真正取得延迟的数据。所以,请记住,在数字式系统中,我们必须时刻把时间和采样点联系起来,因为它们是同一个东西。
例如:对于当前采样点,经过计算,延迟时间是M秒,换算成采样点是N个采样点。那么我们就可以把当前采样点的N个采样点之前的数据取出来作为延迟,并且和当前输入数据(注意,不是当前采样点的数据,因为还要加上反馈值)合并,就可以得到输出数据了。

关于LFO:
之前讲的是延迟时间在延迟周期内从最小值变化成最大值,为了问题简单化,我们假设的是延迟时间的变化和采样点的增加呈一次函数关系。但是现实的Flanger效果往往是可以选择两者之间(延迟时间和采样点,即图中的Y轴和X轴)的变化关系的。很多时候可以选择正弦函数的关系来表示这种变化。我们把这种关系叫做LFO,即Low Frequecy Oscillator,因为这种变化关系往往用一个低频率振荡器来实现。选择不同的LFO,也是让Flanger效果有不同风格的一种方法。

转载请留个名字,谢谢配合。
 楼主| 发表于 2004-7-30 12:47:07 | 显示全部楼层

图1:信号流程图

转载请留名,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2004-7-30 12:48:32 | 显示全部楼层

图2:延迟时间变化示意图

转载请留名,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2004-7-30 13:21:07 | 显示全部楼层
这是一个什么概念呢?
软件?硬件?

如果是软件,具体代码呢?
如果是硬件,那实现的芯片级描述(vhdl)呢?如何配合PCM芯片?
 楼主| 发表于 2004-7-30 13:36:09 | 显示全部楼层
是原理,DSP音效处理的一种。属于数字信号处理的实际应用。代码我不贴了,看懂了的自然就懂了。看不懂贴了代码也没用。要看懂我写的东西,然后能自己写出代码,那么就是真正吃透了。以后我会贴出我写的别的原理分析。

我写这些东西的目的是看这里都是探讨嵌入式系统的OS,而很少探讨实际应用,所以才贴出来的。这些东西,和嵌入式Linux完全没关系。
发表于 2006-5-18 16:35:25 | 显示全部楼层
高手,太承拜了!
回复 支持 反对

使用道具 举报

发表于 2006-8-5 12:26:13 | 显示全部楼层
楼主能写个小软件吗?这个效果看上去不错呀!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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