3

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

4

5 回答 5

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;
}
于 2009-07-08T16:43:57.513 回答
2

看看这个:SoundFX,带有 actionscript 3 的开箱即用的音频过滤器

于 2009-07-09T06:23:02.673 回答
1

查看Andre Michelle 的实验室页面。他在 Flash 中使用 audo 做了很多工作……可能是最好的之一。我不确定参数 eq 是什么,但您应该能够在该页面上找到一些好的信息。

于 2009-07-08T16:26:28.937 回答
1

更新:我找到了一个使用 Flash 10 的 3 波段均衡器的示例。它使用的数学与提到的 CookieOfFortune 不同,但它有效(嗯,它确实有效)。使用它,我更新了 5 波段的示例并将其转换为在 Flex 中运行。您可以在 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

于 2009-08-10T03:34:47.067 回答
0

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

有一本关于数字滤波器的免费书籍,其中包含一些基本理论,但人们也可以在其中翻阅和提升公式。例如,快速阅读 Ch。19 列出了高通、低通和带通递归滤波器的简单公式,它们可能会起到作用,但如果你想变得更有趣,本书中还有很多其他滤波器。

于 2009-07-09T04:12:40.500 回答