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

Ter*_*taz 3 flash audio equalizer

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

Coo*_*une 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

一些关于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;
}
Run Code Online (Sandbox Code Playgroud)