创建Flash均衡器(修改输出声音)

时间:2009-07-08 16:18:39

标签: flash audio equalizer

嗨,它想知道它是否可以在闪存中创建一个“参数”均衡器。 不仅仅是通常的图形效果,还有一种修改通过应用程序的声音输出的工具。任何参考,提示的想法欢迎。 感谢

5 个答案:

答案 0 :(得分:6)

这不会非常容易......但这可能是一种方式:

var parameters:Array = [1,1,1,1,0.5]
var sound:Sound = new Sound();
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, filter); 
sound.load(soundURLRequest);
sound.play();

private function filter(event:SampleDataEvent):void
{
    var freqDomain:Array = FFT(event.data, parameters.length); // You will need to find a FFT(Fast Fourier Transform) function to generate an array. 
    for(var i:int = 0; i < freqDomain.length; i++)
    {
        freqDomain[i] = freqDomain[i] * parameters[i]; // This is where your EQ parameters get applied.
    }
    var timeDomain:Array = IFFT(freqDomain, event.data.length); // Inverse FFT

    for(value:Number in timeDomain) 
    {
        event.data.writeFloat(value);
    }
}

一些关于FFT和IFFT功能的FFT通常输出复数值(实数+复数分量),可以将其转换为幅度和相位分量。你真正需要的只是幅度,它有一个公式=(sqrt(real ^ 2 + complex ^ 2))。人耳对相位不敏感(与对相位非常敏感的眼睛相反),因此当您进行逆FFT时,可以插入随机或平坦的相位,差别不大。请注意,就过滤器实现而言,我的方法水平非常低。

这是一个傅里叶变换函数(虽然不是快速,它只是一个卷积(O(n ^ 2))与FFT O(nlogn))仅供参考(错误...它不在我的头顶,所以如果可能的话错误的常数):

// Note that this only returns the magnitude, I am discarding the phase.
function FFT(sample:Array, size):Array
{
    var frequencies = new Array(size);
    for(int i = 0; i < sample.size; i++)
    {
        for(int j = 0; i < frequencies.size; j++)
        {
            var real:Number = sample[i] * Math.cos(Math.PI/2 * i * j);
            var complex:Number = sample[i] * Math.sin(Math.PI/2 * i * j);
            frequencies[j] += Math.sqrt(real * real + complex * complex);
        }
    }
    return frequencies;
}

答案 1 :(得分:2)

答案 2 :(得分:1)

结帐Andre Michelle's labs page。他在Flash中使用audo做了很多工作......可能是最好的之一。我不确定参数eq是什么,但你应该能够在该页面上找到一些好的信息。

答案 3 :(得分:1)

更新:我找到了3-band equalizer using Flash 10的示例。它使用的不同于提到的CookieOfFortune,但它有效(好吧,确实如此)。使用它,我更新了5个波段的示例并将其转换为在Flex中运行。你可以see the code on GitHub

如果有人对如何运行数学有任何建议,我会非常乐意听到它。我在声音修改方面真的不太了解。


原帖: 我不确定这会有多大帮助,但这是一个权宜之计,可以在没有FFT等痛苦的情况下获得声音均衡器的效果。

http://www.webdesign.org/web/flash/tutorials/sound-equalizer.5020.html

基本上,您创建了几个版本的声音文件,每个版本都设置为预先设定的均衡器设置。然后,当用户调整低音或高音时,只需调整相应文件的音量。

您可能还会发现extract()函数对声音变量有帮助: http://livedocs.adobe.com/flex/3/langref/flash/media/Sound.html#extract

答案 4 :(得分:0)

可能一组digital filters是你最好的选择。与FFT不同,使用数字滤波器不需要将整个波形保存在存储器中,因为数字滤波器是因果关系,只是看过去和/或将来的几点。此外,如果您可以流式传输声音,您可以即时应用这些声音。简单的过滤器可以很容易地链接在一起,以制作更复杂的过滤器。

有一个free book on digital filters有一些基本理论,但也可以只翻页并提升公式。例如,快速阅读Ch。 19列出了高通,低通和带通递归滤波器的简单公式,这些公式可能会起到作用,但如果你想获得更好的功能,那么本书中还有很多其他的过滤器。